lib/isomorfeus/operation/handler/operation_handler.rb in isomorfeus-operation-1.0.0.epsilon1 vs lib/isomorfeus/operation/handler/operation_handler.rb in isomorfeus-operation-1.0.0.epsilon2

- old
+ new

@@ -1,37 +1,43 @@ +# frozen_string_literal: true + module Isomorfeus module Operation module Handler class OperationHandler < LucidHandler::Base - on_request do |pub_sub_client, session_id, current_user, request, response| + on_request do |pub_sub_client, current_user, request, response| result = { error: 'No such thing' } # promise_send_path('Isomorfeus::Operation::Handler::OperationHandler', self.to_s, props_hash) - request.keys.each do |operation_class_name| + request.each_key do |operation_class_name| if Isomorfeus.valid_operation_class_name?(operation_class_name) operation_class = Isomorfeus.cached_operation_class(operation_class_name) if operation_class props_json = request[operation_class_name] begin props = Oj.load(props_json, mode: :strict) - props.merge!({pub_sub_client: pub_sub_client, session_id: session_id, current_user: current_user}) - operation_promise = operation_class.promise_run(props) - if operation_promise.realized? - result = { success: 'ok' , result: operation_promise.value } - else - start = Time.now - timeout = false - while !operation_promise.realized? - if (Time.now - start) > 20 - timeout = true - break + props.merge!({pub_sub_client: pub_sub_client, current_user: current_user}) + if current_user.authorized?(operation_class, :promise_run, *props) + operation_promise = operation_class.promise_run(props) + if operation_promise.realized? + result = { success: 'ok' , result: operation_promise.value } + else + start = Time.now + timeout = false + while !operation_promise.realized? + if (Time.now - start) > 20 + timeout = true + break + end + sleep 0.01 end - sleep 0.01 + if timeout + result = { error: 'Timeout' } + else + result = { success: 'ok' , result: operation_promise.value } + end end - if timeout - result = { error: 'Timeout' } - else - result = { success: 'ok' , result: operation_promise.value } - end + else + result = { error: 'Access denied!' } end rescue Exception => e result = if Isomorfeus.production? { error: { operation_class_name => 'No such thing!' }} else