Module: Deimos::Utils::SchemaControllerMixin
- Extended by:
- ActiveSupport::Concern
- Defined in:
- lib/deimos/utils/schema_controller_mixin.rb,
sig/defs.rbs
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.
@param type — :request or :response
@return — the namespace and 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.
@param payload
@param schema
@param 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 |