Initial commit
This commit is contained in:
132
app/api/v2/management/labels.rb
Normal file
132
app/api/v2/management/labels.rb
Normal file
@@ -0,0 +1,132 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module API::V2
|
||||
module Management
|
||||
# Labels-related API
|
||||
class Labels < Grape::API
|
||||
helpers ::API::V2::NamedParams
|
||||
|
||||
helpers do
|
||||
def user
|
||||
@user ||= User.find_by!(uid: params[:user_uid])
|
||||
end
|
||||
|
||||
def permitted_search_params(params)
|
||||
params.slice(:key, :value, :from, :to, :range, :scope)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Label related routes'
|
||||
resource :labels do
|
||||
desc 'Get all labels assigned to users' do
|
||||
@settings[:scope] = :read_users
|
||||
success API::V2::Entities::User
|
||||
end
|
||||
params do
|
||||
requires :key, type: String, allow_blank: false, desc: 'Label key.'
|
||||
optional :value, type: String, allow_blank: false, desc: 'Label value.'
|
||||
optional :scope, type: String, allow_blank: false, desc: 'Label scope.'
|
||||
optional :extended,
|
||||
type: { value: Boolean, message: 'Non boolean extended value' },
|
||||
default: false,
|
||||
desc: 'When true endpoint returns full information about users'
|
||||
optional :range,
|
||||
type: String,
|
||||
values: { value: ->(p) { %w[created updated].include?(p) }, message: 'Invalid range' },
|
||||
default: 'created'
|
||||
|
||||
use :pagination_filters
|
||||
end
|
||||
post '/filter/users' do
|
||||
entity = params[:extended] ? API::V2::Entities::UserWithProfile : API::V2::Entities::User
|
||||
users = API::V2::Queries::UserWithLabelFilter.new(User.all).call(permitted_search_params(params))
|
||||
|
||||
present paginate(users), with: entity
|
||||
|
||||
status 200
|
||||
end
|
||||
|
||||
desc 'Get user collection filtered on label attributes' do
|
||||
@settings[:scope] = :read_labels
|
||||
success API::V2::Entities::AdminLabelView
|
||||
end
|
||||
params do
|
||||
requires :user_uid, type: String, allow_blank: false, desc: 'User uid'
|
||||
end
|
||||
post '/list' do
|
||||
present user.labels, with: API::V2::Entities::AdminLabelView
|
||||
end
|
||||
|
||||
desc "Create a label with 'private' scope and assigns to users" do
|
||||
@settings[:scope] = :write_labels
|
||||
success API::V2::Entities::Label
|
||||
end
|
||||
params do
|
||||
requires :user_uid, type: String, allow_blank: false, desc: 'User uid'
|
||||
requires :key, type: String, allow_blank: false, desc: 'Label key.'
|
||||
requires :value, type: String, allow_blank: false, desc: 'Label value.'
|
||||
optional :description, type: String, allow_blank: false, desc: 'Label desc.'
|
||||
end
|
||||
post do
|
||||
label = user.labels.create(key: params[:key],
|
||||
value: params[:value],
|
||||
description: params[:description],
|
||||
scope: 'private')
|
||||
if label.errors.any?
|
||||
error!(label.errors.as_json(full_messages: true), 422)
|
||||
end
|
||||
|
||||
present label, with: API::V2::Entities::Label
|
||||
end
|
||||
|
||||
desc "Update a label with 'private' scope" do
|
||||
@settings[:scope] = :write_labels
|
||||
success API::V2::Entities::Label
|
||||
end
|
||||
params do
|
||||
requires :user_uid, type: String, allow_blank: false, desc: 'User uid'
|
||||
requires :key, type: String, allow_blank: false, desc: 'Label key.'
|
||||
requires :value, type: String, allow_blank: false, desc: 'Label value.'
|
||||
optional :description, type: String, allow_blank: false, desc: 'Label desc.'
|
||||
optional :replace, type: Boolean, default: true, desc: 'When true label will be created if not exist'
|
||||
end
|
||||
put do
|
||||
label = user.labels.find_by(key: params[:key], scope: 'private')
|
||||
|
||||
if label.nil?
|
||||
if params[:replace]
|
||||
label = Label.create(
|
||||
user_id: user.id,
|
||||
key: params[:key],
|
||||
value: params[:value],
|
||||
description: params[:description],
|
||||
scope: params[:scope] || 'private'
|
||||
)
|
||||
else
|
||||
error!({ error: 'label doesnt exist' }, 404)
|
||||
end
|
||||
else
|
||||
label.update({ value: params[:value], description: params[:description] }.compact)
|
||||
end
|
||||
|
||||
error!(label.errors.as_json(full_messages: true), 422) if label.errors.any?
|
||||
|
||||
present label, with: API::V2::Entities::Label
|
||||
end
|
||||
|
||||
desc "Delete a label with 'private' scope" do
|
||||
@settings[:scope] = :write_labels
|
||||
end
|
||||
params do
|
||||
requires :user_uid, type: String, allow_blank: false, desc: 'User uid'
|
||||
requires :key, type: String, allow_blank: false, desc: 'Label key.'
|
||||
end
|
||||
post '/delete' do
|
||||
user.labels.find_by!(key: params[:key], scope: 'private').destroy
|
||||
|
||||
status 204
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user