Module: Clicksign::JsonApi::AtomicResultsParser

Defined in:
lib/clicksign/json_api/atomic_results_parser.rb

Class Method Summary collapse

Class Method Details

.build_operation_result(slot:, index:, op:, envelope_id:) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/clicksign/json_api/atomic_results_parser.rb', line 25

def build_operation_result(slot:, index:, op:, envelope_id:)
  errors = slot['errors']
  requirement = build_requirement(slot['data'], envelope_id: envelope_id)

  Resources::Notarial::BulkRequirement::OperationResult.new(
    index: index,
    op: op,
    requirement: requirement,
    errors: errors,
    raw: slot,
  )
end

.build_requirement(data, envelope_id:) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/clicksign/json_api/atomic_results_parser.rb', line 38

def build_requirement(data, envelope_id:)
  return nil if data.nil? || data.empty?

  Resources::Notarial::Requirement.send(
    :build_instance,
    {
      'id' => data['id'],
      'type' => data['type'],
      'attributes' => data.fetch('attributes', {}),
      'relationships' => data.fetch('relationships', {}),
    },
    parent_id: envelope_id,
  )
end

.envelope_errors?(raw) ⇒ Boolean

Returns:

  • (Boolean)


21
22
23
# File 'lib/clicksign/json_api/atomic_results_parser.rb', line 21

def envelope_errors?(raw)
  raw.key?('errors') && !raw.key?('atomic:results')
end

.format_errors(errors) ⇒ Object



53
54
55
56
57
# File 'lib/clicksign/json_api/atomic_results_parser.rb', line 53

def format_errors(errors)
  return 'Validation failed' unless errors.is_a?(Array)

  errors.filter_map { |e| e['detail'] || e['title'] }.join(', ')
end

.parse(raw, envelope_id:, operations:) ⇒ Object

Raises:



8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/clicksign/json_api/atomic_results_parser.rb', line 8

def parse(raw, envelope_id:, operations:)
  raise ValidationError, format_errors(raw['errors']) if envelope_errors?(raw)

  Array(raw['atomic:results']).each_with_index.map do |slot, index|
    build_operation_result(
      slot: slot,
      index: index,
      op: operations.dig(index, 'op'),
      envelope_id: envelope_id,
    )
  end
end