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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +79 -35
  3. data/lib/global_registry_bindings/entity/entity_type_methods.rb +35 -33
  4. data/lib/global_registry_bindings/entity/mdm_methods.rb +9 -19
  5. data/lib/global_registry_bindings/entity/push_entity_methods.rb +31 -38
  6. data/lib/global_registry_bindings/entity/push_relationship_methods.rb +61 -47
  7. data/lib/global_registry_bindings/entity/relationship_type_methods.rb +48 -37
  8. data/lib/global_registry_bindings/exceptions.rb +1 -0
  9. data/lib/global_registry_bindings/global_registry_bindings.rb +129 -46
  10. data/lib/global_registry_bindings/{entity/delete_entity_methods.rb → model/delete_entity.rb} +5 -5
  11. data/lib/global_registry_bindings/model/entity.rb +64 -0
  12. data/lib/global_registry_bindings/model/pull_mdm.rb +23 -0
  13. data/lib/global_registry_bindings/model/push_entity.rb +21 -0
  14. data/lib/global_registry_bindings/model/push_relationship.rb +79 -0
  15. data/lib/global_registry_bindings/model/relationship.rb +68 -0
  16. data/lib/global_registry_bindings/options.rb +26 -59
  17. data/lib/global_registry_bindings/options/entity_class_options.rb +34 -0
  18. data/lib/global_registry_bindings/options/entity_instance_options.rb +90 -0
  19. data/lib/global_registry_bindings/options/entity_options_parser.rb +76 -0
  20. data/lib/global_registry_bindings/options/relationship_class_options.rb +37 -0
  21. data/lib/global_registry_bindings/options/relationship_instance_options.rb +131 -0
  22. data/lib/global_registry_bindings/options/relationship_options_parser.rb +98 -0
  23. data/lib/global_registry_bindings/railtie.rb +2 -1
  24. data/lib/global_registry_bindings/version.rb +1 -1
  25. data/lib/global_registry_bindings/worker.rb +25 -0
  26. data/lib/global_registry_bindings/workers/{delete_gr_entity_worker.rb → delete_entity_worker.rb} +1 -6
  27. data/lib/global_registry_bindings/workers/pull_mdm_id_worker.rb +12 -13
  28. data/lib/global_registry_bindings/workers/push_entity_worker.rb +24 -0
  29. data/lib/global_registry_bindings/workers/push_relationship_worker.rb +17 -7
  30. data/spec/acceptance/global_registry_bindings_spec.rb +50 -40
  31. data/spec/factories/factories.rb +24 -0
  32. data/spec/fixtures/get_entity_types_area.json +44 -0
  33. data/spec/fixtures/post_entities_community.json +8 -0
  34. data/spec/fixtures/post_relationship_types_fancy_org_area.json +16 -0
  35. data/spec/fixtures/put_entities_community_relationship.json +16 -0
  36. data/spec/fixtures/put_entities_fancy_org_area_relationship.json +8 -0
  37. data/spec/fixtures/put_entities_fancy_org_relationship.json +17 -0
  38. data/spec/fixtures/put_entities_person_country_relationship.json +23 -0
  39. data/spec/fixtures/put_entities_relationship_400.json +3 -0
  40. data/spec/fixtures/put_relationship_types_fields_fancy_org_area.json +25 -0
  41. data/spec/helpers/sidekiq_helpers.rb +14 -0
  42. data/spec/internal/app/models/address.rb +7 -2
  43. data/spec/internal/app/models/area.rb +7 -0
  44. data/spec/internal/app/models/assignment.rb +5 -4
  45. data/spec/internal/app/models/community.rb +19 -0
  46. data/spec/internal/app/models/country.rb +8 -0
  47. data/spec/internal/app/models/namespaced/person.rb +48 -2
  48. data/spec/internal/app/models/organization.rb +26 -3
  49. data/spec/internal/db/schema.rb +28 -0
  50. data/spec/internal/log/test.log +71023 -0
  51. data/spec/models/address_spec.rb +6 -204
  52. data/spec/models/assignment_spec.rb +40 -186
  53. data/spec/models/organization_spec.rb +106 -92
  54. data/spec/models/person_spec.rb +158 -214
  55. data/spec/models/user_edited_person_spec.rb +2 -2
  56. data/spec/spec_helper.rb +5 -6
  57. data/spec/workers/delete_gr_entity_worker_spec.rb +4 -4
  58. data/spec/workers/pull_mdm_id_worker_spec.rb +94 -32
  59. data/spec/workers/push_entity_worker_spec.rb +476 -0
  60. data/spec/workers/push_relationship_worker_spec.rb +344 -15
  61. metadata +45 -10
  62. data/lib/global_registry_bindings/entity/entity_methods.rb +0 -62
  63. data/lib/global_registry_bindings/options/class_options.rb +0 -62
  64. data/lib/global_registry_bindings/options/instance_options.rb +0 -63
  65. data/lib/global_registry_bindings/workers/push_gr_entity_worker.rb +0 -22
  66. data/spec/workers/push_gr_entity_worker_spec.rb +0 -27
@@ -8,50 +8,61 @@ module GlobalRegistry #:nodoc:
8
8
  module RelationshipTypeMethods
9
9
  extend ActiveSupport::Concern
10
10
 
11
- module ClassMethods
12
- def push_global_registry_relationship_type # rubocop:disable Metrics/MethodLength
13
- parent_entity_type_id, related_entity_type_id = associated_entity_ids
14
-
15
- relationship_type = Rails.cache.fetch(relationship_type_cache_key, expires_in: 1.hour) do
16
- GlobalRegistry::RelationshipType.get(
17
- 'filters[between]' => "#{parent_entity_type_id},#{related_entity_type_id}"
18
- )['relationship_types'].detect do |r|
19
- r['relationship1']['relationship_name'] == global_registry.parent_relationship_name.to_s
20
- end
21
- end
11
+ # rubocop:disable Metrics/MethodLength
12
+ # rubocop:disable Metrics/AbcSize
13
+ def push_global_registry_relationship_type
14
+ return unless global_registry_relationship(type).ensure_relationship_type?
15
+ primary_entity_type_id, related_entity_type_id = associated_entity_ids
22
16
 
23
- unless relationship_type
24
- relationship_type =
25
- GlobalRegistry::RelationshipType.post(relationship_type: {
26
- entity_type1_id: parent_entity_type_id,
27
- entity_type2_id: related_entity_type_id,
28
- relationship1: global_registry.parent_relationship_name,
29
- relationship2: global_registry.related_relationship_name
30
- })['relationship_type']
17
+ relationship_type = Rails.cache.fetch(relationship_type_cache_key, expires_in: 1.hour) do
18
+ GlobalRegistry::RelationshipType.get(
19
+ 'filters[between]' => "#{primary_entity_type_id},#{related_entity_type_id}"
20
+ )['relationship_types'].detect do |r|
21
+ r['relationship1']['relationship_name'] ==
22
+ global_registry_relationship(type).primary_relationship_name.to_s
31
23
  end
32
- push_global_registry_relationship_type_fields(relationship_type)
33
- relationship_type
34
24
  end
35
25
 
36
- def associated_entity_ids
37
- [global_registry.parent_class.send(:push_entity_type)&.dig('id'),
38
- global_registry.related_class.send(:push_entity_type)&.dig('id')]
26
+ unless relationship_type
27
+ relationship_type =
28
+ GlobalRegistry::RelationshipType.post(
29
+ relationship_type: {
30
+ entity_type1_id: primary_entity_type_id,
31
+ entity_type2_id: related_entity_type_id,
32
+ relationship1: global_registry_relationship(type).primary_relationship_name,
33
+ relationship2: global_registry_relationship(type).related_relationship_name
34
+ }
35
+ )['relationship_type']
39
36
  end
37
+ push_global_registry_relationship_type_fields(relationship_type)
38
+ relationship_type
39
+ end
40
+ # rubocop:enable Metrics/MethodLength
41
+ # rubocop:enable Metrics/AbcSize
40
42
 
41
- def push_global_registry_relationship_type_fields(relationship_type)
42
- existing_fields = relationship_type['fields']&.collect { |f| f['name'].to_sym } || []
43
- fields = columns_to_push
44
- .reject { |k, _v| existing_fields.include? k }
45
- .map { |name, type| { name: name, field_type: type } }
46
- return if fields.empty?
47
- GlobalRegistry::RelationshipType.put(relationship_type['id'],
48
- relationship_type: { fields: fields })
49
- end
43
+ def associated_entity_ids
44
+ primary_worker =
45
+ GlobalRegistry::Bindings::Workers::PushEntityWorker.new global_registry_relationship(type).primary
46
+ related_worker =
47
+ GlobalRegistry::Bindings::Workers::PushEntityWorker.new global_registry_relationship(type).related
48
+ [primary_worker.send(:push_entity_type_to_global_registry)&.dig('id'),
49
+ related_worker.send(:push_entity_type_to_global_registry)&.dig('id')]
50
+ end
50
51
 
51
- def relationship_type_cache_key
52
- "GlobalRegistry::Bindings::RelationshipType::#{global_registry.parent_type}::" \
53
- "#{global_registry.related_type}::#{global_registry.parent_relationship_name}"
54
- end
52
+ def push_global_registry_relationship_type_fields(relationship_type)
53
+ existing_fields = relationship_type['fields']&.collect { |f| f['name'].to_sym } || []
54
+ fields = model.relationship_columns_to_push(type)
55
+ .reject { |k, _v| existing_fields.include? k }
56
+ .map { |name, type| { name: name, field_type: type } }
57
+ return if fields.empty?
58
+ GlobalRegistry::RelationshipType.put(relationship_type['id'],
59
+ relationship_type: { fields: fields })
60
+ end
61
+
62
+ def relationship_type_cache_key
63
+ "GlobalRegistry::Bindings::RelationshipType::#{global_registry_relationship(type).primary_type}::" \
64
+ "#{global_registry_relationship(type).related_type}::" \
65
+ "#{global_registry_relationship(type).primary_relationship_name}"
55
66
  end
56
67
  end
57
68
  end
@@ -6,5 +6,6 @@ module GlobalRegistry #:nodoc:
6
6
  class EntityMissingMdmId < StandardError; end
7
7
  class RelatedEntityMissingGlobalRegistryId < StandardError; end
8
8
  class ParentEntityMissingGlobalRegistryId < StandardError; end
9
+ class RelatedEntityExistsWithCID < StandardError; end
9
10
  end
10
11
  end
@@ -4,13 +4,15 @@ require 'active_support/core_ext'
4
4
  require 'global_registry'
5
5
  require 'global_registry_bindings/exceptions'
6
6
  require 'global_registry_bindings/options'
7
- require 'global_registry_bindings/entity/entity_methods'
8
- require 'global_registry_bindings/entity/entity_type_methods'
9
- require 'global_registry_bindings/entity/relationship_type_methods'
10
- require 'global_registry_bindings/entity/push_entity_methods'
11
- require 'global_registry_bindings/entity/delete_entity_methods'
12
- require 'global_registry_bindings/entity/mdm_methods'
13
- require 'global_registry_bindings/entity/push_relationship_methods'
7
+ require 'global_registry_bindings/options/entity_options_parser'
8
+ require 'global_registry_bindings/options/relationship_options_parser'
9
+ require 'global_registry_bindings/model/entity'
10
+ require 'global_registry_bindings/model/push_entity'
11
+ require 'global_registry_bindings/model/push_relationship'
12
+ require 'global_registry_bindings/model/delete_entity'
13
+ require 'global_registry_bindings/model/pull_mdm'
14
+ require 'global_registry_bindings/model/relationship'
15
+ require 'global_registry_bindings/worker'
14
16
 
15
17
  module GlobalRegistry #:nodoc:
16
18
  module Bindings #:nodoc:
@@ -18,59 +20,140 @@ module GlobalRegistry #:nodoc:
18
20
  #
19
21
  # Options:
20
22
  #
21
- # * `:id_column`: Column used to track the Global Registry ID for the model instance. Can be a :string or :uuid
22
- # column. (default: `:global_registry_id`)
23
- # * `:mdm_id_column`: Column used to enable MDM tracking and set the name of the column. MDM is disabled when this
24
- # option is nil or empty. (default: `nil`)
25
- # * `:type`: Global Registry entity type. Default value is underscored name of the model.
23
+ # * `:binding`: Type of Global Registry binding. Either `:entity` or `:relationship`.
24
+ # (default: `:entity`)
25
+ #
26
+ # * `:id_column`: Column used to track the Global Registry ID for the model instance or relationship entity.
27
+ # Can be a :string or :uuid column. (default: `:global_registry_id`) **[`:entity`, `:relationship`]**
28
+ #
29
+ # * `:type`: Global Registry entity type. Accepts a Symbol or a Proc. Symbol is the name of the entity type, Proc
30
+ # is passed the model instance and must return a symbol which is the entity type. Default value is underscored
31
+ # name of the model. Ex: ```type: proc { |model| model.name.to_sym }```. When used in a `:relationship`, `:type`
32
+ # is a unique name to identify the relationship. **[`:entity`, `:relationship`]**
33
+ #
26
34
  # * `:push_on`: Array of Active Record lifecycle events used to push changes to Global Registry.
27
- # (default: `[:create, :update, :delete]`)
35
+ # (default: `[:create, :update, :destroy]`) **[`:entity`]**
36
+ #
28
37
  # * `:parent_association`: Name of the Active Record parent association. Must be defined before calling
29
- # global_registry_bindings in order to determine foreign_key field. (default: `nil`)
38
+ # global_registry_bindings in order to determine foreign_key for use in exclude_fields. Used to create a
39
+ # hierarchy or to push child entity types. (Ex: person -> address) (default: `nil`) **[`:entity`]**
40
+ #
30
41
  # * `:parent_association_class`: Class name of the parent model. Required if `:parent_association` can not be used
31
- # to determine the parent class. This can happen if parent is defined by another gem, like `has_ancestry`.
32
- # (default: `nil`)
33
- # * `:related_association`: Name of the Active Record related association. Setting this option changes the
34
- # global registry binding from entity to relationship. Active Record association must be defined before calling
35
- # global_registry_bindings in order to determine the foreign key. `:parent_relationship_name` and
36
- # `:related_relationship_name` must be set for relationship binding to work. (default: `nil`)
42
+ # to determine the parent class. This can happen if parent is defined by another gem, like `ancestry`.
43
+ # (default: `nil`) **[`:entity`]**
44
+ #
45
+ # * `:primary_association`: Name of the Active Record primary association. Must be defined before calling
46
+ # global_registry_bindings in order to determine foreign_key for use in exclude_fields. (default: `nil`)
47
+ # **[`:relationship`]**
48
+ #
49
+ # * `:primary_association_class`: Class name of the primary model. Required if `:primary_association` can not be
50
+ # used to determine the parent class. This can happen if parent is defined by another gem, like `ancestry`.
51
+ # (default: `self.class`) **[`:relationship`]**
52
+ #
53
+ # * `:primary_association_foreign_key`: Foreign Key column for the primary association. Used if foreign_key can
54
+ # not be determined from `:primary_association`. (default: `:primary_association.foreign_key`)
55
+ # **[`:relationship`]**
56
+ #
57
+ # * `:related_association`: Name of the Active Record related association. Active Record association must be
58
+ # defined before calling global_registry_bindings in order to determine the foreign key.
59
+ # (default: `nil`) **[`:relationship`]**
60
+ #
37
61
  # * `:related_association_class`: Class name of the related model. Required if `:related_association` can not be
38
- # used to determine the related class. (default: `nil`)
39
- # * `:parent_relationship_name`: Name of parent relationship role. (default: `nil`)
40
- # * `:related_relationship_name`: Name of the related relationship role. (default: `nil`)
41
- # * `:exclude_fields`: Model fields to exclude when pushing to Global Registry. Will additionally include
42
- # `:mdm_id_column` and `:parent_association` foreign key when defined.
43
- # (default: `[:id, :created_at, :updated_at, :global_registry_id]`)
44
- # * `:extra_fields`: Additional fields to send to Global Registry. This should be a hash with name as the key
45
- # and :type attributes as the value. Ex: `{language: :string}`. Name is a symbol and type is an ActiveRecord
46
- # column type.
62
+ # used to determine the related class. (default: `nil`) **[`:relationship`]**
63
+ #
64
+ # * `:related_association_foreign_key`: Foreign Key column for the related association. Used if foreign_key can
65
+ # not be determined from `:primary_association`. (default: `:primary_association.foreign_key`)
66
+ # **[`:relationship`]**
67
+ #
68
+ # * `:primary_relationship_name`: Name of primary relationship role. Required if `:ensure_relationship_type` is
69
+ # `true`. (default: `nil`) **[`:relationship`]**
70
+ #
71
+ # * `:related_relationship_name`: Name of the related relationship role. Required if `:ensure_relationship_type`
72
+ # is `true`. (default: `nil`) **[`:relationship`]**
73
+ #
74
+ # * `:related_association_type`: Name of the related association entity_type. Required if unable to determined
75
+ # `:type` from related. (default: `nil`) **[`:relationship`]**
76
+ #
77
+ # * `:related_global_registry_id`: Global Registry ID of a remote related entity. Proc or Symbol. Implementation
78
+ # should cache this as it may be requested multiple times. (default: `nil`) **[`:relationship`]**
79
+ #
80
+ # * `:ensure_relationship_type`: Ensure Global Registry RelationshipType exists and is up to date.
81
+ # (default: `true`) **[`:relationship`]**
82
+ #
83
+ # * `:ensure_entity_type`: Ensure Global Registry Entity Type exists and is up to date.
84
+ # (default: `true`) **[`:entity`]**
85
+ #
86
+ # * `:client_integration_id`: Client Integration ID for relationship. Proc or Symbol.
87
+ # (default: `:primary_association.id`) **[`:relationship`]**
88
+ #
89
+ # * `:exclude_fields`: Array, Proc or Symbol. Array of Model fields (as symbols) to exclude when pushing to Global
90
+ # Registry. Array Will additionally include `:mdm_id_column` and `:parent_association` foreign key when defined.
91
+ # If Proc, is passed type and model instance and should return an Array of the fields to exclude. If Symbol,
92
+ # this should be a method name the Model instance responds to. It is passed the type and should return an Array
93
+ # of fields to exclude. When Proc or Symbol are used, you must explicitly return the standard defaults.
94
+ # (default: `[:id, :created_at, :updated_at, :global_registry_id]`) **[`:entity`, `:relationship`]**
95
+ #
96
+ # * `:extra_fields`: Additional fields to send to Global Registry. Hash, Proc or Symbol. As a Hash, names are the
97
+ # keys and :type attributes are the values. Ex: `{language: :string}`. Name is a symbol and type is an
98
+ # ActiveRecord column type. As a Proc, it is passed the type and model instance, and should return a Hash.
99
+ # As a Symbol, the model should respond to this method, is passed the type, and should return a Hash.
100
+ # **[`:entity`, `:relationship`]**
101
+ #
102
+ # * `:mdm_id_column`: Column used to enable MDM tracking and set the name of the column. MDM is disabled when this
103
+ # option is nil or empty. (default: `nil`) **[`:entity`]**
104
+ #
47
105
  # * `:mdm_timeout`: Only pull mdm information at most once every `:mdm_timeout`. (default: `1.minute`)
106
+ # **[`:entity`]**
48
107
  #
49
108
  # @api public
50
109
  def global_registry_bindings(options = {})
51
- global_registry_bindings_parse_options! options
110
+ options[:binding] ||= :entity
111
+ unless method_defined? :_global_registry_bindings_options
112
+ class_attribute :_global_registry_bindings_options
113
+ self._global_registry_bindings_options = { entity: nil, relationships: {} }
114
+ end
115
+ if options[:binding] == :entity
116
+ global_registry_bindings_entity options
117
+ elsif options[:binding] == :relationship
118
+ global_registry_bindings_relationship options
119
+ else
120
+ raise ArgumentError, ':binding option must be :entity or :relationship'
121
+ end
122
+ end
52
123
 
53
- include Options
54
- include Entity::EntityMethods
55
- if global_registry.push_on.any? { |item| %i[create update].include? item }
56
- if global_registry.related_association && global_registry.parent_association
57
- include Entity::RelationshipTypeMethods
58
- include Entity::PushRelationshipMethods
59
- else
60
- include Entity::EntityTypeMethods
61
- include Entity::PushEntityMethods
62
- end
124
+ private
125
+
126
+ def global_registry_bindings_entity(options = {})
127
+ if _global_registry_bindings_options[:entity].present?
128
+ raise '#global_registry_bindings with :entity binding called more than once.'
63
129
  end
130
+ _global_registry_bindings_options[:entity] = GlobalRegistry::Bindings::Options::EntityOptionsParser.new(self)
131
+ .parse(options)
132
+ include Options unless respond_to? :global_registry_entity
133
+ global_registry_bindings_entity_includes
134
+ end
135
+
136
+ def global_registry_bindings_relationship(options = {})
137
+ options = GlobalRegistry::Bindings::Options::RelationshipOptionsParser.new(self).parse(options)
138
+ _global_registry_bindings_options[:relationships][options[:type]] = options
64
139
 
65
- include Entity::DeleteEntityMethods if global_registry.push_on.include? :delete
66
- include Entity::MdmMethods if global_registry.mdm_id_column.present?
140
+ include Options unless respond_to? :global_registry_entity
141
+ global_registry_bindings_relationship_includes(options[:type])
67
142
  end
68
143
 
69
- private
144
+ def global_registry_bindings_entity_includes
145
+ include Model::Entity
146
+ if global_registry_entity.push_on.any? { |item| %i[create update].include? item }
147
+ include Model::PushEntity
148
+ end
149
+
150
+ include Model::DeleteEntity if global_registry_entity.push_on.include? :destroy
151
+ include Model::PullMdm if global_registry_entity.mdm_id_column.present?
152
+ end
70
153
 
71
- def global_registry_bindings_parse_options!(options)
72
- class_attribute :_global_registry_bindings_options_hash
73
- self._global_registry_bindings_options_hash = GlobalRegistry::Bindings::OptionsParser.new(self).parse(options)
154
+ def global_registry_bindings_relationship_includes(_type)
155
+ include Model::Relationship
156
+ include Model::PushRelationship
74
157
  end
75
158
  end
76
159
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'global_registry_bindings/workers/delete_gr_entity_worker'
3
+ require 'global_registry_bindings/workers/delete_entity_worker'
4
4
 
5
5
  module GlobalRegistry #:nodoc:
6
6
  module Bindings #:nodoc:
7
- module Entity #:nodoc:
8
- module DeleteEntityMethods
7
+ module Model #:nodoc:
8
+ module DeleteEntity
9
9
  extend ActiveSupport::Concern
10
10
 
11
11
  included do
@@ -13,8 +13,8 @@ module GlobalRegistry #:nodoc:
13
13
  end
14
14
 
15
15
  def delete_entity_from_global_registry_async
16
- return unless global_registry.id_value?
17
- ::GlobalRegistry::Bindings::Workers::DeleteGrEntityWorker.perform_async(global_registry.id_value)
16
+ return unless global_registry_entity.id_value?
17
+ ::GlobalRegistry::Bindings::Workers::DeleteEntityWorker.perform_async(global_registry_entity.id_value)
18
18
  end
19
19
  end
20
20
  end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GlobalRegistry #:nodoc:
4
+ module Bindings #:nodoc:
5
+ module Model #:nodoc:
6
+ module Entity
7
+ extend ActiveSupport::Concern
8
+
9
+ def entity_attributes_to_push
10
+ entity_attributes = entity_columns_to_push.map do |name, type|
11
+ value_for_global_registry(name, type)
12
+ end.compact.to_h
13
+ entity_attributes[:client_integration_id] = id unless global_registry_entity.exclude_fields
14
+ .include?(:client_integration_id)
15
+ entity_attributes[:client_updated_at] = updated_at.to_s(:db) if respond_to?(:updated_at)
16
+ if global_registry_entity.parent_is_self?
17
+ entity_attributes[:parent_id] = global_registry_entity.parent_id_value
18
+ end
19
+ entity_attributes
20
+ end
21
+
22
+ def value_for_global_registry(name, type)
23
+ value = send(name)
24
+ return [name, value] if value.nil?
25
+ value = case type
26
+ when :datetime, :date
27
+ value.to_s(:db)
28
+ when :boolean
29
+ value ? 'true' : 'false'
30
+ else
31
+ value.to_s.strip
32
+ end
33
+ [name, value]
34
+ rescue ::NoMethodError
35
+ nil
36
+ end
37
+
38
+ def entity_columns_to_push
39
+ @columns_to_push ||= self
40
+ .class
41
+ .columns
42
+ .collect do |c|
43
+ { c.name.underscore.to_sym => normalize_entity_column_type(c.type, c.name) }
44
+ end # rubocop:disable Style/MultilineBlockChain
45
+ .reduce(&:merge)
46
+ .reject { |k, _v| global_registry_entity.exclude_fields.include? k }
47
+ .merge(global_registry_entity.extra_fields)
48
+ end
49
+
50
+ protected
51
+
52
+ def normalize_entity_column_type(type, name)
53
+ if type.to_s == 'text'
54
+ :string
55
+ elsif name.ends_with?('_id')
56
+ :uuid
57
+ else
58
+ type
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'global_registry_bindings/workers/pull_mdm_id_worker'
4
+
5
+ module GlobalRegistry #:nodoc:
6
+ module Bindings #:nodoc:
7
+ module Model #:nodoc:
8
+ module PullMdm
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ GlobalRegistry::Bindings::Workers.mdm_worker_class(self)
13
+ after_commit :pull_mdm_id_from_global_registry_async, on: %i[create update]
14
+ end
15
+
16
+ def pull_mdm_id_from_global_registry_async
17
+ "::GlobalRegistry::Bindings::Workers::#{global_registry_entity.mdm_worker_class_name}"
18
+ .constantize .perform_async(self.class, id)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'global_registry_bindings/workers/push_entity_worker'
4
+
5
+ module GlobalRegistry #:nodoc:
6
+ module Bindings #:nodoc:
7
+ module Model #:nodoc:
8
+ module PushEntity
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ after_commit :push_entity_to_global_registry_async, on: (global_registry_entity.push_on - %i[destroy])
13
+ end
14
+
15
+ def push_entity_to_global_registry_async
16
+ ::GlobalRegistry::Bindings::Workers::PushEntityWorker.perform_async(self.class, id)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end