eco-helpers 1.5.13 → 2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +71 -0
  3. data/eco-helpers.gemspec +31 -29
  4. data/lib/eco/api.rb +1 -1
  5. data/lib/eco/api/common/class_helpers.rb +45 -1
  6. data/lib/eco/api/common/loaders/error_handler.rb +2 -0
  7. data/lib/eco/api/common/loaders/parser.rb +4 -0
  8. data/lib/eco/api/common/loaders/use_case.rb +2 -0
  9. data/lib/eco/api/common/people/person_entry.rb +15 -3
  10. data/lib/eco/api/common/people/person_parser.rb +10 -3
  11. data/lib/eco/api/common/session/logger.rb +9 -1
  12. data/lib/eco/api/common/session/logger/cache.rb +91 -0
  13. data/lib/eco/api/common/session/logger/log.rb +48 -0
  14. data/lib/eco/api/common/version_patches/ecoportal_api/external_person.rb +9 -0
  15. data/lib/eco/api/microcases/people_cache.rb +7 -0
  16. data/lib/eco/api/microcases/people_load.rb +29 -21
  17. data/lib/eco/api/microcases/people_refresh.rb +6 -0
  18. data/lib/eco/api/microcases/people_search.rb +33 -8
  19. data/lib/eco/api/policies.rb +1 -0
  20. data/lib/eco/api/policies/default_policies.rb +12 -0
  21. data/lib/eco/api/policies/default_policies/99_user_access_policy.rb +88 -0
  22. data/lib/eco/api/session.rb +13 -0
  23. data/lib/eco/api/session/batch.rb +0 -3
  24. data/lib/eco/api/session/batch/job.rb +17 -7
  25. data/lib/eco/api/session/config/workflow.rb +1 -0
  26. data/lib/eco/api/usecases.rb +1 -0
  27. data/lib/eco/api/usecases/ooze_samples.rb +11 -0
  28. data/lib/eco/api/usecases/ooze_samples/ooze_update_case.rb +131 -0
  29. data/lib/eco/version.rb +1 -1
  30. metadata +42 -47
  31. data/lib/eco/api/usecases/backup/append_usergroups_case.rb +0 -36
  32. data/lib/eco/api/usecases/backup/create_case.rb +0 -104
  33. data/lib/eco/api/usecases/backup/create_details_case.rb +0 -31
  34. data/lib/eco/api/usecases/backup/create_details_with_supervisor_case.rb +0 -48
  35. data/lib/eco/api/usecases/backup/hris_case.rb +0 -124
  36. data/lib/eco/api/usecases/backup/set_default_tag_case.rb +0 -49
  37. data/lib/eco/api/usecases/backup/set_supervisor_case.rb +0 -41
  38. data/lib/eco/api/usecases/backup/transfer_account_case.rb +0 -90
  39. data/lib/eco/api/usecases/backup/update_case.rb +0 -112
  40. data/lib/eco/api/usecases/backup/update_details_case.rb +0 -64
  41. data/lib/eco/api/usecases/backup/upsert_case.rb +0 -114
@@ -1,48 +0,0 @@
1
- module Eco
2
- module API
3
- class UseCases
4
- class DefaultCases
5
- class CreateDetailsWithSupervisorCase < DefaultCase
6
-
7
- def process
8
- # good candidate to do @cases.case("create-details").use.chain(@cases.case("set-supervisor").use)
9
- @cases.define("create-details-with-supervisor", type: :sync) do |entries, people, session, options, usecase|
10
- creation = session.job_group("main").new("create", usecase: usecase, type: :create, sets: [:core, :details])
11
- supers = session.job_group("post").new("supers", usecase: usecase, type: :update, sets: :core)
12
-
13
- strict_search = session.config.people.strict_search? && (!options[:search]&.key?(:strict) || options.dig(:search, :strict))
14
-
15
- entries.each.with_index do |entry, i|
16
- if person = people.find(entry, strict: strict_search)
17
- session.logger.error("This person (id: '#{person.id}') already exists: #{entry.to_s(:identify)}")
18
- else
19
- person = session.new_person
20
- entry.set_core(person, exclude: "supervisor_id")
21
- entry.set_details(person)
22
-
23
- creation.add(person)
24
-
25
- # set supervisor
26
- if !(sup_id = entry.supervisor_id)
27
- person.supervisor_id = nil
28
- else
29
- if supervisor = people.person(id: sup_id, external_id: sup_id, email: sup_id)
30
- person.supervisor_id = supervisor.id
31
- else
32
- # delay setting supervisor if does not exit
33
- supers.add(person) do |person|
34
- person.supervisor_id = sup_id
35
- end
36
- end
37
- end
38
-
39
- end
40
- end
41
- end
42
- end
43
-
44
- end
45
- end
46
- end
47
- end
48
- end
@@ -1,124 +0,0 @@
1
- module Eco
2
- module API
3
- class UseCases
4
- class DefaultCases
5
- class HrisCase < DefaultCase
6
-
7
- def process
8
- @cases.define("hris", type: :sync) do |entries, people, session, options, usecase|
9
- creation = session.job_group("main").new("create", usecase: usecase, type: :create, sets: [:core, :details, :account])
10
- update = session.job_group("main").new("update", usecase: usecase, type: :update, sets: [:core, :details, :account])
11
- supers = session.job_group("post").new("supers", usecase: usecase, type: :update, sets: :core)
12
- leavers = session.job_group("post").new("leavers", usecase: usecase, type: :update, sets: :account)
13
-
14
- strict_search = session.config.people.strict_search? && (!options[:search]&.key?(:strict) || options.dig(:search, :strict))
15
- pgs = session.policy_groups
16
-
17
- people.each_with_index do |person, i|
18
- if !entries.find(person, strict: strict_search)
19
- leavers.add(person) do |person|
20
- person.supervisor_id = nil
21
- person.account = nil if person.account
22
- end
23
- end
24
- end
25
-
26
-
27
- if session.config.people.default_usergroup?
28
- def_id = pgs.to_id(session.config.people.default_usergroup)
29
- end
30
-
31
- entries.each_with_index do |entry, i|
32
- person = people.find(entry, strict: strict_search)
33
- person = session.new_person if create = !person
34
-
35
- unless options.dig(:exclude, :core) && !create
36
- ini_tags = person.filter_tags || []
37
-
38
- core_attrs = ["name", "external_id", "email", "filter_tags"]
39
- core_excluded = core_attrs.map.select {|attr| options.dig(:exclude, attr.to_sym)}
40
- core_excluded.push("supervisor_id")
41
-
42
- entry.set_core(person, exclude: core_excluded)
43
- if session.tagtree && !options.dig(:exclude, :filter_tags)
44
- person.filter_tags = session.tagtree.user_tags(
45
- initial: ini_tags,
46
- final: person.filter_tags,
47
- preserve_custom: true,
48
- add_custom: true
49
- )
50
- end
51
- end
52
-
53
- entry.set_details(person) unless options.dig(:exclude, :details)
54
-
55
- unless options.dig(:exclude, :account)
56
- add_account = !person.account
57
- ini_pg_ids = person.account&.policy_group_ids || []
58
-
59
- account_excluded = []
60
- account_excluded.push("policy_group_ids") if options.dig(:exclude, :policy_groups) && !create
61
-
62
- entry.set_account(person, exclude: account_excluded)
63
-
64
- person.account.send_invites = options[:send_invites] if options.key?(:send_invites)
65
-
66
- unless options.dig(:exclude, :policy_groups) && !create
67
- end_pg_ids = person.account.policy_group_ids || []
68
-
69
- if add_account && def_id && !entry.policy_group_ids?
70
- # on account creation, if missing policy_group_ids column in the input
71
- # use default_usergroup, if it's defined
72
- end_pg_ids = [def_id]
73
- end
74
-
75
- # avoid false updates by preserving the original order
76
- person.account.policy_group_ids = pgs.user_pg_ids(
77
- initial: ini_pg_ids,
78
- final: end_pg_ids
79
- )
80
- end
81
-
82
- person.account.permissions_custom = session.new_preset(person) unless !create && options.dig(:exclude, :abilities)
83
-
84
- unless options.dig(:exclude, :filter_tags) || entry.default_tag?
85
- if session.tagtree
86
- person.account.default_tag = session.tagtree.default_tag(*person.filter_tags)
87
- else
88
- tags = person.filter_tags || []
89
- person.account.default_tag = tags.first unless tags.length > 1
90
- end
91
- end
92
- end
93
-
94
- creation.add(person) if create
95
- update.add(person) unless create
96
-
97
- # set supervisor
98
- unless options.dig(:exclude, :core) || options.dig(:exclude, :supervisor)
99
- if !(sup_id = entry.supervisor_id)
100
- person.supervisor_id = nil
101
- else
102
- if supervisor = people.person(id: sup_id, external_id: sup_id, email: sup_id)
103
- person.supervisor_id = supervisor.id
104
- else
105
- # delay setting supervisor if does not exit
106
- supers.add(person) do |person|
107
- person.supervisor_id = sup_id
108
- end
109
- end
110
- end
111
- end
112
-
113
- end
114
-
115
- end
116
-
117
-
118
- end
119
-
120
- end
121
- end
122
- end
123
- end
124
- end
@@ -1,49 +0,0 @@
1
- module Eco
2
- module API
3
- class UseCases
4
- class DefaultCases
5
- class SetDefaultTagCase < DefaultCase
6
- # take the deepest tag (the one that is further down in the tree)
7
- # different options (several nodes at the same depth):
8
- # => take the common node between them (i.e. you have Hamilton and Auckland -> take New Zealand)
9
- # => if there's no common node between them, take the `first` (unless they are at top level of the tree)
10
-
11
- def process
12
- @cases.define("set-default-tag", type: :transform) do |people, session, options, usecase|
13
- if !session.tagtree
14
- msg = "There is no tagtree definition in the configuration files\n" +
15
- "For this usecase to work out you need to define it."
16
- session.logger.fatal(msg)
17
- raise msg
18
- end
19
-
20
- # IMPORTANT: this two lines ensure that only people to be updated is selected
21
- all_people = people
22
- people = people.account_present
23
-
24
- if people.length <= 0
25
- msg = "There are no people with account... aborting script"
26
- session.logger.info(msg)
27
- raise msg
28
- end
29
-
30
- update = session.job_group("main").new("update", usecase: usecase, type: :update, sets: :account)
31
-
32
- people.each_with_index do |person, i|
33
- if session.tagtree
34
- person.account.default_tag = session.tagtree.default_tag(*person.filter_tags)
35
- else
36
- tags = person.filter_tags || []
37
- person.account.default_tag = tags.first unless tags.length > 1
38
- end
39
- update.add(person)
40
- end
41
-
42
- end
43
- end
44
-
45
- end
46
- end
47
- end
48
- end
49
- end
@@ -1,41 +0,0 @@
1
- module Eco
2
- module API
3
- class UseCases
4
- class DefaultCases
5
- class SetSupervisorCase < DefaultCase
6
-
7
- def process
8
- @cases.define("set-supervisor", type: :sync) do |entries, people, session, options, usecase|
9
- job = session.job_group("main").new("update", usecase: usecase, type: :update, sets: :core)
10
-
11
- strict_search = session.config.people.strict_search? && (!options[:search]&.key?(:strict) || options.dig(:search, :strict))
12
-
13
- entries.each.with_index do |entry, i|
14
- person = people.find(entry, strict: strict_search)
15
-
16
- if !person
17
- session.logger.error("This person does not exist: #{entry.to_s(:identify)}")
18
- else
19
- sup_id = entry.supervisor_id
20
- supervisor = people.person(id: sup_id, external_id: sup_id, email: sup_id)
21
-
22
- if !supervisor
23
- if entry.supervisor_id
24
- msg = "Entry(#{i}) - supervisor id #{entry.supervisor_id} does not exist for person: #{entry.to_s(:identify)}"
25
- session.logger.warn(msg)
26
- end
27
- else
28
- # set internal id of the supervisor (detect if actually changed)
29
- person.supervisor_id = supervisor.id
30
- job.add(person)
31
- end
32
- end
33
- end
34
- end
35
- end
36
-
37
- end
38
- end
39
- end
40
- end
41
- end
@@ -1,90 +0,0 @@
1
- module Eco
2
- module API
3
- class UseCases
4
- class DefaultCases
5
- class TransferAccountCase < DefaultCase
6
-
7
- def process
8
- @cases.define("transfer-account", type: :sync) do |entries, people, session, options, usecase|
9
- remove_account = session.job_group("main").new("remove account", usecase: usecase, type: :update, sets: :account)
10
- add_account = session.job_group("post").new("add account", usecase: usecase, type: :update, sets: :account)
11
-
12
- strict_search = session.config.people.strict_search? && (!options[:search]&.key?(:strict) || options.dig(:search, :strict))
13
-
14
- done = []; pending = []
15
- pairs = entries.each_with_object([]) do |source|
16
- entry_hash = source.internal_entry
17
- unless entry_hash.key?("destination-id")
18
- session.logger.error("You haven't defined a column 'destination-id' to whom the account should be transferred")
19
- exit(1)
20
- end
21
- if peer_id = entry_hash["destination-id"]
22
- if peer = entries.entry(id: peer_id, external_id: peer_id)
23
- if done.include?(peer)
24
- session.logger.error("You paired '#{peer_id}' twice. A person can only receive account from 1 user")
25
- exit(1)
26
- end
27
- pending.delete(source)
28
- pending.delete(peer)
29
- done.push(source).push(pair)
30
- [source, peer]
31
- else
32
- pending.push(source)
33
- nil
34
- end
35
- else
36
- pending.push(source)
37
- end
38
- end.compact
39
-
40
- # Data input integrity check
41
- unless pending.empty?
42
- msg = "You haven't defined a pair for the following ids:"
43
- msg += pending.each_with_object("") do |entry, str|
44
- str << "\n#{entry.id || entry.external_id}"
45
- end
46
- session.logger.error(msg)
47
- exit(1)
48
- end
49
-
50
- pairs.each do |pair|
51
- src_entry, dst_entry = pair
52
- unless src_person = people.find(src_entry, strict: strict_search)
53
- session.logger.error("This person does not exist: #{src_entry.to_s(:identify)}")
54
- exit(1)
55
- end
56
-
57
- unless dst_person = people.find(dst_entry, strict: strict_search)
58
- session.logger.error("This person does not exist: #{dst_person.to_s(:identify)}")
59
- exit(1)
60
- end
61
-
62
- unless account_doc = src_person.account&.doc
63
- session.logger.error("You are trying to move account from a person that doesn't have: #{src_person.id | src_person.external_id}")
64
- exit(1)
65
- end
66
-
67
- if dst_person.email.to_s.strip.empty?
68
- session.logger.error("A person you are trying to add account doesn't have email: #{dst_person.id | dst_person.external_id}")
69
- exit(1)
70
- end
71
-
72
- src_person.account = nil
73
- remove_account.add(src_person)
74
- add_account.add(dst_person) do |person|
75
- # only if we got to remove the account of the original person
76
- if account_doc && src_person.as_update == {}
77
- person.account = account_doc
78
- end
79
- end
80
-
81
- end
82
-
83
- end
84
- end
85
-
86
- end
87
- end
88
- end
89
- end
90
- end
@@ -1,112 +0,0 @@
1
- module Eco
2
- module API
3
- class UseCases
4
- class DefaultCases
5
- class UpdateCase < DefaultCase
6
-
7
- def process
8
- @cases.define("update", type: :sync) do |entries, people, session, options, usecase|
9
- update = session.job_group("main").new("update", usecase: usecase, type: :update, sets: [:core, :details, :account])
10
- supers = session.job_group("post").new("supers", usecase: usecase, type: :update, sets: :core)
11
-
12
- strict_search = session.config.people.strict_search? && (!options[:search]&.key?(:strict) || options.dig(:search, :strict))
13
- pgs = session.policy_groups
14
-
15
- if session.config.people.default_usergroup?
16
- def_id = pgs.to_id(session.config.people.default_usergroup)
17
- end
18
-
19
- entries.each.with_index do |entry, i|
20
- if person = people.find(entry, strict: strict_search)
21
-
22
- unless options.dig(:exclude, :core)
23
- ini_tags = person.filter_tags || []
24
-
25
- core_attrs = ["name", "external_id", "email", "filter_tags"]
26
- core_excluded = core_attrs.map.select {|attr| options.dig(:exclude, attr.to_sym)}
27
- core_excluded.push("supervisor_id")
28
-
29
- entry.set_core(person, exclude: core_excluded)
30
-
31
- if session.tagtree && !options.dig(:exclude, :filter_tags)
32
- person.filter_tags = session.tagtree.user_tags(
33
- initial: ini_tags,
34
- final: person.filter_tags,
35
- preserve_custom: true,
36
- add_custom: true
37
- )
38
- end
39
- end
40
-
41
- entry.set_details(person) unless options.dig(:exclude, :details)
42
-
43
- unless options.dig(:exclude, :account)
44
- add_account = !person.account
45
- ini_pg_ids = person.account&.policy_group_ids || []
46
-
47
- account_excluded = []
48
- account_excluded.push("policy_group_ids") if options.dig(:exclude, :policy_groups)
49
-
50
- entry.set_account(person, exclude: account_excluded)
51
-
52
- person.account.send_invites = options[:send_invites] if options.key?(:send_invites)
53
-
54
- unless options.dig(:exclude, :policy_groups) && !create
55
- end_pg_ids = person.account.policy_group_ids || []
56
-
57
- if add_account && def_id && !entry.policy_group_ids?
58
- # on account creation, if missing policy_group_ids column in the input
59
- # use default_usergroup, if it's defined
60
- end_pg_ids = [def_id]
61
- end
62
-
63
- # avoid false updates by preserving the original order
64
- person.account.policy_group_ids = pgs.user_pg_ids(
65
- initial: ini_pg_ids,
66
- final: end_pg_ids
67
- )
68
- end
69
-
70
- person.account.permissions_custom = session.new_preset(person) unless options.dig(:exclude, :abilities)
71
-
72
- unless options.dig(:exclude, :filter_tags) || entry.default_tag?
73
- if session.tagtree
74
- person.account.default_tag = session.tagtree.default_tag(*person.filter_tags)
75
- else
76
- tags = person.filter_tags || []
77
- person.account.default_tag = tags.first unless tags.length > 1
78
- end
79
- end
80
-
81
- end
82
- update.add(person)
83
-
84
- # set supervisor
85
- unless options.dig(:exclude, :core) || options.dig(:exclude, :supervisor)
86
- if !(sup_id = entry.supervisor_id)
87
- person.supervisor_id = nil
88
- else
89
- if supervisor = people.person(id: sup_id, external_id: sup_id, email: sup_id)
90
- person.supervisor_id = supervisor.id
91
- else
92
- # delay setting supervisor if does not exit
93
- supers.add(person) do |person|
94
- person.supervisor_id = sup_id
95
- end
96
- end
97
- end
98
- end
99
-
100
- else
101
- session.logger.error("This person does not exist: #{entry.to_s(:identify)}")
102
- end
103
- end
104
- end
105
-
106
- end
107
-
108
- end
109
- end
110
- end
111
- end
112
- end