global-registry-bindings 0.0.6 → 0.1.0
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/README.md +79 -35
- data/lib/global_registry_bindings/entity/entity_type_methods.rb +35 -33
- data/lib/global_registry_bindings/entity/mdm_methods.rb +9 -19
- data/lib/global_registry_bindings/entity/push_entity_methods.rb +31 -38
- data/lib/global_registry_bindings/entity/push_relationship_methods.rb +61 -47
- data/lib/global_registry_bindings/entity/relationship_type_methods.rb +48 -37
- data/lib/global_registry_bindings/exceptions.rb +1 -0
- data/lib/global_registry_bindings/global_registry_bindings.rb +129 -46
- data/lib/global_registry_bindings/{entity/delete_entity_methods.rb → model/delete_entity.rb} +5 -5
- data/lib/global_registry_bindings/model/entity.rb +64 -0
- data/lib/global_registry_bindings/model/pull_mdm.rb +23 -0
- data/lib/global_registry_bindings/model/push_entity.rb +21 -0
- data/lib/global_registry_bindings/model/push_relationship.rb +79 -0
- data/lib/global_registry_bindings/model/relationship.rb +68 -0
- data/lib/global_registry_bindings/options.rb +26 -59
- data/lib/global_registry_bindings/options/entity_class_options.rb +34 -0
- data/lib/global_registry_bindings/options/entity_instance_options.rb +90 -0
- data/lib/global_registry_bindings/options/entity_options_parser.rb +76 -0
- data/lib/global_registry_bindings/options/relationship_class_options.rb +37 -0
- data/lib/global_registry_bindings/options/relationship_instance_options.rb +131 -0
- data/lib/global_registry_bindings/options/relationship_options_parser.rb +98 -0
- data/lib/global_registry_bindings/railtie.rb +2 -1
- data/lib/global_registry_bindings/version.rb +1 -1
- data/lib/global_registry_bindings/worker.rb +25 -0
- data/lib/global_registry_bindings/workers/{delete_gr_entity_worker.rb → delete_entity_worker.rb} +1 -6
- data/lib/global_registry_bindings/workers/pull_mdm_id_worker.rb +12 -13
- data/lib/global_registry_bindings/workers/push_entity_worker.rb +24 -0
- data/lib/global_registry_bindings/workers/push_relationship_worker.rb +17 -7
- data/spec/acceptance/global_registry_bindings_spec.rb +50 -40
- data/spec/factories/factories.rb +24 -0
- data/spec/fixtures/get_entity_types_area.json +44 -0
- data/spec/fixtures/post_entities_community.json +8 -0
- data/spec/fixtures/post_relationship_types_fancy_org_area.json +16 -0
- data/spec/fixtures/put_entities_community_relationship.json +16 -0
- data/spec/fixtures/put_entities_fancy_org_area_relationship.json +8 -0
- data/spec/fixtures/put_entities_fancy_org_relationship.json +17 -0
- data/spec/fixtures/put_entities_person_country_relationship.json +23 -0
- data/spec/fixtures/put_entities_relationship_400.json +3 -0
- data/spec/fixtures/put_relationship_types_fields_fancy_org_area.json +25 -0
- data/spec/helpers/sidekiq_helpers.rb +14 -0
- data/spec/internal/app/models/address.rb +7 -2
- data/spec/internal/app/models/area.rb +7 -0
- data/spec/internal/app/models/assignment.rb +5 -4
- data/spec/internal/app/models/community.rb +19 -0
- data/spec/internal/app/models/country.rb +8 -0
- data/spec/internal/app/models/namespaced/person.rb +48 -2
- data/spec/internal/app/models/organization.rb +26 -3
- data/spec/internal/db/schema.rb +28 -0
- data/spec/internal/log/test.log +71023 -0
- data/spec/models/address_spec.rb +6 -204
- data/spec/models/assignment_spec.rb +40 -186
- data/spec/models/organization_spec.rb +106 -92
- data/spec/models/person_spec.rb +158 -214
- data/spec/models/user_edited_person_spec.rb +2 -2
- data/spec/spec_helper.rb +5 -6
- data/spec/workers/delete_gr_entity_worker_spec.rb +4 -4
- data/spec/workers/pull_mdm_id_worker_spec.rb +94 -32
- data/spec/workers/push_entity_worker_spec.rb +476 -0
- data/spec/workers/push_relationship_worker_spec.rb +344 -15
- metadata +45 -10
- data/lib/global_registry_bindings/entity/entity_methods.rb +0 -62
- data/lib/global_registry_bindings/options/class_options.rb +0 -62
- data/lib/global_registry_bindings/options/instance_options.rb +0 -63
- data/lib/global_registry_bindings/workers/push_gr_entity_worker.rb +0 -22
- data/spec/workers/push_gr_entity_worker_spec.rb +0 -27
data/spec/factories/factories.rb
CHANGED
@@ -9,6 +9,10 @@ FactoryGirl.define do
|
|
9
9
|
guid '98711710-acb5-4a41-ba51-e0fc56644b53'
|
10
10
|
global_registry_id nil
|
11
11
|
global_registry_mdm_id nil
|
12
|
+
country_of_service_id nil
|
13
|
+
country_of_service_gr_id nil
|
14
|
+
country_of_residence_id nil
|
15
|
+
country_of_residence_gr_id nil
|
12
16
|
end
|
13
17
|
|
14
18
|
factory :user_edited, class: Namespaced::Person::UserEdited do
|
@@ -33,6 +37,8 @@ FactoryGirl.define do
|
|
33
37
|
start_date { Time.zone.today }
|
34
38
|
parent_id nil
|
35
39
|
gr_id nil
|
40
|
+
area_id nil
|
41
|
+
global_registry_area_id nil
|
36
42
|
end
|
37
43
|
|
38
44
|
factory :assignment do
|
@@ -42,4 +48,22 @@ FactoryGirl.define do
|
|
42
48
|
organization_id nil
|
43
49
|
global_registry_id nil
|
44
50
|
end
|
51
|
+
|
52
|
+
factory :area do
|
53
|
+
area_name 'Best Area'
|
54
|
+
area_code 'BEST'
|
55
|
+
is_active true
|
56
|
+
end
|
57
|
+
|
58
|
+
factory :country do
|
59
|
+
global_registry_id nil
|
60
|
+
name 'Sokovia'
|
61
|
+
end
|
62
|
+
|
63
|
+
factory :community do
|
64
|
+
global_registry_id nil
|
65
|
+
infobase_gr_id nil
|
66
|
+
name 'Community'
|
67
|
+
infobase_id 1
|
68
|
+
end
|
45
69
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
{
|
2
|
+
"entity_types": [
|
3
|
+
{
|
4
|
+
"id": "548852c6-d55e-11e3-897f-12725f8f377c",
|
5
|
+
"name": "area",
|
6
|
+
"description": "Areas",
|
7
|
+
"data_visibility": "public",
|
8
|
+
"fields": [
|
9
|
+
{
|
10
|
+
"id": "428acf06-d6ab-11e3-ae81-12725f8f377c",
|
11
|
+
"name": "area_code",
|
12
|
+
"data_visibility": "public",
|
13
|
+
"field_type": "string",
|
14
|
+
"is_editable": true,
|
15
|
+
"unique_value": false
|
16
|
+
},
|
17
|
+
{
|
18
|
+
"id": "39b33954-d6ab-11e3-aa70-12725f8f377c",
|
19
|
+
"name": "area_name",
|
20
|
+
"data_visibility": "public",
|
21
|
+
"field_type": "string",
|
22
|
+
"is_editable": true,
|
23
|
+
"unique_value": false
|
24
|
+
},
|
25
|
+
{
|
26
|
+
"id": "4f12bd4c-d6ab-11e3-b0c9-12725f8f377c",
|
27
|
+
"name": "is_active",
|
28
|
+
"data_visibility": "public",
|
29
|
+
"field_type": "boolean",
|
30
|
+
"is_editable": true,
|
31
|
+
"unique_value": false
|
32
|
+
}
|
33
|
+
],
|
34
|
+
"is_editable": true,
|
35
|
+
"unique_value": false
|
36
|
+
}
|
37
|
+
],
|
38
|
+
"meta": {
|
39
|
+
"page": 1,
|
40
|
+
"next_page": false,
|
41
|
+
"from": 1,
|
42
|
+
"to": 1
|
43
|
+
}
|
44
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
{
|
2
|
+
"relationship_type": {
|
3
|
+
"id": "f03b947e-6644-11e7-93dd-129bd0521531",
|
4
|
+
"relationship_entity_type_id": "f03a929a-6644-11e7-93dd-129bd0521531",
|
5
|
+
"relationship1": {
|
6
|
+
"entity_type": "fancy_org",
|
7
|
+
"relationship_name": "fancy_org"
|
8
|
+
},
|
9
|
+
"relationship2": {
|
10
|
+
"entity_type": "area",
|
11
|
+
"relationship_name": "area"
|
12
|
+
},
|
13
|
+
"fields": [],
|
14
|
+
"is_editable": true
|
15
|
+
}
|
16
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
{
|
2
|
+
"entity": {
|
3
|
+
"community": {
|
4
|
+
"id": "6133f6fe-c63a-425a-bb46-68917c689723",
|
5
|
+
"ministry:relationship": [
|
6
|
+
{
|
7
|
+
"ministry": "41f767fd-86f4-42e2-8d24-cbc3f697b794",
|
8
|
+
"relationship_entity_id": "ee40f9ed-d625-405b-8ce6-aec821611ec6",
|
9
|
+
"client_integration_id": "1"
|
10
|
+
}
|
11
|
+
],
|
12
|
+
"client_integration_id": "1"
|
13
|
+
}
|
14
|
+
},
|
15
|
+
"meta": {}
|
16
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
{
|
2
|
+
"entity": {
|
3
|
+
"fancy_org": {
|
4
|
+
"id": "aebb4170-3f34-11e7-bba6-129bd0521531",
|
5
|
+
"area:relationship": [
|
6
|
+
{
|
7
|
+
"area": "0fdb70c5-f51e-4628-a1fe-caa37fae53cd",
|
8
|
+
"relationship_entity_id": "c99d7d7e-8b14-4fe6-9c11-e5359ee03637",
|
9
|
+
"client_integration_id": "1",
|
10
|
+
"priority": "High"
|
11
|
+
}
|
12
|
+
],
|
13
|
+
"client_integration_id": "1"
|
14
|
+
}
|
15
|
+
},
|
16
|
+
"meta": {}
|
17
|
+
}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
{
|
2
|
+
"entity": {
|
3
|
+
"person": {
|
4
|
+
"id": "2f0c62f1-5738-4860-88bd-5706fb801d7b",
|
5
|
+
"country:relationship": [
|
6
|
+
{
|
7
|
+
"country": "0f9089a3-2b93-4de8-9b81-92be0261f325",
|
8
|
+
"relationship_entity_id": "420d2fd1-7a73-41ed-9d8f-5dc79b00a688",
|
9
|
+
"client_integration_id": "cos_1",
|
10
|
+
"country_of_service": true
|
11
|
+
},
|
12
|
+
{
|
13
|
+
"country": "7cdaf399-d449-4008-8c6b-3c64a2b2730c",
|
14
|
+
"relationship_entity_id": "a4c030ce-13f2-44f5-8131-4003eb21c0ae",
|
15
|
+
"client_integration_id": "cor_1",
|
16
|
+
"country_of_residence": true
|
17
|
+
}
|
18
|
+
],
|
19
|
+
"client_integration_id": "1"
|
20
|
+
}
|
21
|
+
},
|
22
|
+
"meta": {}
|
23
|
+
}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
{
|
2
|
+
"relationship_type": {
|
3
|
+
"id": "f03b947e-6644-11e7-93dd-129bd0521531",
|
4
|
+
"relationship_entity_type_id": "f03a929a-6644-11e7-93dd-129bd0521531",
|
5
|
+
"relationship1": {
|
6
|
+
"entity_type": "fancy_org",
|
7
|
+
"relationship_name": "fancy_org"
|
8
|
+
},
|
9
|
+
"relationship2": {
|
10
|
+
"entity_type": "area",
|
11
|
+
"relationship_name": "area"
|
12
|
+
},
|
13
|
+
"fields": [
|
14
|
+
{
|
15
|
+
"id": "ac0bde52-6645-11e7-80e8-129bd0521531",
|
16
|
+
"name": "priority",
|
17
|
+
"data_visibility": "public",
|
18
|
+
"field_type": "string",
|
19
|
+
"is_editable": true,
|
20
|
+
"unique_value": false
|
21
|
+
}
|
22
|
+
],
|
23
|
+
"is_editable": true
|
24
|
+
}
|
25
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SidekiqHelpers
|
4
|
+
def clear_sidekiq_jobs_and_locks
|
5
|
+
# Drop sidekiq-unique-jobs locks
|
6
|
+
MOCK_REDIS.keys.each do |key|
|
7
|
+
MOCK_REDIS.del(key)
|
8
|
+
end
|
9
|
+
|
10
|
+
# Clear sidekiq queues and workers
|
11
|
+
Sidekiq::Queues.clear_all
|
12
|
+
Sidekiq::Worker.clear_all
|
13
|
+
end
|
14
|
+
end
|
@@ -1,11 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Address < ApplicationRecord
|
4
|
+
EXCLUDE_GR_FIELDS = %i[id created_at updated_at global_registry_id person_id address1].freeze
|
4
5
|
belongs_to :person, class_name: 'Namespaced::Person', inverse_of: :addresses
|
5
6
|
global_registry_bindings parent_association: :person,
|
6
|
-
exclude_fields:
|
7
|
-
extra_fields:
|
7
|
+
exclude_fields: proc { |_type, _model| EXCLUDE_GR_FIELDS },
|
8
|
+
extra_fields: :global_registry_extra_fields
|
8
9
|
|
9
10
|
alias_attribute :line1, :address1
|
10
11
|
alias_attribute :postal_code, :zip
|
12
|
+
|
13
|
+
def global_registry_extra_fields(_type)
|
14
|
+
{ line1: :string, line2: :string, postal_code: :string }
|
15
|
+
end
|
11
16
|
end
|
@@ -3,8 +3,9 @@
|
|
3
3
|
class Assignment < ApplicationRecord
|
4
4
|
belongs_to :person, class_name: 'Namespaced::Person'
|
5
5
|
belongs_to :organization
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
|
7
|
+
global_registry_bindings binding: :relationship,
|
8
|
+
type: :assignment,
|
9
|
+
primary_association: :person,
|
10
|
+
related_association: :organization
|
10
11
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Community < ApplicationRecord
|
4
|
+
global_registry_bindings ensure_entity_type: false,
|
5
|
+
exclude_fields: %i[infobase_id infobase_gr_id]
|
6
|
+
|
7
|
+
global_registry_bindings binding: :relationship,
|
8
|
+
type: :infobase_ministry,
|
9
|
+
id_column: :infobase_gr_id,
|
10
|
+
related_relationship_name: :ministry,
|
11
|
+
related_association_type: :ministry,
|
12
|
+
related_association_foreign_key: :infobase_id,
|
13
|
+
related_global_registry_id: :pull_infobase_global_registry_id,
|
14
|
+
ensure_relationship_type: false
|
15
|
+
|
16
|
+
def pull_infobase_global_registry_id(_type)
|
17
|
+
'41f767fd-86f4-42e2-8d24-cbc3f697b794'
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Country < ApplicationRecord
|
4
|
+
has_many :employees, class_name: 'Namespaced::Person', inverse_of: :country_of_service
|
5
|
+
has_many :residents, class_name: 'Namespaced::Person', inverse_of: :country_of_residence
|
6
|
+
|
7
|
+
global_registry_bindings ensure_entity_type: false
|
8
|
+
end
|
@@ -4,15 +4,61 @@ module Namespaced
|
|
4
4
|
class Person < ApplicationRecord
|
5
5
|
has_many :addresses, dependent: :destroy, inverse_of: :person
|
6
6
|
has_many :assignments
|
7
|
+
has_many :organizations, through: :assignments
|
8
|
+
belongs_to :country_of_service,
|
9
|
+
class_name: 'Country',
|
10
|
+
foreign_key: :country_of_service_id,
|
11
|
+
inverse_of: :employees
|
12
|
+
belongs_to :country_of_residence,
|
13
|
+
class_name: 'Country',
|
14
|
+
foreign_key: :country_of_residence_id,
|
15
|
+
inverse_of: :residents
|
7
16
|
|
8
|
-
global_registry_bindings
|
17
|
+
global_registry_bindings binding: :entity,
|
18
|
+
mdm_id_column: :global_registry_mdm_id,
|
9
19
|
mdm_timeout: 24.hours,
|
10
|
-
exclude_fields: %i[guid
|
20
|
+
exclude_fields: %i[guid country_of_service_gr_id country_of_service_id
|
21
|
+
country_of_residence_gr_id country_of_residence_id]
|
22
|
+
|
23
|
+
global_registry_bindings binding: :relationship,
|
24
|
+
type: :country_of_service,
|
25
|
+
id_column: :country_of_service_gr_id,
|
26
|
+
client_integration_id: ->(model) { "cos_#{model.id}" },
|
27
|
+
related_association: :country_of_service,
|
28
|
+
exclude_fields: :exclude_cos_fields,
|
29
|
+
extra_fields: :extra_cos_fields,
|
30
|
+
ensure_relationship_type: false
|
31
|
+
|
32
|
+
global_registry_bindings binding: :relationship,
|
33
|
+
type: :country_of_residence,
|
34
|
+
id_column: :country_of_residence_gr_id,
|
35
|
+
client_integration_id: ->(model) { "cor_#{model.id}" },
|
36
|
+
related_association: :country_of_residence,
|
37
|
+
ensure_relationship_type: false
|
11
38
|
|
12
39
|
def entity_attributes_to_push
|
13
40
|
entity_attributes = super
|
14
41
|
entity_attributes[:authentication] = { key_guid: guid }
|
15
42
|
entity_attributes
|
16
43
|
end
|
44
|
+
|
45
|
+
def exclude_cos_fields(_type)
|
46
|
+
%i[]
|
47
|
+
end
|
48
|
+
|
49
|
+
def extra_cos_fields(_type)
|
50
|
+
{}
|
51
|
+
end
|
52
|
+
|
53
|
+
def relationship_attributes_to_push(type)
|
54
|
+
entity_attributes = super(type)
|
55
|
+
case type
|
56
|
+
when :country_of_service
|
57
|
+
entity_attributes[:country_of_service] = true
|
58
|
+
when :country_of_residence
|
59
|
+
entity_attributes[:country_of_residence] = true
|
60
|
+
end
|
61
|
+
entity_attributes
|
62
|
+
end
|
17
63
|
end
|
18
64
|
end
|
@@ -5,8 +5,31 @@ class Organization < ApplicationRecord
|
|
5
5
|
belongs_to :parent, class_name: 'Organization'
|
6
6
|
|
7
7
|
has_many :assignments
|
8
|
+
has_many :people, class_name: 'Namespaced::Person', through: :assignments
|
9
|
+
|
10
|
+
belongs_to :area
|
11
|
+
|
8
12
|
global_registry_bindings id_column: :gr_id,
|
9
|
-
type: :fancy_org,
|
10
|
-
push_on: %i[create
|
11
|
-
parent_association: :parent
|
13
|
+
type: ->(_model) { :fancy_org },
|
14
|
+
push_on: %i[create destroy],
|
15
|
+
parent_association: :parent,
|
16
|
+
exclude_fields: :exclude_gr_fields,
|
17
|
+
extra_fields: proc { |_type, _model| {} }
|
18
|
+
|
19
|
+
global_registry_bindings binding: :relationship,
|
20
|
+
type: :area,
|
21
|
+
id_column: :global_registry_area_id,
|
22
|
+
related_association: :area,
|
23
|
+
exclude_fields: proc { |_type, _model| %i[] },
|
24
|
+
extra_fields: proc { |_type, _model| { priority: :string } }
|
25
|
+
|
26
|
+
def exclude_gr_fields(_type)
|
27
|
+
%i[id created_at updated_at gr_id parent_id area_id global_registry_area_id]
|
28
|
+
end
|
29
|
+
|
30
|
+
def relationship_attributes_to_push(type)
|
31
|
+
entity_attributes = super(type)
|
32
|
+
entity_attributes[:priority] = 'High' if type == :area
|
33
|
+
entity_attributes
|
34
|
+
end
|
12
35
|
end
|
data/spec/internal/db/schema.rb
CHANGED
@@ -9,6 +9,10 @@ ActiveRecord::Schema.define(version: 0) do
|
|
9
9
|
t.string :first_name
|
10
10
|
t.string :last_name
|
11
11
|
t.string :guid
|
12
|
+
t.references :country_of_service, index: true
|
13
|
+
t.references :country_of_residence, index: true
|
14
|
+
t.string :country_of_service_gr_id
|
15
|
+
t.string :country_of_residence_gr_id
|
12
16
|
t.timestamps
|
13
17
|
end
|
14
18
|
|
@@ -27,6 +31,8 @@ ActiveRecord::Schema.define(version: 0) do
|
|
27
31
|
t.text :description
|
28
32
|
t.date :start_date
|
29
33
|
t.references :parent, index: true
|
34
|
+
t.references :area, index: true
|
35
|
+
t.string :global_registry_area_id
|
30
36
|
t.timestamps
|
31
37
|
end
|
32
38
|
|
@@ -38,4 +44,26 @@ ActiveRecord::Schema.define(version: 0) do
|
|
38
44
|
t.references :organization, index: true
|
39
45
|
t.timestamps
|
40
46
|
end
|
47
|
+
|
48
|
+
create_table :areas, force: true do |t|
|
49
|
+
t.string :global_registry_id
|
50
|
+
t.string :area_name
|
51
|
+
t.string :area_code
|
52
|
+
t.boolean :is_active
|
53
|
+
t.timestamps
|
54
|
+
end
|
55
|
+
|
56
|
+
create_table :countries, force: true do |t|
|
57
|
+
t.string :name
|
58
|
+
t.string :global_registry_id
|
59
|
+
t.timestamps
|
60
|
+
end
|
61
|
+
|
62
|
+
create_table :communities, force: true do |t|
|
63
|
+
t.string :name
|
64
|
+
t.string :global_registry_id
|
65
|
+
t.integer :infobase_id
|
66
|
+
t.string :infobase_gr_id
|
67
|
+
t.timestamps
|
68
|
+
end
|
41
69
|
end
|