class Sails::Service::Interface
Attributes
services[RW]
Public Class Methods
new()
click to toggle source
# File lib/sails/service/interface.rb, line 6 def initialize @services = [] Dir["#{Sails.root.join("app/services")}/*_service.rb"].each do |f| if File.basename(f) =~ /^(.*)_service.rb$/ require f mtd = $1.dup klass_name = "#{mtd.camelize}Service" @services << klass_name.constantize.new end end define_service_methods! end
Private Instance Methods
define_service_methods!()
click to toggle source
# File lib/sails/service/interface.rb, line 20 def define_service_methods! @services.each do |instance| instance.action_methods.each do |method_name| self.class.send(:define_method, method_name) do |*args, &block| run_action(instance, method_name, *args, &block) end end end end
run_action(instance, method_name, *args, &block)
click to toggle source
# File lib/sails/service/interface.rb, line 39 def run_action(instance, method_name, *args, &block) set_params_with_method_args(instance, method_name, args) instance.run_callbacks :action do raw_payload = { controller: instance.class.to_s, action: method_name, params: instance.params, } ActiveSupport::Notifications.instrument("start_processing.sails", raw_payload.dup) ActiveSupport::Notifications.instrument("process_action.sails", raw_payload) do |payload| begin res = instance.send(method_name, *args, &block) payload[:status] = 200 return res rescue Thrift::Exception => e payload[:status] = e.try(:code) raise e rescue => e if e.class.to_s == "ActiveRecord::RecordNotFound" payload[:status] = 404 else payload[:status] = 500 Sails.logger.info " ERROR #{e.inspect} backtrace: \n #{e.backtrace.join("\n ")}" end instance.raise_error(payload[:status]) ensure ActiveRecord::Base.clear_active_connections! if defined?(ActiveRecord::Base) if defined?(ActiveRecord::RuntimeRegistry) payload[:db_runtime] = ActiveRecord::RuntimeRegistry.sql_runtime || 0 else payload[:db_runtime] = nil end end end end end
set_params_with_method_args(instance, method_name, args)
click to toggle source
# File lib/sails/service/interface.rb, line 30 def set_params_with_method_args(instance, method_name, args) instance.params.clear method_args = instance.method(method_name.to_sym).parameters.map { |arg| arg[1] } instance.params[:method_name] = method_name method_args.each_with_index do |arg, idx| instance.params[arg] = args[idx] end end