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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +71 -0
- data/eco-helpers.gemspec +31 -29
- data/lib/eco/api.rb +1 -1
- data/lib/eco/api/common/class_helpers.rb +45 -1
- data/lib/eco/api/common/loaders/error_handler.rb +2 -0
- data/lib/eco/api/common/loaders/parser.rb +4 -0
- data/lib/eco/api/common/loaders/use_case.rb +2 -0
- data/lib/eco/api/common/people/person_entry.rb +15 -3
- data/lib/eco/api/common/people/person_parser.rb +10 -3
- data/lib/eco/api/common/session/logger.rb +9 -1
- data/lib/eco/api/common/session/logger/cache.rb +91 -0
- data/lib/eco/api/common/session/logger/log.rb +48 -0
- data/lib/eco/api/common/version_patches/ecoportal_api/external_person.rb +9 -0
- data/lib/eco/api/microcases/people_cache.rb +7 -0
- data/lib/eco/api/microcases/people_load.rb +29 -21
- data/lib/eco/api/microcases/people_refresh.rb +6 -0
- data/lib/eco/api/microcases/people_search.rb +33 -8
- data/lib/eco/api/policies.rb +1 -0
- data/lib/eco/api/policies/default_policies.rb +12 -0
- data/lib/eco/api/policies/default_policies/99_user_access_policy.rb +88 -0
- data/lib/eco/api/session.rb +13 -0
- data/lib/eco/api/session/batch.rb +0 -3
- data/lib/eco/api/session/batch/job.rb +17 -7
- data/lib/eco/api/session/config/workflow.rb +1 -0
- data/lib/eco/api/usecases.rb +1 -0
- data/lib/eco/api/usecases/ooze_samples.rb +11 -0
- data/lib/eco/api/usecases/ooze_samples/ooze_update_case.rb +131 -0
- data/lib/eco/version.rb +1 -1
- metadata +42 -47
- data/lib/eco/api/usecases/backup/append_usergroups_case.rb +0 -36
- data/lib/eco/api/usecases/backup/create_case.rb +0 -104
- data/lib/eco/api/usecases/backup/create_details_case.rb +0 -31
- data/lib/eco/api/usecases/backup/create_details_with_supervisor_case.rb +0 -48
- data/lib/eco/api/usecases/backup/hris_case.rb +0 -124
- data/lib/eco/api/usecases/backup/set_default_tag_case.rb +0 -49
- data/lib/eco/api/usecases/backup/set_supervisor_case.rb +0 -41
- data/lib/eco/api/usecases/backup/transfer_account_case.rb +0 -90
- data/lib/eco/api/usecases/backup/update_case.rb +0 -112
- data/lib/eco/api/usecases/backup/update_details_case.rb +0 -64
- 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
|