Sha256: 11034b9649ff6b4a88ebbe9a87c53ba64bb589a18887c903ec555570db1a43d9

Contents?: true

Size: 1.83 KB

Versions: 2

Compression:

Stored size: 1.83 KB

Contents

# frozen_string_literal: true

module JsonRenderer
  extend ActiveSupport::Concern

  class DataSanitizer
    def initialize(object, options, api_version)
      @object = object
      @options = options
      @root = options[:root]
      @api_version = api_version
    end

    def sanitize
      case object
      when ActiveRecord::Relation, Array
        @root ||= klass_name.tableize
        {root => sanitized_array_data}
      when Hash
        root ? {root => sanitized_data} : sanitized_data
      else
        @root ||= klass_name.underscore
        {root => sanitized_data}
      end
    end

    private

    attr_reader :object, :options, :api_version, :root

    def sanitized_data
      @sanitized_data ||= serializer.new object, opts
    end

    def sanitized_array_data
      @sanitized_array_data = ActiveModel::Serializer::CollectionSerializer.new(object, opts)
    end

    def klass_name
      @klass_name ||= (object.respond_to?(:klass) ? object.klass : object.class).name
    end

    def serializer
      @serializer ||=
        unless klass_name == Array.name
          options[:serializer] || "Api::#{api_version}::#{klass_name}Serializer".constantize
        end
    end

    def opts
      @opts ||= options.except(:success, :status, :meta, :root).merge namespace: "Api::#{api_version}"
    end
  end

  protected

  included do
    def render_jsonapi(object, options = {})
      success = options.fetch :success, true
      meta = options.fetch :meta, {}
      status = options.fetch :status, :ok
      data_serializer = DataSanitizer.new(object, options, api_version).sanitize

      response_data = {
        success: success,
        data: data_serializer,
        meta: meta
      }
      render json: response_data, status: status
    end
  end

  def api_version
    @api_version ||= request.path.split("/")[2].upcase.capitalize
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
n_base_rails-0.1.2 lib/controllers/concerns/json_renderer.rb
n_base_rails-0.1.1 lib/controllers/concerns/json_renderer.rb