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 |