class Eco::API::Organization::People
Public Class Methods
new(people = [], klass: Ecoportal::API::Internal::Person)
click to toggle source
Calls superclass method
Eco::Language::Models::Collection::new
# 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
Public Instance Methods
[](id_or_ext)
click to toggle source
# File lib/eco/api/organization/people.rb, line 64 def [](id_or_ext) id(id_or_ext) || external_id(id_or_ext) end
contacts()
click to toggle source
# File lib/eco/api/organization/people.rb, line 75 def contacts details_present(true) end
email_id_maps()
click to toggle source
@!group Groupping methods
# File lib/eco/api/organization/people.rb, line 205 def email_id_maps users.group_by(:email).transform_values { |person| person.id } end
exclude(object, strict: false)
click to toggle source
# File lib/eco/api/organization/people.rb, line 186 def exclude(object, strict: false) exclude_people(into_a(object), strict: strict) end
exclude!(object, strict: false)
click to toggle source
# File lib/eco/api/organization/people.rb, line 190 def exclude!(object, strict: false) self < exclude(object, strict: strict) end
exclude_people(list, strict: false)
click to toggle source
# File lib/eco/api/organization/people.rb, line 194 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)
click to toggle source
# File lib/eco/api/organization/people.rb, line 60 def external_id(*args) attr('external_id', *args).first end
find(object, strict: false)
click to toggle source
@see Eco::API::Organization::People#person
# File lib/eco/api/organization/people.rb, line 148 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_schema()
click to toggle source
# File lib/eco/api/organization/people.rb, line 213 def group_by_schema to_h do |person| person.details && person.details.schema_id end end
group_by_supervisor()
click to toggle source
# File lib/eco/api/organization/people.rb, line 209 def group_by_supervisor to_h(:supervisor_id) end
id(*args)
click to toggle source
@!group Main identifier helpers
# File lib/eco/api/organization/people.rb, line 56 def id(*args) attr('id', *args).first end
merge(data, strict: false, uniq: true)
click to toggle source
# File lib/eco/api/organization/people.rb, line 180 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_ids()
click to toggle source
# File lib/eco/api/organization/people.rb, line 92 def missing_supervisors_ids sup_ids = self.supervisor_ids sup_ids - (sup_ids & self.ids) end
newFrom(data)
click to toggle source
# File lib/eco/api/organization/people.rb, line 162 def newFrom(data) self.class.new(data, klass: @klass) end
non_users()
click to toggle source
# File lib/eco/api/organization/people.rb, line 79 def non_users account_present(false) end
person(id: nil, external_id: nil, email: nil, strict: false)
click to toggle source
It searches a person using the parameters given. @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
@raise 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.
@param id [String] the `internal id` of the person @param external_id
[String] the `exernal_id` of the person @param email [String] the `email` of the person @param strict [Boolean] if should perform a `:soft` or a `:strict` search. `strict` will avoid repeated email addresses. @return [Person, nil] the person we were searching, or `nil` if not found.
# File lib/eco/api/organization/people.rb, line 134 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)
click to toggle source
# File lib/eco/api/organization/people.rb, line 109 def policy_group_ids_all(ids) attr("policy_group_ids", tags, default_modifier.all.insensitive) end
policy_group_ids_any(ids)
click to toggle source
# File lib/eco/api/organization/people.rb, line 105 def policy_group_ids_any(ids) attr("policy_group_ids", tags, default_modifier.any.insensitive) end
similarity()
click to toggle source
@!group Helper methods
# File lib/eco/api/organization/people.rb, line 225 def similarity Eco::API::Organization::PeopleSimilarity.new(self.to_a) end
supervisors()
click to toggle source
# File lib/eco/api/organization/people.rb, line 83 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")
click to toggle source
Calls superclass method
Eco::Language::Models::Collection#to_h
# File lib/eco/api/organization/people.rb, line 219 def to_h(attr = "id") super(attr || "id") end
to_json()
click to toggle source
@!group Basic Collection Methods
# File lib/eco/api/organization/people.rb, line 158 def to_json to_a.to_json end
uniq(strict: false, include_unsearchable: false)
click to toggle source
# File lib/eco/api/organization/people.rb, line 166 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
users()
click to toggle source
@!group Special filters
# File lib/eco/api/organization/people.rb, line 71 def users account_present(true) end
Protected Instance Methods
on_change()
click to toggle source
@!endgroup
# File lib/eco/api/organization/people.rb, line 232 def on_change @caches_init = false end
Private Instance Methods
existing_users()
click to toggle source
# File lib/eco/api/organization/people.rb, line 269 def existing_users newFrom users.select {|u| !u.account_added?(:original)} end
init_caches()
click to toggle source
# File lib/eco/api/organization/people.rb, line 259 def init_caches return if @caches_init @by_id = no_nil_key(to_h) @by_external_id = no_nil_key(to_h('external_id')) @by_users_email = no_nil_key(existing_users.to_h('email')) @by_non_users_email = no_nil_key(non_users.to_h('email')) @by_email = no_nil_key(to_h('email')) @caches_init = true end
no_nil_key(hash)
click to toggle source
# File lib/eco/api/organization/people.rb, line 273 def no_nil_key(hash) hash.tap {|h| h.delete(nil)} end
person_by_email(email, prevent_duplicates: true)
click to toggle source
# File lib/eco/api/organization/people.rb, line 238 def person_by_email(email, prevent_duplicates: true) return nil unless email candidates = @by_non_users_email[email] || [] email_users = @by_users_email[email] || [] if pers = email_users.first return pers if candidates.empty? candidates = [pers] + candidates elsif candidates.length == 1 return candidates.first end if prevent_duplicates && !candidates.empty? msg = "Multiple search results match the criteria." raise MultipleSearchResults.new(msg, candidates: candidates, property: "email") end @by_external_id[email]&.first end