mirror of
https://github.com/discourse/discourse.git
synced 2025-02-16 18:12:47 +08:00
![Loïc Guitaut](/assets/img/avatar_default.png)
This patch introduces policy objects to chat services. It allows putting more complex logic in a dedicated class, which will make services thinner. It also allows providing a reason why the policy failed. Some change has been made to the service runner too to use more easily these new policy objects: when matching a failing policy (or any failing step actually), the result object is now provided to the block. This way, instead of having to access the reason why the policy failed by doing `result["result.policy.policy_name"].reason` inside the block, this one can be simply written like this: ```ruby on_failed_policy(:policy_name) { |policy| policy.reason } ```
29 lines
755 B
Ruby
29 lines
755 B
Ruby
# frozen_string_literal: true
|
|
|
|
module Chat
|
|
class ApiController < ::Chat::BaseController
|
|
before_action :ensure_logged_in
|
|
before_action :ensure_can_chat
|
|
|
|
include Chat::WithServiceHelper
|
|
|
|
private
|
|
|
|
def ensure_can_chat
|
|
raise Discourse::NotFound unless SiteSetting.chat_enabled
|
|
guardian.ensure_can_chat!
|
|
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 |contract|
|
|
render(json: failed_json.merge(errors: contract.errors.full_messages), status: 400)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|