Я использую pundit для обработки своих политик API, у меня есть элемент шоу, который в некоторых случаях может быть запрещен пользователю, а в других - просто запрещен. Под ограничением я имею в виду, что теперь это запрещено, но если он заплатит, он сможет получить к нему доступ. Поэтому мне нужно, чтобы мой API отвечал определенным кодом (402 Payment Required
), чтобы клиент мог пригласить пользователя заплатить, чтобы разблокировать шоу.
Это мой текущий код, он отвечает только 403
, когда pundit возвращает false.
Где было бы лучше реализовать условие возврата 403
ИЛИ 402
, чтобы быть СУХИМ и чистым?
class Api::V1::ItemController < Api::V1::BaseController
def show
@item = Item.find(params[:id])
authorize @item
end
end
class ItemPolicy < ApplicationPolicy
def show?
return true if record.public?
# 403 will be generated, that's ok.
return false if !record.band.members.include?(user)
# If that condition is false I want to generate a 402 error at the end, not a 403.
user.premium?
end
end
class Api::V1::BaseController < ActionController::API
include Pundit
rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
def user_not_authorized(_exception)
# Here I've got the exception with :policy, :record and :query,
# also I can access :current_user so I could go for a condition,
# but that would include duplicated code from ItemPolicy#show?.
render json: { error: { message: "Access denied" } }, status: :forbidden
end
end