Class: Eco::API::Organization::People

Inherits:
Language::Models::Collection show all
Defined in:
lib/eco/api/organization/people.rb

Direct Known Subclasses

PeopleSimilarity

Defined Under Namespace

Classes: MultipleSearchResults

Constant Summary

Constants inherited from Language::Models::Collection

Language::Models::Collection::BASIC_METHODS, Language::Models::Collection::EXTENDED_METHODS

Main identifier helpers collapse

Special filters collapse

Searchers collapse

Basic Collection Methods collapse

Groupping methods collapse

Helper methods collapse

Instance Method Summary collapse

Methods inherited from Language::Models::Collection

#<, #<<, #attr, #attr?, attr_collection, attr_presence, #attrs, attrs_create_method, #contains, #delete!, #each, #empty, #empty?, #group_by, #length, #new, #present, #present_all?, #present_some?, #remove, #to_c, #unique_attrs, #update

Constructor Details

#initialize(people = [], klass: Ecoportal::API::Internal::Person) ⇒ People

Returns a new instance of People.



48
49
50
51
52
# File 'lib/eco/api/organization/people.rb', line 48

def initialize(people = [], klass: Ecoportal::API::Internal::Person)
  @klass = Ecoportal::API::Internal::Person unless klass == Ecoportal::API::V1::Person
  super(people, klass: @klass)
  @caches_init = false
end

Instance Method Details

#[](id_or_ext) ⇒ Object



64
65
66
# File 'lib/eco/api/organization/people.rb', line 64

def [](id_or_ext)
  id(id_or_ext) || external_id(id_or_ext)
end

#contactsObject



75
76
77
# File 'lib/eco/api/organization/people.rb', line 75

def contacts
  details_present(true)
end

#email_id_mapsObject



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

def email_id_maps
  users.group_by(:email).transform_values { |person| person.id }
end

#exclude(object, strict: false) ⇒ Object



195
196
197
# File 'lib/eco/api/organization/people.rb', line 195

def exclude(object, strict: false)
  exclude_people(into_a(object), strict: strict)
end

#exclude!(object, strict: false) ⇒ Object



199
200
201
# File 'lib/eco/api/organization/people.rb', line 199

def exclude!(object, strict: false)
  self < exclude(object, strict: strict)
end

#exclude_people(list, strict: false) ⇒ Object



203
204
205
206
207
208
209
# File 'lib/eco/api/organization/people.rb', line 203

def exclude_people(list, strict: false)
  list.map do |person|
    find(person, strict: strict)
  end.compact.yield_self do |discarded|
    newFrom to_a - discarded
  end
end

#external_id(*args) ⇒ Object



60
61
62
# File 'lib/eco/api/organization/people.rb', line 60

def external_id(*args)
  attr('external_id', *args).first
end

#filter_tags_all(tags) ⇒ Object



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

def filter_tags_all(tags)
  attr("filter_tags", tags, default_modifier.all.insensitive)
end

#filter_tags_any(tags) ⇒ Object



106
107
108
# File 'lib/eco/api/organization/people.rb', line 106

def filter_tags_any(tags)
  attr("filter_tags", tags, default_modifier.any.insensitive)
end

#find(object, strict: false) ⇒ Object

See Also:



157
158
159
160
161
162
# File 'lib/eco/api/organization/people.rb', line 157

def find(object, strict: false)
  id          = attr_value(object, "id")
  external_id = attr_value(object, "external_id")
  email       = attr_value(object, "email")
  person(id: id, external_id: external_id, email: email, strict: strict)
end

#group_by_schemaObject



222
223
224
225
226
# File 'lib/eco/api/organization/people.rb', line 222

def group_by_schema
  to_h do |person|
    person.details && person.details.schema_id
  end
end

#group_by_supervisorObject



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

def group_by_supervisor
  to_h(:supervisor_id)
end

#id(*args) ⇒ Object



56
57
58
# File 'lib/eco/api/organization/people.rb', line 56

def id(*args)
  attr('id', *args).first
end

#merge(data, strict: false, uniq: true) ⇒ Object



189
190
191
192
193
# File 'lib/eco/api/organization/people.rb', line 189

def merge(data, strict: false, uniq: true)
  list = uniq ? exclude_people(data, strict: strict).to_a : to_a
  data = data.to_a unless data.is_a?(Array)
  newFrom list + data
end

#missing_supervisors_idsObject



101
102
103
104
# File 'lib/eco/api/organization/people.rb', line 101

def missing_supervisors_ids
  sup_ids = self.supervisor_ids
  sup_ids - (sup_ids & self.ids)
end

#newFrom(data) ⇒ Object



171
172
173
# File 'lib/eco/api/organization/people.rb', line 171

def newFrom(data)
  self.class.new(data, klass: @klass)
end

#non_usersObject



79
80
81
# File 'lib/eco/api/organization/people.rb', line 79

def non_users
  (false)
end

#person(id: nil, external_id: nil, email: nil, strict: false) ⇒ Person?

Note:

This is how the search function actually works:

  1. if eP id is given, returns the person (if found), otherwise...
  2. if external_id is given, returns the person (if found), otherwise...
  3. if strict is false and email is given:
    • if there is only 1 person with that email, returns that person, otherwise...
    • if found but, there are many candidates, it raises MultipleSearchResults error
    • if person external_id matches email, returns that person

It searches a person using the parameters given.

Parameters:

  • id (String) (defaults to: nil)

    the internal id of the person

  • external_id (String) (defaults to: nil)

    the exernal_id of the person

  • email (String) (defaults to: nil)

    the email of the person

  • strict (Boolean) (defaults to: false)

    if should perform a :soft or a :strict search. strict will avoid repeated email addresses.

Returns:

  • (Person, nil)

    the person we were searching, or nil if not found.

Raises:

  • MultipleSearchResults if there are multiple people with the same email and there's no other criteria to find the person. It only gets to this point if external_id was not provided and we are not in 'strict' search mode. However, it could be we were in strict mode and external_id was not provided.



143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/eco/api/organization/people.rb', line 143

def person(id: nil, external_id: nil, email: nil, strict: false)
  init_caches
  # normalize values
  ext_id   = !external_id.to_s.strip.empty? && external_id.strip
  email    = !email.to_s.strip.empty? && email.downcase.strip

  pers   = nil
  pers ||= @by_id[id]&.first
  pers ||= @by_external_id[ext_id]&.first
  pers ||= person_by_email(email) unless strict && ext_id
  pers
end

#policy_group_ids_all(ids) ⇒ Object



118
119
120
# File 'lib/eco/api/organization/people.rb', line 118

def policy_group_ids_all(ids)
  attr("policy_group_ids", tags, default_modifier.all.insensitive)
end

#policy_group_ids_any(ids) ⇒ Object



114
115
116
# File 'lib/eco/api/organization/people.rb', line 114

def policy_group_ids_any(ids)
  attr("policy_group_ids", tags, default_modifier.any.insensitive)
end

#similarityObject



234
235
236
# File 'lib/eco/api/organization/people.rb', line 234

def similarity
  Eco::API::Organization::PeopleSimilarity.new(self.to_a)
end

#supervisorsObject



92
93
94
95
96
97
98
99
# File 'lib/eco/api/organization/people.rb', line 92

def supervisors
  sup_ids = self.ids & self.supervisor_ids
  sup_ids.map do |id|
    person(id: id, strict: true)
  end.yield_self do |supervisors|
    newFrom supervisors
  end
end

#to_h(attr = "id") ⇒ Object



228
229
230
# File 'lib/eco/api/organization/people.rb', line 228

def to_h(attr = "id")
  super(attr || "id")
end

#to_jsonObject



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

def to_json
  to_a.to_json
end

#uniq(strict: false, include_unsearchable: false) ⇒ Object



175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/eco/api/organization/people.rb', line 175

def uniq(strict: false, include_unsearchable: false)
  unsearchable = []
  to_a.each_with_object([]) do |person, people|
    if found = find(person, strict: strict)
      people << found
    else
      unsearchable << person
    end
  end.yield_self do |found|
    found += unsearchable if include_unsearchable
    newFrom found
  end
end

#updated_or_createdObject

Returns the people that are being or have been updated and/or created.



84
85
86
87
88
89
90
# File 'lib/eco/api/organization/people.rb', line 84

def updated_or_created
  select do |person|
    !person.as_update(:total).empty?
  end.yield_self do |persons|
    newFrom persons
  end
end

#usersObject



71
72
73
# File 'lib/eco/api/organization/people.rb', line 71

def users
  (true)
end