docbrown/app/models/api_secret.rb
Fernando Valverde 2517a4dac9
Remove rack attack throttle for admin users in API requests (#18612)
* remove rack attack throttle for admin users

* Add tests

* Optimize cache admin secrets for 24h with invalidation when needed

* Make ApiSecret callback only execute on create
2022-10-25 09:26:38 -06:00

31 lines
978 B
Ruby

# @note When we destroy the related user, it's using dependent:
# :delete for the relationship. That means no before/after
# destroy callbacks will be called on this object.
class ApiSecret < ApplicationRecord
has_secure_token :secret
belongs_to :user
validates :description, presence: true, length: { maximum: 300 }
validate :user_api_secret_count
after_create_commit :clear_rack_attack_cache
private
def user_api_secret_count
return if user && user.api_secrets.count < 10
errors.add(:user, I18n.t("models.api_secret.api_limit_reached"))
end
def clear_rack_attack_cache
admin_api_secret = User.joins(:roles)
.exists?(roles: { name: Rack::Attack::ADMIN_ROLES }, users: { id: user_id })
return unless admin_api_secret
# ApiSecret that belongs to an admin should clear the Rack::Attack
# cache so they can bypass API throttling immediately
Rails.cache.delete(Rack::Attack::ADMIN_API_CACHE_KEY)
end
end