Class: Eco::API::Common::People::PersonEntry

Inherits:
Object
  • Object
show all
Includes:
Language::AuxiliarLogger
Defined in:
lib/eco/api/common/people/person_entry.rb

Constant Summary collapse

DEBUG =
false
BOOLEAN_ATTRS =
%w[
  freemium accept_eula archived
].freeze
MULTI_ATTRS =
%w[
  policy_group_ids filter_tags login_provider_ids starred_ids
].freeze
NUMERIC_ATTRS =
%w[
  subordinates
].freeze

Instance Attribute Summary

Attributes included from Language::AuxiliarLogger

#logger

Instance Method Summary collapse

Methods included from Language::AuxiliarLogger

#log

Constructor Details

#initialize(data, person_parser:, attr_map:, dependencies: {}, logger: ::Logger.new(IO::NULL)) ⇒ PersonEntry

Note:
  • if data is a Person object, its behaviour is serialise.
  • if data is not a Person object, it does a parse.
  • currently in rework, so there may be subtle differences that make it temporarily unstable (yet it is reliable).

This class is meant to provide a common interface to access entries of source data that come in different formats.

Parameters:

  • data (Hash, Ecoportal::API::V1::Person)

    Person object to be serialized or hashed entry (CSV::Row is accepted).

  • person_parser (Common::People::PersonParser)

    parser/serializer of person attributes (it contains a set of attribute parsers).

  • attr_map (Eco::Data::Mapper)

    mapper to translate attribute names from external to internal names and vice versa.

  • dependencies (Hash) (defaults to: {})

    hash where keys are internal attribute names. It is mostly used to deliver final dependencies to attribute parsers/serializers.

  • logger (Common::Session::Logger, ::Logger) (defaults to: ::Logger.new(IO::NULL))

    object to managelogs.



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/eco/api/common/people/person_entry.rb', line 36

def initialize(data, person_parser:, attr_map:, dependencies: {}, logger: ::Logger.new(IO::NULL))
  msg = "Constructor needs a PersonParser. Given: #{person_parser.class}"
  raise msg unless person_parser.is_a?(Eco::API::Common::People::PersonParser)

  msg = "Expecting Mapper object. Given: #{attr_map.class}"
  raise msg if attr_map && !attr_map.is_a?(Eco::Data::Mapper)

  @source        = data
  @person_parser = person_parser
  @deps          = dependencies
  @logger        = logger
  @attr_map      = attr_map
  @emap          = PersonEntryAttributeMapper.new(
    @source,
    person_parser: @person_parser,
    attr_map:      @attr_map,
    logger:        @logger
  )

  if parsing?
    @external_entry     = __external_entry(data)
    @mapped_entry       = __mapped_entry(@external_entry)
    @internal_entry     = __internal_entry(@mapped_entry)
    @final_entry        = __final_entry(@internal_entry)
  else  # SERIALIZING
    @person             = data
    @final_entry        = __final_entry(@person)
    @internal_entry     = __internal_entry(@final_entry)
    @mapped_entry       = __mapped_entry(@internal_entry)
    @external_entry     = __external_entry(@mapped_entry)
  end

  (print_models; exit(1)) if DEBUG # rubocop:disable Style/Semicolon
end

Instance Method Details

#archivedObject



163
164
165
# File 'lib/eco/api/common/people/person_entry.rb', line 163

def archived
  final_entry['archived']
end

#archived_flag?Boolean

Returns:

  • (Boolean)


167
168
169
# File 'lib/eco/api/common/people/person_entry.rb', line 167

def archived_flag?
  final_entry.key?('archived')
end

#contractor_organization_idObject



210
211
212
# File 'lib/eco/api/common/people/person_entry.rb', line 210

def contractor_organization_id
  final_entry['contractor_organization_id']
end

#contractor_organization_id?Boolean

Returns:

  • (Boolean)


214
215
216
# File 'lib/eco/api/common/people/person_entry.rb', line 214

def contractor_organization_id?
  final_entry.key?('contractor_organization_id')
end

#default_tagObject



230
231
232
# File 'lib/eco/api/common/people/person_entry.rb', line 230

def default_tag
  final_entry['default_tag']
end

#default_tag?Boolean

Returns:

  • (Boolean)


226
227
228
# File 'lib/eco/api/common/people/person_entry.rb', line 226

def default_tag?
  final_entry.key?('default_tag')
end

#emailString?

Returns the email of this person if defined.

Returns:

  • (String, nil)

    the email of this person if defined.



181
182
183
# File 'lib/eco/api/common/people/person_entry.rb', line 181

def email
  final_entry['email']
end

#email?Boolean

Returns:

  • (Boolean)


185
186
187
# File 'lib/eco/api/common/people/person_entry.rb', line 185

def email?
  final_entry.key?('email')
end

#entry(phase = :external) ⇒ Hash

Returns the data as of at that parsing stage.

Returns:

  • (Hash)

    the data as of at that parsing stage.



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/eco/api/common/people/person_entry.rb', line 84

def entry(phase = :external)
  phase = phase.to_sym

  case phase
  when :external
    external_entry
  when :mapped
    mapped_entry
  when :internal
    internal_entry
  when :final
    final_entry
  else
    raise ArgumentError, "Unknown phase '#{phase}'"
  end
end

#external_entryHash

Note:

completely serialized entry.

Returns entry Hash with external attribute names, and values and types thereof.

Returns:

  • (Hash)

    entry Hash with external attribute names, and values and types thereof.



103
104
105
# File 'lib/eco/api/common/people/person_entry.rb', line 103

def external_entry # rubocop:disable Style/TrivialAccessors
  @external_entry
end

#external_idString?

Returns the external id of this person if defined.

Returns:

  • (String, nil)

    the external id of this person if defined.



155
156
157
# File 'lib/eco/api/common/people/person_entry.rb', line 155

def external_id
  final_entry['external_id']
end

#external_id?Boolean

Returns:

  • (Boolean)


159
160
161
# File 'lib/eco/api/common/people/person_entry.rb', line 159

def external_id?
  final_entry.key?('external_id')
end

#filter_tagsObject



202
203
204
# File 'lib/eco/api/common/people/person_entry.rb', line 202

def filter_tags
  final_entry['filter_tags'] || []
end

#filter_tags?Boolean

Returns:

  • (Boolean)


206
207
208
# File 'lib/eco/api/common/people/person_entry.rb', line 206

def filter_tags?
  final_entry.key?('filter_tags')
end

#final_entryHash

Note:

values ready to be set to a person.

Returns entry Hash with internal attribute names, values and types.

Returns:

  • (Hash)

    entry Hash with internal attribute names, values and types.



123
124
125
# File 'lib/eco/api/common/people/person_entry.rb', line 123

def final_entry # rubocop:disable Style/TrivialAccessors
  @final_entry
end

#idString?

Returns the internal id of this person if defined.

Returns:

  • (String, nil)

    the internal id of this person if defined.



146
147
148
# File 'lib/eco/api/common/people/person_entry.rb', line 146

def id
  final_entry['id']
end

#id?Boolean

Returns:

  • (Boolean)


150
151
152
# File 'lib/eco/api/common/people/person_entry.rb', line 150

def id?
  final_entry.key?('id')
end

#identifyString

Provides a reference to this person entry.

Returns:

  • (String)

    string summary of this person identity.



236
237
238
239
240
241
242
# File 'lib/eco/api/common/people/person_entry.rb', line 236

def identify
  str_id = id ? "id: '#{id}'; " : ''
  str  = "(row: #{idx}) '#{name}' "
  str << "(#{str_id}ext_id: '#{external_id}'; "
  str << "email: '#{email}')"
  str
end

#idxInteger

Note:

Eco::API::Common::People::EntryFactory#entries adds this idx (i.e. row number)

Returns the entry number in the input file.

Returns:

  • (Integer)

    the entry number in the input file



141
142
143
# File 'lib/eco/api/common/people/person_entry.rb', line 141

def idx
  final_entry['idx']
end

#internal_entryHash

Note:

just one step away from being completely parsed (only types parsing pending).

Returns entry Hash with internal attribute names and values, but external types.

Returns:

  • (Hash)

    entry Hash with internal attribute names and values, but external types.



110
111
112
# File 'lib/eco/api/common/people/person_entry.rb', line 110

def internal_entry # rubocop:disable Style/TrivialAccessors
  @internal_entry
end

#mapped_entryHash

Note:

at this stage, only the header names have been converted/transformed.

Returns entry Hash with internal attribute names, but external types and values.

Returns:

  • (Hash)

    entry Hash with internal attribute names, but external types and values.



117
118
119
# File 'lib/eco/api/common/people/person_entry.rb', line 117

def mapped_entry # rubocop:disable Style/TrivialAccessors
  @mapped_entry
end

#nameString?

Returns the name of this person if defined.

Returns:

  • (String, nil)

    the name of this person if defined.



172
173
174
# File 'lib/eco/api/common/people/person_entry.rb', line 172

def name
  final_entry['name']
end

#name?Boolean

Returns:

  • (Boolean)


176
177
178
# File 'lib/eco/api/common/people/person_entry.rb', line 176

def name?
  final_entry.key?('name')
end

#new(data) ⇒ PersonEntry

Generates a new entry

Returns:



73
74
75
76
77
78
79
80
81
# File 'lib/eco/api/common/people/person_entry.rb', line 73

def new(data)
  self.class.new(
    data,
    person_parser: @person_parser,
    attr_map:      @attr_map,
    dependencies:  @deps,
    logger:        @logger
  )
end

#parsing?Boolean

To know if currently the object is in parse or serialize mode.

Returns:

  • (Boolean)

    returns true if we are parsing, false otherwise.



129
130
131
# File 'lib/eco/api/common/people/person_entry.rb', line 129

def parsing?
  !@source.is_a?(Ecoportal::API::Internal::Person)
end

#policy_group_idsObject



218
219
220
# File 'lib/eco/api/common/people/person_entry.rb', line 218

def policy_group_ids
  final_entry['policy_group_ids'] || []
end

#policy_group_ids?Boolean

Returns:

  • (Boolean)


222
223
224
# File 'lib/eco/api/common/people/person_entry.rb', line 222

def policy_group_ids?
  final_entry.key?('policy_group_ids')
end

#serializing?Boolean

To know if currently the object is in parse or serialize mode.

Returns:

  • (Boolean)

    returns true if we are serializing, false otherwise.



135
136
137
# File 'lib/eco/api/common/people/person_entry.rb', line 135

def serializing?
  !parsing?
end

#set_account(person, exclude: nil) ⇒ Object

Note:

it only sets those account properties defined in the entry. Meaning that if an account property is not present in the entry, this will not be set on the target person.

Setter to fill in the account properties of the Person that are present in the Entry.

Parameters:

  • person (Ecoportal::API::Internal::Person)

    the person we want to set the account values to.

  • exclude (String, Array<String>) (defaults to: nil)

    account properties that should not be set/changed to the person.



281
282
283
284
285
286
287
288
# File 'lib/eco/api/common/people/person_entry.rb', line 281

def (person, exclude: nil)
  person. = {} unless person.
  scoped_attrs = @emap.(@final_entry) - into_a(exclude)

  @final_entry.slice(*scoped_attrs).each do |attr, value|
    set_part(person., attr, value)
  end
end

#set_core(person, exclude: nil) ⇒ Object

Note:
  1. it only sets those core properties defined in the entry. Meaning that if an core property is not present in the entry, this will not be set on the target person.
  2. if there's an incorrect email exception, it blanks the email and logs a warning message

Setter to fill in all the core properties of the Person that are present in the Entry.

Parameters:

  • person (Ecoportal::API::V1::Person)

    the person we want to set the core values to.

  • exclude (String, Array<String>) (defaults to: nil)

    core attributes that should not be set/changed to the person.



262
263
264
265
266
267
268
269
270
271
272
273
274
# File 'lib/eco/api/common/people/person_entry.rb', line 262

def set_core(person, exclude: nil)
  scoped_attrs  = @emap.core_attrs(@final_entry) - into_a(exclude)
  scoped_attrs -= ['id']

  @final_entry.slice(*scoped_attrs).each do |attr, value|
    set_part(person, attr, value)
  rescue StandardError => e
    raise unless attr == 'email'

    log(:error) { "#{e} - setting blank email instead." }
    set_part(person, attr, nil)
  end
end

#set_details(person, exclude: nil) ⇒ Object

Note:

it only sets those details properties defined in the entry. Meaning that if an details property is not present in the entry, this will not be set on the target person.

TO DO: use person.details.schema_id to switch @emap and @person_parser (or just crash if they don't match?) Setter to fill in all the schema details fields of the Person that are present in the Entry.

Parameters:

  • person (Ecoportal::API::V1::Person)

    the person we want to set the schema fields' values to.

  • exclude (String, Array<String>) (defaults to: nil)

    schema field attributes that should not be set/changed to the person.



296
297
298
299
300
301
302
303
304
305
# File 'lib/eco/api/common/people/person_entry.rb', line 296

def set_details(person, exclude: nil)
  person.add_details(@person_parser.schema) if !person.details || !person.details.schema_id
  scoped_attrs = @emap.details_attrs(@final_entry) - into_a(exclude)

  @final_entry.slice(
    *scoped_attrs
  ).each do |attr, value|
    set_part(person.details, attr, value)
  end
end

#supervisor_idString?

Returns the supervisor id of this person if defined.

Returns:

  • (String, nil)

    the supervisor id of this person if defined.



190
191
192
# File 'lib/eco/api/common/people/person_entry.rb', line 190

def supervisor_id
  final_entry['supervisor_id']
end

#supervisor_id=(value) ⇒ Object



194
195
196
# File 'lib/eco/api/common/people/person_entry.rb', line 194

def supervisor_id=(value)
  final_entry['supervisor_id'] = value
end

#supervisor_id?Boolean

Returns:

  • (Boolean)


198
199
200
# File 'lib/eco/api/common/people/person_entry.rb', line 198

def supervisor_id?
  final_entry.key?('supervisor_id')
end

#to_s(options) ⇒ String

Provides a reference of this person entry.

Returns:

  • (String)

    string summary of this person identity.



246
247
248
249
250
251
252
253
# File 'lib/eco/api/common/people/person_entry.rb', line 246

def to_s(options)
  options = into_a(options)
  return identify if options.include?(:identify)

  final_entry.each.map do |k, v|
    "'#{k}': '#{v.to_json}'"
  end.join(' | ')
end