Class: Usps::Imis::Mapper

Inherits:
Object
  • Object
show all
Defined in:
lib/usps/imis/mapper.rb

Overview

Specific known fields mapping to facilitate updating across multiple business objects.

Constant Summary collapse

FIELD_MAPPING =

List of known mapped fields

{
  grade: %w[ABC_ASC_Individual_Demog Grade],
  edpro: %w[ABC_ASC_Individual_Demog Educ_Proficiency],
  edach: %w[ABC_ASC_Individual_Demog Educ_Achievement],
  vessel_examiner: %w[ABC_ASC_Individual_Demog Vol_Vessel_Examiner],
  mm: %w[ABC_ASC_Individual_Demog TotMMS],
  mm_updated: %w[ABC_ASC_Individual_Demog MMS_Updated]
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(api = nil, imis_id: nil) ⇒ Mapper

A new instance of Mapper



30
31
32
33
34
# File 'lib/usps/imis/mapper.rb', line 30

def initialize(api = nil, imis_id: nil)
  @api = api || Api.new
  @api.imis_id = imis_id if imis_id
  @logger ||= Imis.logger('Mapper')
end

Instance Attribute Details

#apiObject (readonly)

The parent Api object



22
23
24
# File 'lib/usps/imis/mapper.rb', line 22

def api
  @api
end

#loggerObject (readonly)

Tagged logger



26
27
28
# File 'lib/usps/imis/mapper.rb', line 26

def logger
  @logger
end

Instance Method Details

#get_field(field_key) ⇒ Object Also known as: fetch, []

Get a member’s data for a specific field by arbitrary field name

Does not require knowing which business object / iMIS-specific field name to use

Only available for fields defined in FIELD_MAPPING

Parameters:

  • field_key (Symbol)

    Internal name of the field

Returns:

  • Value of the field



46
47
48
49
50
51
# File 'lib/usps/imis/mapper.rb', line 46

def get_field(field_key)
  missing_mapping!(field_key) unless FIELD_MAPPING.key?(field_key.to_sym)

  business_object_name, field = FIELD_MAPPING[field_key]
  api.on(business_object_name)[field]
end

#get_fields(*fields) ⇒ Array Also known as: fetch_all

Get specific fields by arbitrary field names

Parameters:

  • names (Array<String>)

    Internal name of the fields

Returns:

  • (Array)

    Values of the field



61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/usps/imis/mapper.rb', line 61

def get_fields(*fields)
  business_objects = {}

  fields.map do |field_key|
    business_object_name, field = FIELD_MAPPING[field_key.to_sym]

    business_objects[business_object_name] ||= []
    business_objects[business_object_name] << field
  end

  business_objects.flat_map do |business_object_name, fields|
    api.on(business_object_name).get_fields(*fields)
  end
end

#instance_variables_to_inspectObject

Ruby 3.5 instance variable filter



115
# File 'lib/usps/imis/mapper.rb', line 115

def instance_variables_to_inspect = instance_variables - i[@api @logger]

#put_field(field_key, value) ⇒ Object Also known as: []=

Update a member’s data for a specific field by arbitrary field name

Does not require knowing which business object / iMIS-specific field name to use

Only available for fields defined in FIELD_MAPPING

Parameters:

  • field_key (Symbol)

    Internal name of the field

Returns:

  • Value of the field



87
# File 'lib/usps/imis/mapper.rb', line 87

def put_field(field_key, value) = update(field_key => value)

#update(data) ⇒ Array<Usps::Imis::Data>

Update a member’s data on multiple affected business objects by arbitrary field names

Does not require knowing which business object / iMIS-specific field name to use

Only available for fields defined in FIELD_MAPPING

Parameters:

  • data (Hash)

    Conforms to pattern { field_key => value }

Returns:

  • (Array<Usps::Imis::Data>)

    Response data from the API for each internal update request



100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/usps/imis/mapper.rb', line 100

def update(data)
  updates = data.each_with_object({}) do |(field_key, value), hash|
    map_update(field_key) do |business_object_name, field|
      hash[business_object_name] ||= {}
      hash[business_object_name][field] = value
    end
  end

  updates.map do |business_object_name, field_updates|
    api.on(business_object_name).put_fields(field_updates)
  end
end