Narazaka/sana-mvcbase

View on GitHub
lib/sana_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'sana'

# Sana Controller
class SanaController
  # constructor
  # @param [SanaRouter::Events] events events
  # @param [Symbol] event_id event id
  # @param [OpenStruct] request request
  # @param [Hash<Symbol, Integer>] mapping request argument mappings
  def initialize(events, event_id, request, mapping = {})
    @events = events
    @event_id = event_id
    @request = request
    @mapping = mapping
  end

  # events
  # @return [SanaRouter::Events]
  attr_reader :events
  # event id
  # @return [Symbol]
  attr_reader :event_id
  # request
  # @return [OpenStruct]
  attr_reader :request

  # named access to request headers
  # @return [SanaController::Params] params
  def params
    @params ||= Params.new(request, @mapping)
  end

  # exec action and get response
  # @return [String, Openstruct] response
  def action
    @return_value = public_send(@event_id)
    if @response
      @response
    else
      render
    end
  end

  private

  # render result
  # @param args various result options
  # @return [String, Openstruct] response
  def render(*args)
    @response = render_response(*args)
  end

  # render raw normal response (200 OK or 204 No Content)
  # @param [String] value Value header content
  # @param [String] to Reference0 header content (for communication)
  # @return [OpenStruct] response
  def render_ok(value = nil, to = nil)
    @response = Sana::ResponseHelper.ok(value, to)
  end

  # render 204 No Content
  # @return [OpenStruct] response
  def render_no_content
    @response = Sana::ResponseHelper.no_content
  end

  # render 400 Bad Request
  # @return [OpenStruct] response
  def render_bad_request
    @response = Sana::ResponseHelper.bad_request
  end

  # render 500 Internal Server Error
  # @return [OpenStruct] response
  def render_internal_server_error
    @response = Sana::ResponseHelper.internal_server_error
  end

  # make result by given options
  # @param args various result options
  # @return [String, Openstruct] response
  # @note this method should be overridden for convenient view rendering
  # @example override
  #   class HogeViewController < SanaController
  #     def render_response(value = nil)
  #       # @return_value is event method's return value
  #       eval (value || @return_value)
  #     end
  #   end
  def render_response(*args)
    args[0] || @return_value
  end

  # named access to request headers
  class Params
    # constructor
    # @param [OpenStruct] request request
    # @param [Hash<Symbol, Integer>] mapping request argument mappings
    # @example mapping
    #   params = SanaController::Params.new(request, {shell_name: 0, halted: 6, halted_ghost_name: 7}) # mapping for Reference0, 6 and 7
    def initialize(request, mapping = {})
      @request = request
      @mapping = mapping
    end

    # named access to the header
    # @example named access
    #   params.shell_name == params.Reference0
    # @param [Symbol] method param name
    # @return [String] header value
    def method_missing(method)
      @request[method] || @request["Reference#{@mapping[method]}".to_sym]
    end
  end
end

# Sana Controller (any event accepted)
class SanaAnyEventController < SanaController
  # SHIORI request()
  # @param [Symbol] method method name = event id
  def method_missing(method)
    render
  end
end