178 lines
7.1 KiB
Ruby
178 lines
7.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module API
|
|
module V2
|
|
module Admin
|
|
# Admin functionality over restrictions table
|
|
class Restrictions < Grape::API
|
|
resource :restrictions do
|
|
helpers ::API::V2::NamedParams
|
|
|
|
desc 'Returns array of restrictions as a paginated collection',
|
|
failure: [
|
|
{ code: 401, message: 'Invalid bearer token' }
|
|
],
|
|
success: API::V2::Entities::Restriction
|
|
params do
|
|
optional :scope,
|
|
allow_blank: false,
|
|
values: { value: -> { Restriction::SCOPES }, message: 'admin.restriction.invalid_scope'}
|
|
optional :category,
|
|
allow_blank: false,
|
|
values: { value: -> { Restriction::CATEGORIES }, message: 'admin.restriction.invalid_category'}
|
|
optional :range,
|
|
type: String,
|
|
values: { value: ->(p) { %w[created updated].include?(p) }, message: 'admin.restriction.invalid_range' },
|
|
default: 'created'
|
|
use :pagination_filters
|
|
end
|
|
get do
|
|
admin_authorize! :read, Restriction
|
|
|
|
restrictions = Restriction.all
|
|
restrictions = params[:category] ? restrictions.where(category: params[:category]) : restrictions
|
|
restrictions = params[:scope] ? restrictions.where(scope: params[:scope]) : restrictions
|
|
restrictions = params[:to] ? restrictions.where("#{params[:range]}_at <= ?", Time.at(params[:to].to_i)) : restrictions
|
|
restrictions = params[:from] ? restrictions.where("#{params[:range]}_at >= ?", Time.at(params[:from].to_i)) : restrictions
|
|
|
|
present paginate(restrictions), with: API::V2::Entities::Restriction
|
|
end
|
|
|
|
desc 'Create whitelink',
|
|
failure: [
|
|
{ code: 401, message: 'Invalid bearer token' }
|
|
],
|
|
success: { code: 200, message: 'Created whitelink' }
|
|
params do
|
|
optional :expire_time,
|
|
allow_blank: false,
|
|
default: 1,
|
|
values: { value: 1..30, message: 'invalid_expire' },
|
|
type: Integer,
|
|
desc: 'link will be active for (Time.now + expire_time in following range)'
|
|
optional :range,
|
|
allow_blank: false,
|
|
default: 'day',
|
|
values: { value: ->(p) { %w[day hour].include?(p) }, message: 'invalid_range' },
|
|
type: String,
|
|
desc: 'In combination with expire_time gives full controll over token expiration'
|
|
end
|
|
post '/whitelink' do
|
|
admin_authorize! :create, Restriction
|
|
|
|
whitelink_token = Digest::SHA256.hexdigest(SecureRandom.hex(10))
|
|
|
|
expires_in = params[:range] == 'day' ? params[:expire_time].days : params[:expire_time].hours
|
|
Rails.cache.write(whitelink_token, 'active', expires_in: expires_in)
|
|
|
|
response = { whitelink_token: whitelink_token }
|
|
present response
|
|
end
|
|
|
|
desc 'Create restriction',
|
|
failure: [
|
|
{ code: 401, message: 'Invalid bearer token' }
|
|
],
|
|
success: { code: 200, message: 'Restriction was created' }
|
|
params do
|
|
requires :scope,
|
|
allow_blank: false,
|
|
values: { value: -> { Restriction::SCOPES }, message: 'admin.restriction.invalid_scope'}
|
|
requires :value,
|
|
allow_blank: false
|
|
requires :category,
|
|
type: String,
|
|
values: { value: -> { Restriction::CATEGORIES }, message: 'admin.restriction.invalid_category'},
|
|
allow_blank: false
|
|
optional :state,
|
|
default: 'enabled',
|
|
allow_blank: false,
|
|
values: { value: -> { Restriction::STATES }, message: 'admin.restriction.invalid_state' }
|
|
optional :code,
|
|
type: Integer,
|
|
allow_blank: false
|
|
end
|
|
post do
|
|
admin_authorize! :create, Restriction
|
|
|
|
restriction = Restriction.new(declared(params, include_missing: false))
|
|
|
|
code_error!(restriction.errors.details, 422) unless restriction.save
|
|
|
|
# clear cached restrictions, so they will be freshly refetched on the next call to /auth
|
|
Rails.cache.delete('restrictions')
|
|
status 200
|
|
end
|
|
|
|
desc 'Update restriction',
|
|
failure: [
|
|
{ code: 401, message: 'Invalid bearer token' }
|
|
],
|
|
success: { code: 200, message: 'Restriction was updated' }
|
|
params do
|
|
requires :id,
|
|
type: Integer,
|
|
allow_blank: false,
|
|
desc: 'Restriction id'
|
|
optional :scope,
|
|
allow_blank: false,
|
|
values: { value: -> { Restriction::SCOPES }, message: 'admin.restriction.invalid_scope' }
|
|
optional :category,
|
|
type: String,
|
|
values: { value: -> { Restriction::CATEGORIES }, message: 'admin.restriction.invalid_category'},
|
|
allow_blank: false
|
|
optional :value,
|
|
allow_blank: false
|
|
optional :state,
|
|
allow_blank: false,
|
|
values: { value: -> { Restriction::STATES }, message: 'admin.restriction.invalid_state' }
|
|
optional :code,
|
|
type: Integer,
|
|
allow_blank: false
|
|
end
|
|
put do
|
|
admin_authorize! :update, Restriction
|
|
|
|
target_restriction = Restriction.find_by(id: params[:id])
|
|
|
|
error!({ errors: ['admin.restriction.doesnt_exist'] }, 404) if target_restriction.nil?
|
|
|
|
unless target_restriction.update(declared(params, include_missing: false))
|
|
code_error!(target_restriction.errors.details, 422)
|
|
end
|
|
|
|
# clear cached restrictions, so they will be freshly refetched on the next call to /auth
|
|
Rails.cache.delete('restrictions')
|
|
status 200
|
|
end
|
|
|
|
desc 'Delete restriction',
|
|
failure: [
|
|
{ code: 401, message: 'Invalid bearer token' }
|
|
],
|
|
success: { code: 200, message: 'Restriction was deleted' }
|
|
params do
|
|
requires :id,
|
|
type: Integer,
|
|
allow_blank: false,
|
|
desc: 'Restriction id'
|
|
end
|
|
delete do
|
|
admin_authorize! :destroy, Restriction
|
|
|
|
target_restriction = Restriction.find_by(id: params[:id])
|
|
|
|
error!({ errors: ['admin.restriction.doesnt_exist'] }, 404) if target_restriction.nil?
|
|
|
|
target_restriction.destroy
|
|
# clear cached restrictions, so they will be freshly refetched on the next call to /auth
|
|
Rails.cache.delete('restrictions')
|
|
|
|
status 200
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|