Module: Deimos::Utils::SchemaControllerMixin
- Extended by:
- ActiveSupport::Concern
- Defined in:
- lib/deimos/utils/schema_controller_mixin.rb
Overview
Mixin to automatically decode schema-encoded payloads when given the correct content type, and provide the `render_schema` method to encode the payload for responses.
Defined Under Namespace
Modules: ClassMethods
Instance Method Summary collapse
-
#decode_schema ⇒ void
Decode the payload with the parameters.
-
#parse_namespace(type) ⇒ Array<String, String>
Get the namespace from either an existing instance variable, or tease it out of the schema.
-
#render_schema(payload, schema: nil, namespace: nil) ⇒ void
Render a hash into a payload as specified by the configured schema and namespace.
- #schema_format? ⇒ Boolean
Instance Method Details
#decode_schema ⇒ void
This method returns an undefined value.
Decode the payload with the parameters.
102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'lib/deimos/utils/schema_controller_mixin.rb', line 102 def decode_schema namespace, schema = parse_namespace(:request) decoder = Deimos.schema_backend(schema: schema, namespace: namespace) @payload = decoder.decode(request.body.read).with_indifferent_access @payload.each do |key, value| Deimos.config.tracer&.set_tag("body.#{key}", value) end if Deimos.config.schema.use_schema_classes @payload = Utils::SchemaClass.instance(@payload, schema, namespace) end request.body.rewind if request.body.respond_to?(:rewind) end |
#parse_namespace(type) ⇒ Array<String, String>
Get the namespace from either an existing instance variable, or tease it out of the schema.
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/deimos/utils/schema_controller_mixin.rb', line 82 def parse_namespace(type) namespace = self.class.namespaces[type] schema = self.class.schema_mapping[params['action']][type] if schema.nil? raise "No #{type} schema defined for #{params[:controller]}##{params[:action]}!" end if namespace.nil? last_period = schema.rindex('.') namespace, schema = schema.split(last_period) end if namespace.nil? || schema.nil? raise "No request namespace defined for #{params[:controller]}##{params[:action]}!" end [namespace, schema] end |
#render_schema(payload, schema: nil, namespace: nil) ⇒ void
This method returns an undefined value.
Render a hash into a payload as specified by the configured schema and namespace.
120 121 122 123 124 125 126 |
# File 'lib/deimos/utils/schema_controller_mixin.rb', line 120 def render_schema(payload, schema: nil, namespace: nil) namespace, schema = parse_namespace(:response) if !schema && !namespace encoder = Deimos.schema_backend(schema: schema, namespace: namespace) encoded = encoder.encode(payload.to_h, topic: "#{namespace}.#{schema}") response.headers['Content-Type'] = encoder.class.content_type send_data(encoded) end |
#schema_format? ⇒ Boolean
75 76 77 |
# File 'lib/deimos/utils/schema_controller_mixin.rb', line 75 def schema_format? request.content_type == Deimos.schema_backend_class.content_type end |