mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-09-20 14:45:56 +08:00
Add CreateStatusColumnService service
This commit is contained in:
parent
c00a837105
commit
bbb8c46fe2
|
@ -6,6 +6,9 @@ class RepositoryColumn < ApplicationRecord
|
||||||
has_many :repository_cells, dependent: :destroy
|
has_many :repository_cells, dependent: :destroy
|
||||||
has_many :repository_rows, through: :repository_cells
|
has_many :repository_rows, through: :repository_cells
|
||||||
has_many :repository_list_items, dependent: :destroy
|
has_many :repository_list_items, dependent: :destroy
|
||||||
|
has_many :repository_status_items, dependent: :destroy, index_errors: true
|
||||||
|
|
||||||
|
accepts_nested_attributes_for :repository_status_items
|
||||||
|
|
||||||
enum data_type: Extends::REPOSITORY_DATA_TYPES
|
enum data_type: Extends::REPOSITORY_DATA_TYPES
|
||||||
|
|
||||||
|
|
|
@ -5,13 +5,15 @@ module RepositoryColumns
|
||||||
extend Service
|
extend Service
|
||||||
include Canaid::Helpers::PermissionsHelper
|
include Canaid::Helpers::PermissionsHelper
|
||||||
|
|
||||||
attr_reader :errors
|
attr_reader :errors, :column
|
||||||
|
|
||||||
def initialize(user, repository, name)
|
def initialize(user:, repository:, column_name:, team:)
|
||||||
@user = user
|
@user = user
|
||||||
@repository = repository
|
@repository = repository
|
||||||
@name = name
|
@column_name = column_name
|
||||||
|
@team = team
|
||||||
@errors = {}
|
@errors = {}
|
||||||
|
@column = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
def call
|
def call
|
||||||
|
@ -34,18 +36,28 @@ module RepositoryColumns
|
||||||
end.compact
|
end.compact
|
||||||
end
|
end
|
||||||
|
|
||||||
@errors[:user_without_permissions] = :forbidden unless can_create_repository_columns?(@user, @repository)
|
|
||||||
|
|
||||||
succeed?
|
succeed?
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_base_column(type)
|
def create_base_column(type)
|
||||||
@column = RepositoryColumn.new(
|
@column = RepositoryColumn.new(
|
||||||
repository_id: @repository_id,
|
repository: @repository,
|
||||||
created_by: @user,
|
created_by: @user,
|
||||||
name: @name,
|
name: @column_name,
|
||||||
data_type: type
|
data_type: type
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def log_activity(type)
|
||||||
|
Activities::CreateActivityService
|
||||||
|
.call(activity_type: type,
|
||||||
|
owner: @user,
|
||||||
|
subject: @repository,
|
||||||
|
team: @team,
|
||||||
|
message_items: {
|
||||||
|
repository_column: @column.id,
|
||||||
|
repository: @repository.id
|
||||||
|
})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module RepositoryColumns
|
||||||
|
class CreateStatusColumnService < RepositoryColumns::CreateColumnService
|
||||||
|
def initialize(user:, repository:, params:, team:)
|
||||||
|
super(user: user, repository: repository, team: team, column_name: params[:name])
|
||||||
|
@params = params
|
||||||
|
end
|
||||||
|
|
||||||
|
def call
|
||||||
|
return self unless valid?
|
||||||
|
|
||||||
|
@column = RepositoryColumn.new(repository_status_items_attributes)
|
||||||
|
|
||||||
|
if @column.save
|
||||||
|
log_activity(:create_column_inventory)
|
||||||
|
else
|
||||||
|
errors[:repository_column] = @column.errors.messages
|
||||||
|
end
|
||||||
|
|
||||||
|
self
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def repository_status_items_attributes
|
||||||
|
@params[:repository_status_items_attributes]&.map do |m|
|
||||||
|
m.merge!(repository_id: @repository.id, created_by_id: @user.id)
|
||||||
|
end
|
||||||
|
@params.merge(repository_id: @repository.id, created_by_id: @user.id, data_type: :RepositoryStatusValue)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,86 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe RepositoryColumns::CreateStatusColumnService do
|
||||||
|
let(:user) { create :user }
|
||||||
|
let!(:user_team) { create :user_team, :admin, user: user, team: team }
|
||||||
|
let(:team) { create :team }
|
||||||
|
let(:repository) { create :repository, team: team }
|
||||||
|
let(:params) do
|
||||||
|
{
|
||||||
|
name: 'myrepo',
|
||||||
|
repository_status_items_attributes: [
|
||||||
|
{ status: 'first', icon: 'some icon' },
|
||||||
|
{ status: 'second', icon: 'some icon' },
|
||||||
|
{ status: 'third', icon: 'some icon' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when creates new status column' do
|
||||||
|
let(:service_call) do
|
||||||
|
RepositoryColumns::CreateStatusColumnService.call(repository: repository,
|
||||||
|
user: user,
|
||||||
|
team: team,
|
||||||
|
params: params)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'adds RepositoryColumn record' do
|
||||||
|
expect { service_call }.to change { RepositoryColumn.count }.by(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'adds Activity record' do
|
||||||
|
expect { service_call }.to(change { Activity.count }.by(1))
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'adds RepositoryStatusItem record' do
|
||||||
|
expect { service_call }.to(change { RepositoryStatusItem.count }.by(3))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when has invalid record' do
|
||||||
|
let(:params) do
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
repository_status_items_attributes: [
|
||||||
|
{ status: '', icon: 'some icon' },
|
||||||
|
{ status: 'second', icon: 'some icon' },
|
||||||
|
{ status: 'third' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:service_call) do
|
||||||
|
RepositoryColumns::CreateStatusColumnService.call(repository: repository,
|
||||||
|
user: user,
|
||||||
|
team: team,
|
||||||
|
params: params)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns AR errors' do
|
||||||
|
expect(service_call.errors).to have_key(:repository_column)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns succeed false' do
|
||||||
|
expect(service_call.succeed?).to be_falsey
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'whem repository is nil' do
|
||||||
|
let(:service_call) do
|
||||||
|
RepositoryColumns::CreateStatusColumnService.call(repository: nil,
|
||||||
|
user: user,
|
||||||
|
team: team,
|
||||||
|
params: params)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns invalid_arugments error' do
|
||||||
|
expect(service_call.errors).to have_key(:invalid_arguments)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns succeed false' do
|
||||||
|
expect(service_call.succeed?).to be_falsey
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue