mirror of https://github.com/docusealco/docuseal
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.1 KiB
76 lines
2.1 KiB
# frozen_string_literal: true
|
|
|
|
module Api
|
|
class ApiBaseController < ActionController::API
|
|
include ActiveStorage::SetCurrent
|
|
include Pagy::Backend
|
|
|
|
DEFAULT_LIMIT = 10
|
|
MAX_LIMIT = 100
|
|
|
|
impersonates :user, with: ->(uuid) { User.find_by(uuid:) }
|
|
|
|
wrap_parameters false
|
|
|
|
before_action :authenticate_user!
|
|
check_authorization
|
|
|
|
rescue_from Params::BaseValidator::InvalidParameterError do |e|
|
|
render json: { error: e.message }, status: :unprocessable_entity
|
|
end
|
|
|
|
rescue_from RateLimit::LimitApproached do |e|
|
|
Rollbar.error(e) if defined?(Rollbar)
|
|
|
|
render json: { error: 'Too many requests' }, status: :too_many_requests
|
|
end
|
|
|
|
if Rails.env.production?
|
|
rescue_from CanCan::AccessDenied do |e|
|
|
render json: { error: e.message }, status: :forbidden
|
|
end
|
|
|
|
rescue_from JSON::ParserError do |e|
|
|
Rollbar.warning(e) if defined?(Rollbar)
|
|
|
|
render json: { error: "JSON parse error: #{e.message}" }, status: :unprocessable_entity
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def paginate(relation)
|
|
result = relation.order(id: :desc)
|
|
.limit([params.fetch(:limit, DEFAULT_LIMIT).to_i, MAX_LIMIT].min)
|
|
|
|
result = result.where(id: ...params[:after].to_i) if params[:after].present?
|
|
result = result.where(id: (params[:before].to_i + 1)...) if params[:before].present?
|
|
|
|
result
|
|
end
|
|
|
|
def authenticate_user!
|
|
@current_user ||=
|
|
if request.headers['X-Auth-Token'].present?
|
|
sha256 = Digest::SHA256.hexdigest(request.headers['X-Auth-Token'])
|
|
|
|
User.joins(:access_token).active.find_by(access_token: { sha256: })
|
|
end
|
|
|
|
render json: { error: 'Not authenticated' }, status: :unauthorized unless current_user
|
|
end
|
|
|
|
def current_account
|
|
current_user&.account
|
|
end
|
|
|
|
def set_cors_headers
|
|
headers['Access-Control-Allow-Origin'] = '*'
|
|
headers['Access-Control-Allow-Methods'] = 'POST, GET, PUT, PATCH, DELETE, OPTIONS'
|
|
headers['Access-Control-Allow-Headers'] = '*'
|
|
headers['Access-Control-Max-Age'] = '1728000'
|
|
headers['Access-Control-Allow-Credentials'] = true
|
|
end
|
|
end
|
|
end
|