scinote-web/app/controllers/repository_columns_controller.rb
2019-11-29 10:19:10 +01:00

288 lines
8.8 KiB
Ruby

class RepositoryColumnsController < ApplicationController
include InputSanitizeHelper
include RepositoryColumnsHelper
ACTIONS = %i(
create index create_html available_asset_type_columns available_columns
).freeze
before_action :load_vars,
except: ACTIONS
before_action :load_vars_nested,
only: ACTIONS
before_action :check_create_permissions, only: :create
before_action :check_manage_permissions,
except: ACTIONS
before_action :load_repository_columns, only: :index
before_action :load_asset_type_columns, only: :available_asset_type_columns
def index; end
def create_html
@repository_column = RepositoryColumn.new
respond_to do |format|
format.json do
render json: {
html: render_to_string(
partial: 'repository_columns/manage_column_modal_content.html.erb'
)
}
end
end
end
def create
@repository_column = RepositoryColumn.new(repository_column_params)
@repository_column.repository = @repository
@repository_column.created_by = current_user
respond_to do |format|
format.json do
if @repository_column.save
log_activity(:create_column_inventory)
if generate_repository_list_items(params[:list_items])
render json: {
id: @repository_column.id,
name: escape_input(@repository_column.name),
message: t('libraries.repository_columns.create.success_flash',
name: @repository_column.name),
edit_url:
edit_repository_repository_column_path(@repository,
@repository_column),
update_url:
repository_repository_column_path(@repository,
@repository_column),
destroy_html_url:
repository_columns_destroy_html_path(@repository,
@repository_column)
},
status: :ok
else
render json: {
message: {
repository_list_items:
t('libraries.repository_columns.repository_list_items_limit',
limit: Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN)
}
}, status: :unprocessable_entity
end
else
render json: { message: @repository_column.errors.full_messages },
status: :unprocessable_entity
end
end
end
end
def edit
render json: { html: render_to_string(partial: 'repository_columns/manage_column_modal_content.html.erb') }
end
def update
respond_to do |format|
format.json do
@repository_column.update(repository_column_params)
if @repository_column.save
log_activity(:edit_column_inventory)
if update_repository_list_items(params[:list_items])
render json: {
id: @repository_column.id,
name: escape_input(@repository_column.name),
message: t('libraries.repository_columns.update.success_flash',
name: escape_input(@repository_column.name))
}, status: :ok
else
render json: {
message: {
repository_list_items:
t('libraries.repository_columns.repository_list_items_limit',
limit: Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN)
}
}, status: :unprocessable_entity
end
else
render json: { message: @repository_column.errors.full_messages },
status: :unprocessable_entity
end
end
end
end
def destroy_html
respond_to do |format|
format.json do
render json: {
html: render_to_string(
partial: 'repository_columns/delete_column_modal_body.html.erb'
)
}
end
end
end
def destroy
column_id = @repository_column.id
column_name = @repository_column.name
log_activity(:delete_column_inventory) # Should we move this call somewhere?
respond_to do |format|
format.json do
if @repository_column.destroy
render json: {
message: t('libraries.repository_columns.destroy.success_flash',
name: escape_input(column_name)),
id: column_id,
status: :ok
}
else
render json: {
message: t('libraries.repository_columns.destroy.error_flash'),
status: :unprocessable_entity
}
end
end
end
end
def available_asset_type_columns
if @asset_columns.empty?
render json: {
no_items: t(
'projects.reports.new.save_PDF_to_inventory_modal.no_columns'
)
}, status: :ok
else
render json: { results: @asset_columns }, status: :ok
end
end
def available_columns
render json: { columns: @repository.available_columns_ids }, status: :ok
end
private
include StringUtility
AvailableRepositoryColumn = Struct.new(:id, :name)
def load_vars
@repository = Repository.accessible_by_teams(current_team).find_by_id(params[:repository_id])
render_404 unless @repository
@repository_column = @repository.repository_columns.find_by_id(params[:id])
render_404 unless @repository_column
end
def load_vars_nested
@repository = Repository.accessible_by_teams(current_team).find_by_id(params[:repository_id])
render_404 unless @repository
end
def load_repository_columns
@repository_columns = @repository.repository_columns
.order(created_at: :desc)
end
def load_asset_type_columns
render_403 unless can_read_repository?(@repository)
@asset_columns = load_asset_columns(search_params[:q])
end
def check_create_permissions
render_403 unless can_create_repository_columns?(@repository)
end
def check_manage_permissions
render_403 unless can_manage_repository_column?(@repository_column)
end
def repository_column_params
params.require(:repository_column).permit(:name, :data_type)
end
def search_params
params.permit(:q, :repository_id)
end
def load_asset_columns(query)
@repository.repository_columns
.asset_type.name_like(query)
.limit(Constants::SEARCH_LIMIT)
.select(:id, :name)
.collect do |column|
AvailableRepositoryColumn.new(
column.id,
ellipsize(column.name, 75, 50)
)
end
end
def generate_repository_list_items(item_names)
return true unless @repository_column.data_type == 'RepositoryListValue'
column_items = @repository_column.repository_list_items.size
success = true
item_names.split(',').uniq.each do |name|
if column_items >= Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN
success = false
next
end
RepositoryListItem.create(
repository: @repository,
repository_column: @repository_column,
data: name,
created_by: current_user,
last_modified_by: current_user
)
column_items += 1
end
success
end
def update_repository_list_items(item_names)
return true unless @repository_column.data_type == 'RepositoryListValue'
column_items = @repository_column.repository_list_items.size
items_list = item_names.split(',').uniq
existing = @repository_column.repository_list_items.pluck(:data)
existing.each do |name|
next if items_list.include? name
list_item_id = @repository_column.repository_list_items
.find_by_data(name)
.destroy
.id
RepositoryCell.where(
'value_type = ? AND value_id = ?',
'RepositoryListValue',
list_item_id
).destroy_all
end
success = true
items_list.each do |name|
next if @repository_column.repository_list_items.find_by_data(name)
if column_items >= Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN
success = false
next
end
RepositoryListItem.create(
repository: @repository,
repository_column: @repository_column,
data: name,
created_by: current_user,
last_modified_by: current_user
)
column_items += 1
end
success
end
def log_activity(type_of)
Activities::CreateActivityService
.call(activity_type: type_of,
owner: current_user,
subject: @repository,
team: current_team,
message_items: {
repository_column: @repository_column.id,
repository: @repository.id
})
end
end