mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-09-07 21:55:20 +08:00
141 lines
4.4 KiB
Ruby
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
|