scinote-web/app/controllers/users/settings/user_groups_controller.rb

141 lines
4.4 KiB
Ruby

# frozen_string_literal: true
module Users
module Settings
class UserGroupsController < ApplicationController
before_action :load_team
before_action :set_breadcrumbs_items, only: %i(index show)
before_action :check_user_groups_enabled, except: :users
before_action :load_user_group, except: %i(index unassigned_users actions_toolbar create)
before_action :check_read_permissions, only: %i(users)
before_action :check_manage_permissions, except: %i(users)
def index
respond_to do |format|
format.html do
@active_tab = :user_groups
end
format.json do
user_groups = Lists::UserGroupsService.new(@team.user_groups, params).call
render json: user_groups, each_serializer: Lists::UserGroupSerializer, user: current_user, meta: pagination_dict(user_groups)
end
end
end
def actions_toolbar
render json: {
actions:
Toolbars::UserGroupsService.new(
current_user,
@team,
user_group_ids: JSON.parse(params[:items]).pluck('id')
).actions
}
end
def unassigned_users
@unassigned_users = @team.users.search(false, params[:query])
if params[:user_group_id].present?
@user_group = @team.user_groups.find(params[:user_group_id])
@unassigned_users = @unassigned_users.where.not(id: @user_group.users.select(:id))
end
end
def show
@active_tab = :user_groups
end
def create
@user_group = @team.user_groups.new
@user_group.created_by = current_user
@user_group.last_modified_by = current_user
@user_group.assign_attributes(user_group_params)
if @user_group.save
log_activity(:create_user_group)
@user_group.users.each do |user|
log_activity(:add_group_user_member, { user_target: user.id })
end
render json: { message: t('user_groups.create.success') }, status: :created
else
render json: { error: @user_group.errors.full_messages.join(", ") }, status: :unprocessable_entity
end
end
def update
ActiveRecord::Base.transaction do
@user_group.last_modified_by = current_user
@user_group.assign_attributes(user_group_params)
@user_group.save!
log_activity(:update_user_group)
render json: {}, status: :ok
rescue ActiveRecord::RecordInvalid => e
render json: { errors: e.message }, status: :unprocessable_entity
raise ActiveRecord::Rollback
end
end
def destroy
log_activity(:delete_user_group)
if @user_group.destroy
render json: { message: t('user_groups.delete.success') }, status: :ok
else
render json: { errors: t('user_groups.delete.error') }, status: :unprocessable_entity
end
end
def users
render json: @user_group.users, each_serializer: UserSerializer, user: current_user
end
private
def check_user_groups_enabled
@active_tab = :user_groups
render '/users/settings/user_groups/promo' unless UserGroup.enabled?
end
def user_group_params
params.require(:user_group).permit(
:name,
user_group_memberships_attributes: %i(id user_id)
)
end
def load_team
@team = Team.find(params[:team_id])
end
def load_user_group
@user_group = @team.user_groups.find(params[:user_group_id] || params[:id])
end
def check_read_permissions
render_403 unless can_read_team?(@team)
end
def check_manage_permissions
render_403 unless can_manage_team?(@team)
end
def log_activity(type_of, message_items = {})
Activities::CreateActivityService
.call(activity_type: type_of,
owner: current_user,
subject: @user_group.team,
team: @user_group.team,
message_items: {
user_group: @user_group.id,
team: @user_group.team.id
}.merge(message_items))
end
def set_breadcrumbs_items
@breadcrumbs_items = [
{ label: t('breadcrumbs.teams'), url: teams_path },
{ label: @team.name, url: team_path(@team) }
]
end
end
end
end