Module: Quail::Resource::SubscriptionBuilder
- Defined in:
- lib/quail/resource/subscription_builder.rb
Overview
Builds GraphQL subscription fields for a resource based on its subscription definitions.
Class Method Summary collapse
- .apply_scope(sub_class, scope) ⇒ Object
- .build_subscription_class(type_class, model_name, event, config) ⇒ Object
- .call(resource_class) ⇒ Object
-
.define_hash_rehydration(sub_class, model_class) ⇒ Object
Rehydrate Hash payloads (e.g. from delete snapshots) into model instances so computed attributes that call associations still work.
Class Method Details
.apply_scope(sub_class, scope) ⇒ Object
45 46 47 48 49 50 |
# File 'lib/quail/resource/subscription_builder.rb', line 45 def self.apply_scope(sub_class, scope) return unless scope scope_key = scope.is_a?(Hash) ? scope.keys.first.to_sym : scope.to_sym sub_class.argument scope_key, GraphQL::Types::ID, required: true end |
.build_subscription_class(type_class, model_name, event, config) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/quail/resource/subscription_builder.rb', line 23 def self.build_subscription_class(type_class, model_name, event, config) sub_class = Class.new(GraphQL::Schema::Subscription) do graphql_name "#{model_name}#{event.to_s.capitalize}d" description "Triggered when a #{model_name} is #{event}d" payload_type type_class end define_hash_rehydration(sub_class, model_name.constantize) apply_scope(sub_class, config[:scope]) sub_class end |
.call(resource_class) ⇒ Object
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# File 'lib/quail/resource/subscription_builder.rb', line 7 def self.call(resource_class) subs = resource_class.subscription_definitions return {} if subs.empty? model_name = resource_class.model_class.name type_class = resource_class.graphql_type fields = {} subs.each do |event, config| field_name = :"#{model_name.underscore}_#{event}d" fields[field_name] = build_subscription_class(type_class, model_name, event, config) end fields end |
.define_hash_rehydration(sub_class, model_class) ⇒ Object
Rehydrate Hash payloads (e.g. from delete snapshots) into model instances so computed attributes that call associations still work.
37 38 39 40 41 42 43 |
# File 'lib/quail/resource/subscription_builder.rb', line 37 def self.define_hash_rehydration(sub_class, model_class) sub_class.define_method(:update) do |**_args| return object unless object.is_a?(Hash) model_class.new(object).tap(&:readonly!) end end |