mini_api
Advanced tools
| # frozen_string_literal: true | ||
| require 'mini_api/config' | ||
| require 'mini_api/exceptions/case_transform_option_invalid' | ||
| module MiniApi | ||
| module CaseTransform | ||
| module_function | ||
| def transform(object, transform_to = :snake_case) | ||
| object.deep_transform_keys do |key| | ||
| case transform_to | ||
| when :camel_case | ||
| key.to_s.camelize | ||
| when :camel_lower | ||
| key.to_s.camelize(:lower) | ||
| when :snake_case | ||
| key.to_s.underscore | ||
| else | ||
| raise CaseTransformOptionInvalid, "option #{transform_to} is not supported." | ||
| end | ||
| end | ||
| end | ||
| def request_params_keys(params) | ||
| transform(params, Config.transform_params_keys_to) | ||
| end | ||
| def response_keys(response) | ||
| transform(response, Config.transform_response_keys_to) | ||
| end | ||
| end | ||
| end |
| # frozen_string_literal: true | ||
| module MiniApi | ||
| class Config | ||
| include ActiveSupport::Configurable | ||
| # permitted values are: [:camel_case, :camel_lower, snake_case] | ||
| config_accessor :transform_params_keys_to, instance_accessor: false, default: :snake_case | ||
| config_accessor :transform_response_keys_to, instance_accessor: false, default: :snake_case | ||
| end | ||
| end |
| # frozen_string_literal: true | ||
| module MiniApi | ||
| class CaseTransformOptionInvalid < StandardError; end | ||
| end |
+14
-0
@@ -5,5 +5,19 @@ # frozen_string_literal: true | ||
| require 'mini_api/responder' | ||
| require 'mini_api/case_transform' | ||
| # Entrypoint module | ||
| module MiniApi | ||
| extend ActiveSupport::Concern | ||
| included do | ||
| include CaseTransform | ||
| before_action :transform_params | ||
| def transform_params | ||
| self.params = | ||
| ActionController::Parameters.new(CaseTransform.request_params_keys(request.parameters)) | ||
| end | ||
| end | ||
| def render_json(resource, options = {}) | ||
@@ -10,0 +24,0 @@ responder = Responder.new(self, resource, options) |
| # frozen_string_literal: true | ||
| require 'mini_api/case_transform' | ||
| module MiniApi | ||
@@ -14,6 +16,8 @@ class DefaultResponder | ||
| data = transform_keys | ||
| @controller.render( | ||
| json: { | ||
| success: success, | ||
| data: @resource, | ||
| data: data, | ||
| message: @options[:message] || nil | ||
@@ -24,3 +28,19 @@ }, | ||
| end | ||
| private | ||
| def transform_keys | ||
| return CaseTransform.response_keys(@resource) if @resource.is_a?(Hash) | ||
| return @resource unless @resource.is_a?(Array) | ||
| @resource.map do |item| | ||
| if item.is_a?(Hash) | ||
| CaseTransform.response_keys(item) | ||
| else | ||
| item | ||
| end | ||
| end | ||
| end | ||
| end | ||
| end |
| # frozen_string_literal: true | ||
| require 'mini_api/serialization' | ||
| require 'mini_api/case_transform' | ||
@@ -33,2 +34,4 @@ module MiniApi | ||
| body = CaseTransform.response_keys(body) | ||
| @controller.render json: body, status: status_code | ||
@@ -35,0 +38,0 @@ end |
@@ -5,2 +5,3 @@ # frozen_string_literal: true | ||
| require 'mini_api/serialization' | ||
| require 'mini_api/case_transform' | ||
@@ -20,2 +21,6 @@ module MiniApi | ||
| meta = CaseTransform.response_keys(meta) | ||
| collection = transform_case(collection.as_json) | ||
| @controller.render json: { | ||
@@ -45,2 +50,6 @@ success: @options[:success] || true, | ||
| def transform_case(collection) | ||
| collection.map { |item| CaseTransform.response_keys(item) } | ||
| end | ||
| def transform_resource_to_collection | ||
@@ -47,0 +56,0 @@ unless defined?(Kaminari) |
| # frozen_string_literal: true | ||
| module MiniApi | ||
| VERSION = '0.1.2' | ||
| VERSION = '0.1.3' | ||
| end |
+15
-0
@@ -12,2 +12,3 @@  | ||
| - [Success and failure actions](#success-and-failure-actions) | ||
| - [Transform keys](#transform-keys) | ||
| - [Overriding response](#overriding-response) | ||
@@ -145,2 +146,16 @@ - [Pagination](#pagination) | ||
| ### Transform keys | ||
| It is possible to transform the keys of request and response. By default, will transform to `snake_case`, but the possible values are `snake_case`, `camel_lower` and `camel_case` | ||
| To change the transform operation, simply adds a initializer on initilizations folder with content: | ||
| ```ruby | ||
| MiniApi::Config.configure do |config| | ||
| config.transform_params_keys_to = :snake_case | ||
| config.transform_response_keys_to = :camel_lower | ||
| end | ||
| ``` | ||
| The option `transform_params_keys_to` will transform request params. | ||
| The option `transform_response_keys_to` will transform responses. | ||
| ## Overriding response | ||
@@ -147,0 +162,0 @@ |