Class: Eco::API::Common::People::Entries

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

Overview

Class meant to offer a collection of entries, normally used to get parsed input data.

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

Instance Method Summary collapse

Methods inherited from Language::Models::Collection

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

Constructor Details

#initialize(data = [], klass:, factory:) ⇒ Entries

Returns a new instance of Entries.



52
53
54
55
56
# File 'lib/eco/api/common/people/entries.rb', line 52

def initialize(data = [], klass:, factory:)
  super

  @caches_init = false
end

Instance Method Details

#[](id_or_ext) ⇒ Object



68
69
70
# File 'lib/eco/api/common/people/entries.rb', line 68

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

#each(&block) ⇒ Object

Override each to make it work with supervisor hiearchy



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

def each(&block)
  return to_enum(:each) unless block

  @items.each(&block)
end

#email_id_mapsObject



173
174
175
# File 'lib/eco/api/common/people/entries.rb', line 173

def email_id_maps
  email_present.group_by(:email).transform_values(&:id)
end

#entry(id: nil, external_id: nil, email: nil, strict: false) ⇒ Entry?

Note:

This is how the search function actually works:

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

Search function to find an entry based on one of different options It searches an entry 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:

  • (Entry, nil)

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

Raises:

  • MultipleSearchResults if there are multiple entries with the same email and there's no other criteria to find the entry. 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.



113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/eco/api/common/people/entries.rb', line 113

def entry(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

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

#exclude(object) ⇒ Object



145
146
147
# File 'lib/eco/api/common/people/entries.rb', line 145

def exclude(object)
  exclude_people(into_a(object))
end

#exclude_people(list) ⇒ Object



149
150
151
152
153
154
# File 'lib/eco/api/common/people/entries.rb', line 149

def exclude_people(list)
  discarded = list.map do |person|
    find(person)
  end.compact
  newFrom to_a - discarded
end

#export(filename) ⇒ Object

TODO: it should rather use the the people-to-csv case somehow Helper to dump the entries into a CSV

Parameters:

  • filename (String)

    the destination file



159
160
161
162
163
164
165
166
167
168
169
# File 'lib/eco/api/common/people/entries.rb', line 159

def export(filename)
  header = each_with_object([]) do |entry, hds|
    hds.push(*entry.internal_entry.keys).uniq!
  end
  CSV.open(filename, 'w') do |csv|
    csv << header
    each do |entry|
      csv << entry.internal_entry.values_at(*header)
    end
  end
end

#external_id(*args) ⇒ Object



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

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

#filter_tags_all(tags) ⇒ Object



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

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

#filter_tags_any(tags) ⇒ Object



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

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

#find(object, strict: false) ⇒ Object

Search function to find an entry based on one of different options see Eco::API::Common::People::Entries#entry



128
129
130
131
132
133
# File 'lib/eco/api/common/people/entries.rb', line 128

def find(object, strict: false)
  id          = attr_value(object, 'id')
  external_id = attr_value(object, 'external_id')
  email       = attr_value(object, 'email')
  entry(id: id, external_id: external_id, email: email, strict: strict)
end

#group_by_supervisorObject



177
178
179
# File 'lib/eco/api/common/people/entries.rb', line 177

def group_by_supervisor
  to_h(:supervisor_id)
end

#id(*args) ⇒ Object



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

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

#policy_group_ids_all(ids) ⇒ Object



87
88
89
# File 'lib/eco/api/common/people/entries.rb', line 87

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

#policy_group_ids_any(ids) ⇒ Object



83
84
85
# File 'lib/eco/api/common/people/entries.rb', line 83

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

#to_h(attr = 'id') ⇒ Object



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

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