38 lines
1.1 KiB
Ruby
38 lines
1.1 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
module Chat
|
||
|
module WithServiceHelper
|
||
|
def result
|
||
|
@_result
|
||
|
end
|
||
|
|
||
|
def with_service(service, default_actions: true, **dependencies, &block)
|
||
|
controller = self
|
||
|
merged_block =
|
||
|
proc do
|
||
|
instance_eval(&controller.default_actions_for_service) if default_actions
|
||
|
instance_eval(&(block || proc {}))
|
||
|
end
|
||
|
Chat::Endpoint.call(service, controller, **dependencies, &merged_block)
|
||
|
end
|
||
|
|
||
|
def run_service(service, dependencies)
|
||
|
@_result = service.call(params.to_unsafe_h.merge(guardian: guardian, **dependencies.to_h))
|
||
|
end
|
||
|
|
||
|
def default_actions_for_service
|
||
|
proc do
|
||
|
on_success { render(json: success_json) }
|
||
|
on_failure { render(json: failed_json, status: 422) }
|
||
|
on_failed_policy(:invalid_access) { raise Discourse::InvalidAccess }
|
||
|
on_failed_contract do
|
||
|
render(
|
||
|
json:
|
||
|
failed_json.merge(errors: result[:"result.contract.default"].errors.full_messages),
|
||
|
status: 400,
|
||
|
)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|