mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-09-20 14:45:56 +08:00
Add repository_row_connection controller and actions [SCI-9672] (#6633)
* Add repository_row_connection controller and actions [SCI-9672]
This commit is contained in:
parent
f80046418a
commit
73cb2528c8
121
app/controllers/repository_row_connections_controller.rb
Normal file
121
app/controllers/repository_row_connections_controller.rb
Normal file
|
@ -0,0 +1,121 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class RepositoryRowConnectionsController < ApplicationController
|
||||
before_action :load_repository, except: %i(repositories create)
|
||||
before_action :load_create_vars, only: :create
|
||||
before_action :check_read_permissions, except: :repositories
|
||||
before_action :load_repository_row, except: %i(repositories repository_rows)
|
||||
before_action :check_manage_permissions, except: %i(repositories repository_rows index)
|
||||
|
||||
def index
|
||||
parents = @repository_row.parent_connections
|
||||
.joins('INNER JOIN repository_rows ON
|
||||
repository_rows.id = repository_row_connections.parent_id')
|
||||
.select(:id, 'repository_rows.id AS repository_row_id',
|
||||
'repository_rows.name AS repository_row_name')
|
||||
.map do |row|
|
||||
{
|
||||
id: row.id,
|
||||
name: row.repository_row_name,
|
||||
code: "#{RepositoryRow::ID_PREFIX}#{row.repository_row_id}"
|
||||
}
|
||||
end
|
||||
children = @repository_row.child_connections
|
||||
.joins('INNER JOIN repository_rows ON
|
||||
repository_rows.id = repository_row_connections.child_id')
|
||||
.select(:id, 'repository_rows.id AS repository_row_id',
|
||||
'repository_rows.name AS repository_row_name')
|
||||
.map do |row|
|
||||
{
|
||||
id: row.id,
|
||||
name: row.repository_row_name,
|
||||
code: "#{RepositoryRow::ID_PREFIX}#{row.repository_row_id}"
|
||||
}
|
||||
end
|
||||
render json: { parents: parents, children: children }
|
||||
end
|
||||
|
||||
def create
|
||||
connection_params[:relation_ids]
|
||||
RepositoryRowConnection.transaction do
|
||||
@repository.repository_rows.where(id: connection_params[:relation_ids]).find_each do |row|
|
||||
attributes = {
|
||||
created_by: current_user,
|
||||
last_modified_by: current_user,
|
||||
"#{@relation}": row
|
||||
}
|
||||
@repository_row.public_send("#{@relation}_connections").build attributes
|
||||
end
|
||||
@repository_row.save!
|
||||
end
|
||||
if @repository_row.valid?
|
||||
relations = @repository_row.public_send("#{@relation}_repository_rows")
|
||||
.select(:id, :name)
|
||||
.map do |row|
|
||||
{ id: row.id, name: row.name, code: "#{RepositoryRow::ID_PREFIX}#{row.id}" }
|
||||
end
|
||||
render json: {
|
||||
"#{@relation.pluralize}": relations
|
||||
}
|
||||
else
|
||||
render json: { errors: @repository_row.errors.full_messages }, status: :unprocessable_entity
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
connection = @repository_row.parent_connections.or(@repository_row.child_connections).find(params[:id])
|
||||
connection.destroy
|
||||
head :no_content
|
||||
end
|
||||
|
||||
def repositories
|
||||
repositories = Repository.accessible_by_teams(current_team)
|
||||
.search_by_name_and_id(current_user, current_user.teams, params[:query])
|
||||
.page(params[:page] || 1)
|
||||
.per(Constants::SEARCH_LIMIT)
|
||||
render json: repositories.select(:id, :name).map { |repository| { id: repository.id, name: repository.name } }
|
||||
end
|
||||
|
||||
def repository_rows
|
||||
repository_rows = @repository.repository_rows
|
||||
.search_by_name_and_id(current_user, current_user.teams, params[:query])
|
||||
.page(params[:page] || 1)
|
||||
.per(Constants::SEARCH_LIMIT)
|
||||
render json: repository_rows.select(:id, :name).map { |repository| { id: repository.id, name: repository.name } }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def load_create_vars
|
||||
@relation = 'parent' if connection_params[:relation] == 'parent'
|
||||
@relation = 'child' if connection_params[:relation] == 'child'
|
||||
return render_422(t('.invalid_params')) unless @relation
|
||||
|
||||
@repository = Repository.accessible_by_teams(current_team)
|
||||
.active
|
||||
.find_by(id: connection_params[:repository_id])
|
||||
return render_404 unless @repository
|
||||
end
|
||||
|
||||
def load_repository
|
||||
@repository = Repository.accessible_by_teams(current_team).active.find_by(id: params[:repository_id])
|
||||
render_404 unless @repository
|
||||
end
|
||||
|
||||
def load_repository_row
|
||||
@repository_row = @repository.repository_rows.find_by(id: params[:repository_row_id])
|
||||
render_404 unless @repository_row
|
||||
end
|
||||
|
||||
def check_read_permissions
|
||||
render_403 unless can_read_repository?(@repository)
|
||||
end
|
||||
|
||||
def check_manage_permissions
|
||||
render_403 unless can_manage_repository_rows?(@repository)
|
||||
end
|
||||
|
||||
def connection_params
|
||||
params.require(:repository_row_connection).permit(:repository_id, :relation, relation_ids: [])
|
||||
end
|
||||
end
|
|
@ -8,6 +8,9 @@ class Repository < RepositoryBase
|
|||
include RepositoryImportParser
|
||||
include ArchivableModel
|
||||
|
||||
ID_PREFIX = 'IN'
|
||||
include PrefixedIdModel
|
||||
|
||||
enum permission_level: Extends::SHARED_INVENTORIES_PERMISSION_LEVELS
|
||||
|
||||
belongs_to :archived_by,
|
||||
|
|
|
@ -2363,6 +2363,8 @@ en:
|
|||
stock_balance_unit: 'Stock unit after update'
|
||||
repository_rows:
|
||||
invalid_params: "Invalid params"
|
||||
repository_row_connections:
|
||||
invalid_params: "Invalid params"
|
||||
libraries:
|
||||
manange_modal_column_index:
|
||||
title: "Manage columns"
|
||||
|
|
|
@ -743,6 +743,7 @@ Rails.application.routes.draw do
|
|||
get :active_reminder_repository_cells
|
||||
put :update_cell
|
||||
end
|
||||
resources :repository_row_connections, only: %i(index create destroy)
|
||||
member do
|
||||
get 'repository_stock_value/new', to: 'repository_stock_values#new', as: 'new_repository_stock'
|
||||
get 'repository_stock_value/edit', to: 'repository_stock_values#edit', as: 'edit_repository_stock'
|
||||
|
@ -793,6 +794,11 @@ Rails.application.routes.draw do
|
|||
end
|
||||
end
|
||||
|
||||
namespace :repository_row_connections do
|
||||
get :repositories
|
||||
get :repository_rows
|
||||
end
|
||||
|
||||
resources :connected_devices, controller: 'users/connected_devices', only: %i(destroy)
|
||||
|
||||
get 'search' => 'search#index'
|
||||
|
|
Loading…
Reference in a new issue