global-registry-bindings 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +12 -4
- data/lib/global_registry_bindings/entity/push_relationship_methods.rb +53 -29
- data/lib/global_registry_bindings/entity/relationship_type_methods.rb +17 -8
- data/lib/global_registry_bindings/global_registry_bindings.rb +21 -14
- data/lib/global_registry_bindings/model/entity.rb +13 -9
- data/lib/global_registry_bindings/model/push_relationship.rb +6 -0
- data/lib/global_registry_bindings/model/relationship.rb +12 -10
- data/lib/global_registry_bindings/options/entity_class_options.rb +4 -0
- data/lib/global_registry_bindings/options/entity_instance_options.rb +1 -0
- data/lib/global_registry_bindings/options/entity_options_parser.rb +1 -0
- data/lib/global_registry_bindings/options/relationship_class_options.rb +9 -0
- data/lib/global_registry_bindings/options/relationship_instance_options.rb +16 -6
- data/lib/global_registry_bindings/options/relationship_options_parser.rb +5 -5
- data/lib/global_registry_bindings/version.rb +1 -1
- data/lib/global_registry_bindings/workers/push_relationship_worker.rb +2 -2
- data/spec/acceptance/global_registry_bindings_spec.rb +11 -9
- data/spec/factories/factories.rb +2 -0
- data/spec/fixtures/get_entity_types_fancy_org_assignment.json +35 -0
- data/spec/fixtures/post_relationship_types_assigned_by.json +16 -0
- data/spec/fixtures/put_entities_fancy_org_assignment_assigned_by.json +20 -0
- data/spec/internal/app/models/area.rb +2 -1
- data/spec/internal/app/models/assignment.rb +12 -2
- data/spec/internal/app/models/community.rb +2 -1
- data/spec/internal/app/models/namespaced/person.rb +6 -2
- data/spec/internal/app/models/organization.rb +3 -1
- data/spec/internal/db/schema.rb +2 -0
- data/spec/internal/log/test.log +28818 -0
- data/spec/workers/push_relationship_worker_spec.rb +133 -33
- metadata +10 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fefecc675882ff5a75b69de5c5e928b41ca696e4
|
4
|
+
data.tar.gz: 70c7dfd4708fbb01c3824f4ad6b29cc31c5335ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a80c913940d88cdf05b151c75a5fbe4bf09ad41441274c9a1672c8087b42c9ffc4fe67f46fbde9859359c10745d401b32272bfbad2f1a7103028f6362c722a07
|
7
|
+
data.tar.gz: 6538b6af58dc790cd1b164ddc4033360a1ca50c70488c62fe6fefdffc70fe177b0ca33f2c8b4c39be992f6c00d9f7945aaa3a19d1eafe8409c341b73f989f26f
|
data/README.md
CHANGED
@@ -71,6 +71,10 @@ hierarchy or to push child entity types. (Ex: person -> address) (default: `nil`
|
|
71
71
|
to determine the parent class. This can happen if parent is defined by another gem, like `ancestry`.
|
72
72
|
(default: `nil`) **[`:entity`]**
|
73
73
|
|
74
|
+
* `:primary_binding`: Determines what type of global-registry-binding the primary association points to. Defaults
|
75
|
+
to `:entity`, but can be set to a `:relationship` type name (ex: `:assignment`) to create a relationship_type
|
76
|
+
between a relationship and an entity. (default: `:entity`) **[`:relationship`]**
|
77
|
+
|
74
78
|
* `:primary_association`: Name of the Active Record primary association. Must be defined before calling
|
75
79
|
global_registry_bindings in order to determine foreign_key for use in exclude_fields. (default: `nil`)
|
76
80
|
**[`:relationship`]**
|
@@ -94,11 +98,11 @@ used to determine the related class. (default: `nil`) **[`:relationship`]**
|
|
94
98
|
not be determined from `:primary_association`. (default: `:primary_association.foreign_key`)
|
95
99
|
**[`:relationship`]**
|
96
100
|
|
97
|
-
* `:primary_relationship_name`: Name of primary relationship
|
98
|
-
|
101
|
+
* `:primary_relationship_name`: **Required** Name of primary relationship. Should be unique to prevent
|
102
|
+
ambiguous relationship names. (default: `nil`) **[`:relationship`]**
|
99
103
|
|
100
|
-
* `:related_relationship_name`: Name of the related relationship
|
101
|
-
|
104
|
+
* `:related_relationship_name`: **Required** Name of the related relationship. Should be unique to prevent
|
105
|
+
ambiguous relationship names (default: `nil`) **[`:relationship`]**
|
102
106
|
|
103
107
|
* `:related_association_type`: Name of the related association entity_type. Required if unable to determined
|
104
108
|
`:type` from related. (default: `nil`) **[`:relationship`]**
|
@@ -115,6 +119,10 @@ should cache this as it may be requested multiple times. (default: `nil`) **[`:r
|
|
115
119
|
* `:client_integration_id`: Client Integration ID for relationship. Proc or Symbol.
|
116
120
|
(default: `:primary_association.id`) **[`:relationship`]**
|
117
121
|
|
122
|
+
* `:include_all_columns`: Include all model columns in the fields to push to Global Registry. If `false`, fields must
|
123
|
+
be defined in the `:extra_fields` option. (default: `true`)
|
124
|
+
**[`:entity`, `:relationship`]**
|
125
|
+
|
118
126
|
* `:exclude_fields`: Array, Proc or Symbol. Array of Model fields (as symbols) to exclude when pushing to Global
|
119
127
|
Registry. Array Will additionally include `:mdm_id_column` and `:parent_association` foreign key when defined.
|
120
128
|
If Proc, is passed type and model instance and should return an Array of the fields to exclude. If Symbol,
|
@@ -9,7 +9,16 @@ module GlobalRegistry #:nodoc:
|
|
9
9
|
module PushRelationshipMethods
|
10
10
|
extend ActiveSupport::Concern
|
11
11
|
|
12
|
+
def relationship
|
13
|
+
global_registry_relationship(type)
|
14
|
+
end
|
15
|
+
|
12
16
|
def push_relationship_to_global_registry
|
17
|
+
# Delete relationship if it exists and the related id_value is missing
|
18
|
+
if relationship.related.nil? && relationship.related_id_value.nil? && relationship.id_value
|
19
|
+
delete_relationship_from_global_registry(false)
|
20
|
+
return
|
21
|
+
end
|
13
22
|
ensure_related_entities_have_global_registry_ids!
|
14
23
|
push_global_registry_relationship_type
|
15
24
|
create_relationship_in_global_registry
|
@@ -17,77 +26,92 @@ module GlobalRegistry #:nodoc:
|
|
17
26
|
|
18
27
|
def create_relationship_in_global_registry
|
19
28
|
entity = put_relationship_to_global_registry
|
20
|
-
|
29
|
+
relationship.id_value = global_registry_relationship_entity_id_from_entity entity
|
21
30
|
model.update_column( # rubocop:disable Rails/SkipsModelValidations
|
22
|
-
|
23
|
-
|
31
|
+
relationship.id_column,
|
32
|
+
relationship.id_value
|
24
33
|
)
|
25
34
|
end
|
26
35
|
|
27
36
|
def global_registry_relationship_entity_id_from_entity(entity)
|
28
37
|
relationships = Array.wrap entity.dig(
|
29
38
|
'entity',
|
30
|
-
|
31
|
-
"#{
|
39
|
+
relationship.primary_type.to_s,
|
40
|
+
"#{relationship.related_relationship_name}:relationship"
|
32
41
|
)
|
33
42
|
relationships.detect do |rel|
|
34
43
|
cid = rel['client_integration_id']
|
35
44
|
cid = cid['value'] if cid.is_a?(Hash)
|
36
|
-
cid ==
|
45
|
+
cid == relationship.client_integration_id.to_s
|
37
46
|
end&.dig('relationship_entity_id')
|
38
47
|
end
|
39
48
|
|
40
|
-
def ensure_related_entities_have_global_registry_ids!
|
41
|
-
if
|
42
|
-
global_registry_relationship(type).related_id_value.present?
|
43
|
-
return
|
44
|
-
end
|
49
|
+
def ensure_related_entities_have_global_registry_ids!
|
50
|
+
return if relationship.primary_id_value && relationship.related_id_value
|
45
51
|
# Enqueue push_entity worker for related entities missing global_registry_id and retry relationship push
|
46
52
|
names = []
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
53
|
+
unless relationship.primary_id_value
|
54
|
+
names << push_primary_to_global_registry
|
55
|
+
end
|
56
|
+
unless relationship.related_id_value
|
57
|
+
names << push_related_to_global_registry
|
51
58
|
end
|
52
59
|
raise GlobalRegistry::Bindings::RelatedEntityMissingGlobalRegistryId,
|
53
|
-
"#{model.class.name}(#{model.id}) has related entities [#{names.join ', '}] missing " \
|
60
|
+
"#{model.class.name}(#{model.id}) has related entities [#{names.compact.join ', '}] missing " \
|
54
61
|
'global_registry_id; will retry.'
|
55
62
|
end
|
56
63
|
|
64
|
+
def push_primary_to_global_registry
|
65
|
+
model = relationship.primary
|
66
|
+
if relationship.primary_binding == :entity
|
67
|
+
model.push_entity_to_global_registry_async
|
68
|
+
else
|
69
|
+
model.push_relationships_to_global_registry_async(relationship.primary_binding)
|
70
|
+
end
|
71
|
+
"#{model.class.name}(#{model.id})"
|
72
|
+
end
|
73
|
+
|
74
|
+
def push_related_to_global_registry
|
75
|
+
model = relationship.related
|
76
|
+
model.push_entity_to_global_registry_async
|
77
|
+
"#{model.class.name}(#{model.id})"
|
78
|
+
end
|
79
|
+
|
57
80
|
def relationship_entity
|
58
|
-
{ entity:
|
59
|
-
"#{
|
81
|
+
{ entity: { relationship.primary_type => {
|
82
|
+
"#{relationship.related_relationship_name}:relationship" =>
|
60
83
|
model.relationship_attributes_to_push(type)
|
61
|
-
.merge(
|
62
|
-
|
63
|
-
}, client_integration_id:
|
84
|
+
.merge(relationship.related_type =>
|
85
|
+
relationship.related_id_value)
|
86
|
+
}, client_integration_id: relationship.primary.id } }
|
64
87
|
end
|
65
88
|
|
66
89
|
def put_relationship_to_global_registry
|
67
90
|
GlobalRegistry::Entity.put(
|
68
|
-
|
91
|
+
relationship.primary_id_value,
|
69
92
|
relationship_entity,
|
70
93
|
params: {
|
71
94
|
full_response: true,
|
72
|
-
fields: "#{
|
95
|
+
fields: "#{relationship.related_relationship_name}:relationship"
|
73
96
|
}
|
74
97
|
)
|
75
98
|
rescue RestClient::BadRequest => e
|
76
99
|
response = JSON.parse(e.response.body)
|
77
100
|
raise unless response['error'] =~ /^Validation failed:.*already exists$/i
|
78
101
|
# Delete relationship entity and retry on 400 Bad Request (client_integration_id already exists)
|
79
|
-
|
102
|
+
delete_relationship_from_global_registry
|
80
103
|
end
|
81
104
|
|
82
|
-
def
|
83
|
-
GlobalRegistry::Bindings::Workers::DeleteEntityWorker.new.perform(
|
105
|
+
def delete_relationship_from_global_registry(and_retry = true)
|
106
|
+
GlobalRegistry::Bindings::Workers::DeleteEntityWorker.new.perform(relationship.id_value)
|
84
107
|
model.update_column( # rubocop:disable Rails/SkipsModelValidations
|
85
|
-
|
108
|
+
relationship.id_column, nil
|
86
109
|
)
|
110
|
+
return unless and_retry
|
87
111
|
raise GlobalRegistry::Bindings::RelatedEntityExistsWithCID,
|
88
|
-
"#{model.class.name}(#{model.id}) #{
|
112
|
+
"#{model.class.name}(#{model.id}) #{relationship.related_relationship_name}" \
|
89
113
|
':relationship already exists with client_integration_id(' \
|
90
|
-
"#{
|
114
|
+
"#{relationship.client_integration_id}). Will delete and retry."
|
91
115
|
end
|
92
116
|
end
|
93
117
|
end
|
@@ -16,17 +16,14 @@ module GlobalRegistry #:nodoc:
|
|
16
16
|
related_entity_type_id = related_associated_entity_type_id
|
17
17
|
|
18
18
|
relationship_type = Rails.cache.fetch(relationship_type_cache_key, expires_in: 1.hour) do
|
19
|
-
GlobalRegistry::RelationshipType.get(
|
19
|
+
rel = GlobalRegistry::RelationshipType.get(
|
20
20
|
'filters[between]' => "#{primary_entity_type_id},#{related_entity_type_id}"
|
21
21
|
)['relationship_types'].detect do |r|
|
22
22
|
r['relationship1']['relationship_name'] ==
|
23
23
|
global_registry_relationship(type).primary_relationship_name.to_s
|
24
24
|
end
|
25
|
-
|
26
|
-
|
27
|
-
unless relationship_type
|
28
|
-
relationship_type =
|
29
|
-
GlobalRegistry::RelationshipType.post(
|
25
|
+
unless rel
|
26
|
+
rel = GlobalRegistry::RelationshipType.post(
|
30
27
|
relationship_type: {
|
31
28
|
entity_type1_id: primary_entity_type_id,
|
32
29
|
entity_type2_id: related_entity_type_id,
|
@@ -34,6 +31,9 @@ module GlobalRegistry #:nodoc:
|
|
34
31
|
relationship2: global_registry_relationship(type).related_relationship_name
|
35
32
|
}
|
36
33
|
)['relationship_type']
|
34
|
+
rename_relationship_entity_type(rel)
|
35
|
+
end
|
36
|
+
rel
|
37
37
|
end
|
38
38
|
push_global_registry_relationship_type_fields(relationship_type)
|
39
39
|
relationship_type
|
@@ -79,8 +79,17 @@ module GlobalRegistry #:nodoc:
|
|
79
79
|
.reject { |k, _v| existing_fields.include? k }
|
80
80
|
.map { |name, type| { name: name, field_type: type } }
|
81
81
|
return if fields.empty?
|
82
|
-
GlobalRegistry::RelationshipType.put(relationship_type['id'],
|
83
|
-
|
82
|
+
relationship_type = GlobalRegistry::RelationshipType.put(relationship_type['id'],
|
83
|
+
relationship_type: { fields: fields })
|
84
|
+
&.dig('relationship_type')
|
85
|
+
Rails.cache.write(relationship_type_cache_key, relationship_type, expires_in: 1.hour) if relationship_type
|
86
|
+
end
|
87
|
+
|
88
|
+
def rename_relationship_entity_type(relationship_type)
|
89
|
+
return unless global_registry_relationship(type).rename_entity_type?
|
90
|
+
entity_type_id = relationship_type&.dig('relationship_entity_type_id')
|
91
|
+
GlobalRegistry::EntityType.put(entity_type_id, entity_type: { id: entity_type_id,
|
92
|
+
name: global_registry_relationship(type).type })
|
84
93
|
end
|
85
94
|
|
86
95
|
def relationship_type_cache_key
|
@@ -42,6 +42,10 @@ module GlobalRegistry #:nodoc:
|
|
42
42
|
# to determine the parent class. This can happen if parent is defined by another gem, like `ancestry`.
|
43
43
|
# (default: `nil`) **[`:entity`]**
|
44
44
|
#
|
45
|
+
# * `:primary_binding`: Determines what type of global-registry-binding the primary association points to. Defaults
|
46
|
+
# to `:entity`, but can be set to a `:relationship` type name (ex: `:assignment`) to create a relationship_type
|
47
|
+
# between a relationship and an entity. (default: `:entity`) **[`:relationship`]**
|
48
|
+
#
|
45
49
|
# * `:primary_association`: Name of the Active Record primary association. Must be defined before calling
|
46
50
|
# global_registry_bindings in order to determine foreign_key for use in exclude_fields. (default: `nil`)
|
47
51
|
# **[`:relationship`]**
|
@@ -65,11 +69,11 @@ module GlobalRegistry #:nodoc:
|
|
65
69
|
# not be determined from `:primary_association`. (default: `:primary_association.foreign_key`)
|
66
70
|
# **[`:relationship`]**
|
67
71
|
#
|
68
|
-
# * `:primary_relationship_name`: Name of primary relationship
|
69
|
-
#
|
72
|
+
# * `:primary_relationship_name`: **Required** Name of primary relationship. Should be unique to prevent
|
73
|
+
# ambiguous relationship names. (default: `nil`) **[`:relationship`]**
|
70
74
|
#
|
71
|
-
# * `:related_relationship_name`: Name of the related relationship
|
72
|
-
#
|
75
|
+
# * `:related_relationship_name`: **Required** Name of the related relationship. Should be unique to prevent
|
76
|
+
# ambiguous relationship names (default: `nil`) **[`:relationship`]**
|
73
77
|
#
|
74
78
|
# * `:related_association_type`: Name of the related association entity_type. Required if unable to determined
|
75
79
|
# `:type` from related. (default: `nil`) **[`:relationship`]**
|
@@ -84,20 +88,23 @@ module GlobalRegistry #:nodoc:
|
|
84
88
|
# (default: `true`) **[`:entity`]**
|
85
89
|
#
|
86
90
|
# * `:client_integration_id`: Client Integration ID for relationship. Proc or Symbol.
|
87
|
-
#
|
91
|
+
# (default: `:primary_association.id`) **[`:relationship`]**
|
88
92
|
#
|
89
93
|
# * `:exclude_fields`: Array, Proc or Symbol. Array of Model fields (as symbols) to exclude when pushing to Global
|
90
|
-
#
|
91
|
-
#
|
92
|
-
#
|
93
|
-
#
|
94
|
-
#
|
94
|
+
# Registry. Array Will additionally include `:mdm_id_column` and `:parent_association` foreign key when defined.
|
95
|
+
# If Proc, is passed type and model instance and should return an Array of the fields to exclude. If Symbol,
|
96
|
+
# this should be a method name the Model instance responds to. It is passed the type and should return an Array
|
97
|
+
# of fields to exclude. When Proc or Symbol are used, you must explicitly return the standard defaults.
|
98
|
+
# (default: `[:id, :created_at, :updated_at, :global_registry_id]`) **[`:entity`, `:relationship`]**
|
95
99
|
#
|
96
100
|
# * `:extra_fields`: Additional fields to send to Global Registry. Hash, Proc or Symbol. As a Hash, names are the
|
97
|
-
#
|
98
|
-
#
|
99
|
-
#
|
100
|
-
#
|
101
|
+
# keys and :type attributes are the values. Ex: `{language: :string}`. Name is a symbol and type is an
|
102
|
+
# ActiveRecord column type. As a Proc, it is passed the type and model instance, and should return a Hash.
|
103
|
+
# As a Symbol, the model should respond to this method, is passed the type, and should return a Hash.
|
104
|
+
# **[`:entity`, `:relationship`]**
|
105
|
+
#
|
106
|
+
# * `:include_all_columns`: Include all model columns in the fields to push to Global Registry. If `false`, fields
|
107
|
+
# must be defined in the `:extra_fields` option. (default: `true`) **[`:entity`, `:relationship`]**
|
101
108
|
#
|
102
109
|
# * `:mdm_id_column`: Column used to enable MDM tracking and set the name of the column. MDM is disabled when this
|
103
110
|
# option is nil or empty. (default: `nil`) **[`:entity`]**
|
@@ -36,15 +36,19 @@ module GlobalRegistry #:nodoc:
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def entity_columns_to_push
|
39
|
-
@columns_to_push ||=
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
39
|
+
@columns_to_push ||= if global_registry_entity.include_all_columns?
|
40
|
+
self
|
41
|
+
.class
|
42
|
+
.columns
|
43
|
+
.collect do |c|
|
44
|
+
{ c.name.underscore.to_sym => normalize_entity_column_type(c.type, c.name) }
|
45
|
+
end # rubocop:disable Style/MultilineBlockChain
|
46
|
+
.reduce(&:merge)
|
47
|
+
.reject { |k, _v| global_registry_entity.exclude_fields.include? k }
|
48
|
+
.merge(global_registry_entity.extra_fields)
|
49
|
+
else
|
50
|
+
global_registry_entity.extra_fields
|
51
|
+
end
|
48
52
|
end
|
49
53
|
|
50
54
|
protected
|
@@ -43,11 +43,17 @@ module GlobalRegistry #:nodoc:
|
|
43
43
|
::GlobalRegistry::Bindings::Workers::DeleteEntityWorker.new.perform(
|
44
44
|
global_registry_relationship(type).id_value
|
45
45
|
)
|
46
|
+
update_column( # rubocop:disable Rails/SkipsModelValidations
|
47
|
+
global_registry_relationship(type).id_column, nil
|
48
|
+
)
|
46
49
|
::GlobalRegistry::Bindings::Workers::PushRelationshipWorker.perform_async(self.class, id, type)
|
47
50
|
end
|
48
51
|
|
49
52
|
def global_registry_relationship_async_delete(type)
|
50
53
|
delete_relationships_from_global_registry_async(type)
|
54
|
+
update_column( # rubocop:disable Rails/SkipsModelValidations
|
55
|
+
global_registry_relationship(type).id_column, nil
|
56
|
+
)
|
51
57
|
end
|
52
58
|
|
53
59
|
def global_registry_relationship_async_ignore(_type); end # noop
|
@@ -35,10 +35,7 @@ module GlobalRegistry #:nodoc:
|
|
35
35
|
|
36
36
|
def relationship_columns_to_push(type)
|
37
37
|
@relationship_columns_to_push ||= {}
|
38
|
-
@relationship_columns_to_push[type] ||=
|
39
|
-
relationship_entity_columns(type)
|
40
|
-
.reject { |k, _v| global_registry_relationship(type).exclude_fields.include? k }
|
41
|
-
.merge(global_registry_relationship(type).extra_fields)
|
38
|
+
@relationship_columns_to_push[type] ||= relationship_entity_columns(type)
|
42
39
|
end
|
43
40
|
|
44
41
|
protected
|
@@ -54,13 +51,18 @@ module GlobalRegistry #:nodoc:
|
|
54
51
|
end
|
55
52
|
|
56
53
|
def relationship_entity_columns(type)
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
54
|
+
if global_registry_relationship(type).include_all_columns?
|
55
|
+
self.class
|
56
|
+
.columns
|
57
|
+
.collect do |c|
|
58
|
+
{ c.name.underscore.to_sym => normalize_relationship_column_type(c.type, c.name) }
|
59
|
+
end # rubocop:disable Style/MultilineBlockChain
|
60
|
+
.reduce(&:merge)
|
61
|
+
.reject { |k, _v| global_registry_relationship(type).exclude_fields.include? k }
|
62
|
+
.merge(global_registry_relationship(type).extra_fields)
|
63
|
+
else
|
64
|
+
global_registry_relationship(type).extra_fields || {}
|
62
65
|
end
|
63
|
-
.reduce(&:merge)
|
64
66
|
end
|
65
67
|
end
|
66
68
|
end
|
@@ -10,6 +10,7 @@ module GlobalRegistry #:nodoc:
|
|
10
10
|
:type,
|
11
11
|
:push_on,
|
12
12
|
:client_integration_id,
|
13
|
+
:primary_binding,
|
13
14
|
:primary_association,
|
14
15
|
:primary_association_class,
|
15
16
|
:primary_association_foreign_key,
|
@@ -31,6 +32,14 @@ module GlobalRegistry #:nodoc:
|
|
31
32
|
def ensure_relationship_type?
|
32
33
|
@options.ensure_relationship_type.present?
|
33
34
|
end
|
35
|
+
|
36
|
+
def rename_entity_type?
|
37
|
+
@options.rename_entity_type.present?
|
38
|
+
end
|
39
|
+
|
40
|
+
def include_all_columns?
|
41
|
+
@options.include_all_columns.present?
|
42
|
+
end
|
34
43
|
end
|
35
44
|
end
|
36
45
|
end
|
@@ -6,12 +6,16 @@ module GlobalRegistry #:nodoc:
|
|
6
6
|
class RelationshipInstanceOptions
|
7
7
|
delegate :id_column,
|
8
8
|
:push_on,
|
9
|
+
:primary_binding,
|
9
10
|
:primary_association,
|
10
11
|
:primary_association_class,
|
11
12
|
:primary_association_foreign_key,
|
12
13
|
:related_association,
|
13
14
|
:related_association_class,
|
14
15
|
:related_association_foreign_key,
|
16
|
+
:ensure_relationship_type?,
|
17
|
+
:rename_entity_type?,
|
18
|
+
:include_all_columns?,
|
15
19
|
to: :@class_options
|
16
20
|
|
17
21
|
def initialize(type, model)
|
@@ -58,11 +62,21 @@ module GlobalRegistry #:nodoc:
|
|
58
62
|
end
|
59
63
|
|
60
64
|
def primary_type
|
61
|
-
|
65
|
+
case primary_binding
|
66
|
+
when :entity
|
67
|
+
primary&.global_registry_entity&.type
|
68
|
+
else
|
69
|
+
primary&.global_registry_relationship(primary_binding)&.type
|
70
|
+
end
|
62
71
|
end
|
63
72
|
|
64
73
|
def primary_id_value
|
65
|
-
|
74
|
+
case primary_binding
|
75
|
+
when :entity
|
76
|
+
primary&.global_registry_entity&.id_value
|
77
|
+
else
|
78
|
+
primary&.global_registry_relationship(primary_binding)&.id_value
|
79
|
+
end
|
66
80
|
end
|
67
81
|
|
68
82
|
def primary_class_is_self?
|
@@ -120,10 +134,6 @@ module GlobalRegistry #:nodoc:
|
|
120
134
|
option
|
121
135
|
end
|
122
136
|
end
|
123
|
-
|
124
|
-
def ensure_relationship_type?
|
125
|
-
@class_options.ensure_relationship_type?
|
126
|
-
end
|
127
137
|
end
|
128
138
|
end
|
129
139
|
end
|
@@ -12,16 +12,16 @@ module GlobalRegistry #:nodoc:
|
|
12
12
|
{
|
13
13
|
id_column: :global_registry_id,
|
14
14
|
type: @model_class.name.demodulize.underscore.to_sym,
|
15
|
-
client_integration_id: :id,
|
15
|
+
client_integration_id: :id, primary_binding: :entity,
|
16
16
|
primary_association: nil,
|
17
17
|
primary_association_class: nil,
|
18
18
|
primary_relationship_name: nil,
|
19
|
-
related_association: nil,
|
20
|
-
related_association_class: nil,
|
19
|
+
related_association: nil,
|
20
|
+
related_association_class: nil, related_association_type: nil,
|
21
21
|
related_relationship_name: nil,
|
22
22
|
related_global_registry_id: nil,
|
23
|
-
exclude_fields: %i[id created_at updated_at],
|
24
|
-
extra_fields: {}, ensure_relationship_type: true
|
23
|
+
exclude_fields: %i[id created_at updated_at], include_all_columns: true,
|
24
|
+
extra_fields: {}, ensure_relationship_type: true, rename_entity_type: true
|
25
25
|
}.freeze
|
26
26
|
end
|
27
27
|
|
@@ -16,12 +16,12 @@ module GlobalRegistry #:nodoc:
|
|
16
16
|
|
17
17
|
def initialize(model = nil, type = nil)
|
18
18
|
super model
|
19
|
-
self.type = type
|
19
|
+
self.type = type.to_sym if type
|
20
20
|
end
|
21
21
|
|
22
22
|
def perform(model_class, id, type)
|
23
23
|
super model_class, id
|
24
|
-
self.type = type
|
24
|
+
self.type = type.to_sym
|
25
25
|
push_relationship_to_global_registry
|
26
26
|
rescue ActiveRecord::RecordNotFound # rubocop:disable Lint/HandleExceptions
|
27
27
|
# If the record was deleted after the job was created, swallow it
|
@@ -70,15 +70,17 @@ RSpec.describe 'GlobalRegistry::Bindings' do
|
|
70
70
|
person = build(:person)
|
71
71
|
org = build(:organization)
|
72
72
|
assignment = build(:assignment, person: person, organization: org)
|
73
|
-
expect(Assignment.global_registry_relationship(:
|
74
|
-
expect(Assignment.global_registry_relationship(:
|
75
|
-
expect(Assignment.global_registry_relationship(:
|
76
|
-
expect(Assignment.global_registry_relationship(:
|
77
|
-
expect(assignment.global_registry_relationship(:
|
78
|
-
expect(assignment.global_registry_relationship(:
|
79
|
-
expect(assignment.global_registry_relationship(:
|
80
|
-
.to contain_exactly(:global_registry_id, :id, :created_at, :updated_at, :person_id, :organization_id
|
81
|
-
|
73
|
+
expect(Assignment.global_registry_relationship(:fancy_org_assignment).id_column).to be :global_registry_id
|
74
|
+
expect(Assignment.global_registry_relationship(:fancy_org_assignment).type).to be :fancy_org_assignment
|
75
|
+
expect(Assignment.global_registry_relationship(:fancy_org_assignment).primary_association).to be :person
|
76
|
+
expect(Assignment.global_registry_relationship(:fancy_org_assignment).related_association).to be :organization
|
77
|
+
expect(assignment.global_registry_relationship(:fancy_org_assignment).primary_relationship_name).to be :person
|
78
|
+
expect(assignment.global_registry_relationship(:fancy_org_assignment).related_relationship_name).to be :fancy_org
|
79
|
+
expect(assignment.global_registry_relationship(:fancy_org_assignment).exclude_fields)
|
80
|
+
.to contain_exactly(:global_registry_id, :id, :created_at, :updated_at, :person_id, :organization_id,
|
81
|
+
:assigned_by_gr_rel_id, :assigned_by_id)
|
82
|
+
expect(assignment.global_registry_relationship(:fancy_org_assignment).extra_fields)
|
83
|
+
.to be_a(Hash)
|
82
84
|
end
|
83
85
|
end
|
84
86
|
end
|
data/spec/factories/factories.rb
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
{
|
2
|
+
"entity_types": [
|
3
|
+
{
|
4
|
+
"id": "5d70b630-4248-11e7-90b4-129bd0521531",
|
5
|
+
"name": "fancy_org_assignment",
|
6
|
+
"data_visibility": "public",
|
7
|
+
"fields": [
|
8
|
+
{
|
9
|
+
"id": "235ce6fc-4249-11e7-944f-129bd0521531",
|
10
|
+
"name": "role",
|
11
|
+
"data_visibility": "public",
|
12
|
+
"field_type": "string",
|
13
|
+
"is_editable": false,
|
14
|
+
"unique_value": false
|
15
|
+
},
|
16
|
+
{
|
17
|
+
"id": "675bd9ee-4249-11e7-9e93-129bd0521531",
|
18
|
+
"name": "hired_at",
|
19
|
+
"data_visibility": "public",
|
20
|
+
"field_type": "datetime",
|
21
|
+
"is_editable": false,
|
22
|
+
"unique_value": false
|
23
|
+
}
|
24
|
+
],
|
25
|
+
"is_editable": false,
|
26
|
+
"unique_value": false
|
27
|
+
}
|
28
|
+
],
|
29
|
+
"meta": {
|
30
|
+
"page": 1,
|
31
|
+
"next_page": false,
|
32
|
+
"from": 1,
|
33
|
+
"to": 1
|
34
|
+
}
|
35
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
{
|
2
|
+
"relationship_type": {
|
3
|
+
"id": "4f5e565c-76c7-11e7-b3f0-129bd0521531",
|
4
|
+
"relationship_entity_type_id": "4f5d8150-76c7-11e7-b3f0-129bd0521531",
|
5
|
+
"relationship1": {
|
6
|
+
"entity_type": "fancy_org_assignment",
|
7
|
+
"relationship_name": "assigned_by"
|
8
|
+
},
|
9
|
+
"relationship2": {
|
10
|
+
"entity_type": "person",
|
11
|
+
"relationship_name": "person"
|
12
|
+
},
|
13
|
+
"fields": [],
|
14
|
+
"is_editable": true
|
15
|
+
}
|
16
|
+
}
|