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
filter_tags_all(tags) click to toggle source
# File lib/eco/api/organization/people.rb, line 101
def filter_tags_all(tags)
  attr("filter_tags", tags, default_modifier.all.insensitive)
end
filter_tags_any(tags) click to toggle source
# File lib/eco/api/organization/people.rb, line 97
def filter_tags_any(tags)
  attr("filter_tags", tags, default_modifier.any.insensitive)
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