mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-10-03 10:24:30 +08:00
create user_assignments for all child objects when the user is attached to the project
This commit is contained in:
parent
3d79dd32ad
commit
784e43e328
21 changed files with 232 additions and 564 deletions
|
@ -21,7 +21,7 @@ module AccessPermissions
|
|||
|
||||
def update
|
||||
@experiment_member = ExperimentMember.new(current_user, @experiment, @project)
|
||||
@experiment_member.handle_change(permitted_update_params)
|
||||
@experiment_member.update(permitted_update_params)
|
||||
|
||||
respond_to do |format|
|
||||
format.json do
|
||||
|
|
|
@ -22,7 +22,7 @@ module AccessPermissions
|
|||
|
||||
def update
|
||||
@my_module_member = MyModuleMember.new(current_user, @my_module, @experiment, @project)
|
||||
@my_module_member.handle_change(permitted_update_params)
|
||||
@my_module_member.update(permitted_update_params)
|
||||
|
||||
respond_to do |format|
|
||||
format.json do
|
||||
|
|
|
@ -6,8 +6,8 @@ module Api
|
|||
before_action :load_team
|
||||
before_action :load_project
|
||||
before_action :load_experiment
|
||||
before_action :load_user_assignment, only: %i(update show destroy)
|
||||
before_action :load_user_assignment_for_managing, only: %i(update show destroy)
|
||||
before_action :load_user_assignment, only: %i(update show)
|
||||
before_action :load_user_assignment_for_managing, only: %i(update show)
|
||||
|
||||
def index
|
||||
user_assignments = @experiment.user_assignments
|
||||
|
@ -26,20 +26,6 @@ module Api
|
|||
include: %i(user user_role)
|
||||
end
|
||||
|
||||
def create
|
||||
raise PermissionError.new(Experiment, :manage) unless can_manage_experiment?(@experiment)
|
||||
|
||||
experiment_member = ExperimentMember.new(current_user, @experiment, @project)
|
||||
experiment_member.create(
|
||||
user_role_id: user_assignment_params[:user_role_id],
|
||||
user_id: user_assignment_params[:user_id]
|
||||
)
|
||||
|
||||
render jsonapi: experiment_member.user_assignment.reload,
|
||||
serializer: ExperimentUserAssignmentSerializer,
|
||||
status: :created
|
||||
end
|
||||
|
||||
def update
|
||||
user_role = UserRole.find user_assignment_params[:user_role_id]
|
||||
user = @user_assignment.user
|
||||
|
@ -59,18 +45,6 @@ module Api
|
|||
status: :ok
|
||||
end
|
||||
|
||||
def destroy
|
||||
experiment_member = ExperimentMember.new(
|
||||
current_user,
|
||||
@experiment,
|
||||
@project,
|
||||
@user_assignment.user,
|
||||
@user_assignment
|
||||
)
|
||||
experiment_member.destroy
|
||||
render body: nil
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def load_user_assignment
|
||||
|
|
|
@ -7,8 +7,8 @@ module Api
|
|||
before_action :load_project
|
||||
before_action :load_experiment
|
||||
before_action :load_task
|
||||
before_action :load_user_assignment, only: %i(update show destroy)
|
||||
before_action :load_user_assignment_for_managing, only: %i(update show destroy)
|
||||
before_action :load_user_assignment, only: %i(update show)
|
||||
before_action :load_user_assignment_for_managing, only: %i(update show)
|
||||
|
||||
def index
|
||||
user_assignments = @task.user_assignments
|
||||
|
@ -27,20 +27,6 @@ module Api
|
|||
include: %i(user user_role)
|
||||
end
|
||||
|
||||
def create
|
||||
raise PermissionError.new(MyModule, :read) unless can_manage_module?(@task)
|
||||
|
||||
my_module_member = MyModuleMember.new(current_user, @task, @experiment, @project)
|
||||
my_module_member.create(
|
||||
user_role_id: user_assignment_params[:user_role_id],
|
||||
user_id: user_assignment_params[:user_id]
|
||||
)
|
||||
|
||||
render jsonapi: my_module_member.user_assignment.reload,
|
||||
serializer: TaskUserAssignmentSerializer,
|
||||
status: :created
|
||||
end
|
||||
|
||||
def update
|
||||
user_role = UserRole.find user_assignment_params[:user_role_id]
|
||||
user = @user_assignment.user
|
||||
|
@ -62,19 +48,6 @@ module Api
|
|||
status: :ok
|
||||
end
|
||||
|
||||
def destroy
|
||||
my_module_member = MyModuleMember.new(
|
||||
current_user,
|
||||
@task,
|
||||
@experiment,
|
||||
@project,
|
||||
@user_assignment.user,
|
||||
@user_assignment
|
||||
)
|
||||
my_module_member.destroy
|
||||
render body: nil
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def load_user_assignment
|
||||
|
|
|
@ -14,24 +14,37 @@ module UserAssignmentsHelper
|
|||
# Triggers N+1 but the partial is cached
|
||||
|
||||
if resource.is_a?(Experiment)
|
||||
project_user_assignment = resource.permission_parent.user_assignments.find_by(user: user)
|
||||
current_user_assignment_name = user_assignment&.user_role&.name
|
||||
project_user_assignment_name = resource.permission_parent
|
||||
.user_assignments
|
||||
.find_by(user: user)
|
||||
.user_role
|
||||
.name
|
||||
current_user_assignment_name = user_assignment.user_role.name
|
||||
|
||||
[
|
||||
t('user_assignment.from_project', user_role: project_user_assignment.user_role.name),
|
||||
current_user_assignment_name
|
||||
t('user_assignment.from_project', user_role: project_user_assignment_name),
|
||||
(current_user_assignment_name unless current_user_assignment_name == project_user_assignment_name)
|
||||
].compact.join(' / ')
|
||||
elsif resource.is_a?(MyModule)
|
||||
project_user_assignment = resource.permission_parent.permission_parent.user_assignments.find_by(user: user)
|
||||
experiment_user_assignment = resource.permission_parent.user_assignments.find_by(user: user)
|
||||
current_user_assignment_name = user_assignment&.user_role&.name
|
||||
project_user_assignment_name = resource.permission_parent
|
||||
.permission_parent
|
||||
.user_assignments
|
||||
.find_by(user: user)
|
||||
.user_role
|
||||
.name
|
||||
experiment_user_assignment_name = resource.permission_parent
|
||||
.user_assignments
|
||||
.find_by(user: user)
|
||||
.user_role
|
||||
.name
|
||||
current_user_assignment_name = user_assignment.user_role.name
|
||||
|
||||
[
|
||||
t('user_assignment.from_project',
|
||||
user_role: project_user_assignment.user_role.name),
|
||||
user_role: project_user_assignment_name),
|
||||
(t('user_assignment.from_experiment',
|
||||
user_role: experiment_user_assignment.user_role.name) if experiment_user_assignment.present?),
|
||||
current_user_assignment_name
|
||||
user_role: experiment_user_assignment_name) unless project_user_assignment_name == experiment_user_assignment_name),
|
||||
(current_user_assignment_name unless experiment_user_assignment_name == current_user_assignment_name)
|
||||
].compact.join(' / ')
|
||||
else
|
||||
user_assignment.user_role.name
|
||||
|
|
43
app/jobs/user_assignments/generate_user_assignments_job.rb
Normal file
43
app/jobs/user_assignments/generate_user_assignments_job.rb
Normal file
|
@ -0,0 +1,43 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module UserAssignments
|
||||
class GenerateUserAssignmentsJob < ApplicationJob
|
||||
queue_as :high_priority
|
||||
|
||||
def perform(object, assigned_by)
|
||||
@assigned_by = assigned_by
|
||||
ActiveRecord::Base.transaction do
|
||||
if object.is_a? Experiment
|
||||
assign_users_to_experiment(object)
|
||||
elsif object.is_a? MyModule
|
||||
assign_users_to_my_module(object)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def assign_users_to_experiment(experiment)
|
||||
project = experiment.project
|
||||
project.user_assignments.find_each do |user_assignment|
|
||||
create_or_update_user_assignment(user_assignment, experiment)
|
||||
end
|
||||
end
|
||||
|
||||
def assign_users_to_my_module(my_module)
|
||||
project = my_module.experiment.project
|
||||
project.user_assignments.find_each do |user_assignment|
|
||||
create_or_update_user_assignment(user_assignment, my_module)
|
||||
end
|
||||
end
|
||||
|
||||
def create_or_update_user_assignment(parent_user_assignment, object)
|
||||
user_role = parent_user_assignment.user_role
|
||||
user = parent_user_assignment.user
|
||||
new_user_assignment = UserAssignment.find_or_initialize_by(user: user, assignable: object)
|
||||
new_user_assignment.user_role = user_role
|
||||
new_user_assignment.assigned_by = @assigned_by
|
||||
new_user_assignment.save!
|
||||
end
|
||||
end
|
||||
end
|
57
app/jobs/user_assignments/propagate_assignment_job.rb
Normal file
57
app/jobs/user_assignments/propagate_assignment_job.rb
Normal file
|
@ -0,0 +1,57 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module UserAssignments
|
||||
class PropagateAssignmentJob < ApplicationJob
|
||||
queue_as :high_priority
|
||||
|
||||
def perform(object, user, user_role, assigned_by, destroy: false)
|
||||
@user = user
|
||||
@user_role = user_role
|
||||
@assigned_by = assigned_by
|
||||
@destroy = destroy
|
||||
|
||||
ActiveRecord::Base.transaction do
|
||||
if object.is_a? Project
|
||||
sync_experiments_user_associations(object)
|
||||
elsif object.is_a? Experiment
|
||||
sync_my_modules_user_assignments(object)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def sync_experiments_user_associations(project)
|
||||
project.experiments.find_each do |experiment|
|
||||
if @destroy
|
||||
destroy_user_assignment(experiment)
|
||||
else
|
||||
create_or_update_user_assignment(experiment)
|
||||
end
|
||||
|
||||
sync_my_modules_user_assignments(experiment)
|
||||
end
|
||||
end
|
||||
|
||||
def sync_my_modules_user_assignments(experiment)
|
||||
experiment.my_modules.find_each do |my_module|
|
||||
if @destroy
|
||||
destroy_user_assignment(my_module)
|
||||
else
|
||||
create_or_update_user_assignment(my_module)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def create_or_update_user_assignment(object)
|
||||
user_assignment = UserAssignment.find_or_initialize_by(user: @user, assignable: object)
|
||||
user_assignment.user_role = @user_role
|
||||
user_assignment.assigned_by = @assigned_by
|
||||
user_assignment.save!
|
||||
end
|
||||
|
||||
def destroy_user_assignment(object)
|
||||
UserAssignment.find_by(user: @user, assignable: object).destroy_all
|
||||
end
|
||||
end
|
||||
end
|
15
app/models/concerns/assignable.rb
Normal file
15
app/models/concerns/assignable.rb
Normal file
|
@ -0,0 +1,15 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Assignable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
has_many :user_assignments, as: :assignable, dependent: :destroy
|
||||
|
||||
default_scope { includes(user_assignments: :user_role) }
|
||||
|
||||
after_create_commit do
|
||||
UserAssignments::GenerateUserAssignmentsJob.perform_later(self, created_by)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -3,6 +3,7 @@ class Experiment < ApplicationRecord
|
|||
include SearchableModel
|
||||
include SearchableByNameModel
|
||||
include PermissionCheckableModel
|
||||
include Assignable
|
||||
|
||||
belongs_to :project, inverse_of: :experiments, touch: true
|
||||
belongs_to :created_by,
|
||||
|
@ -23,7 +24,6 @@ class Experiment < ApplicationRecord
|
|||
has_many :report_elements, inverse_of: :experiment, dependent: :destroy
|
||||
# Associations for old activity type
|
||||
has_many :activities, inverse_of: :experiment
|
||||
has_many :user_assignments, as: :assignable, dependent: :destroy
|
||||
has_many :users, through: :user_assignments
|
||||
|
||||
has_one_attached :workflowimg
|
||||
|
@ -37,8 +37,6 @@ class Experiment < ApplicationRecord
|
|||
validates :uuid, uniqueness: { scope: :project },
|
||||
unless: proc { |e| e.uuid.blank? }
|
||||
|
||||
default_scope { includes(user_assignments: :user_role) }
|
||||
|
||||
scope :is_archived, lambda { |is_archived|
|
||||
if is_archived
|
||||
joins(:project).where('experiments.archived = TRUE OR projects.archived = TRUE')
|
||||
|
|
|
@ -20,25 +20,6 @@ class ExperimentMember
|
|||
end
|
||||
end
|
||||
|
||||
def handle_change(params)
|
||||
prepare_data(params)
|
||||
ActiveRecord::Base.transaction do
|
||||
if destroy_role?
|
||||
user_assignment.destroy
|
||||
elsif user_assignment.present?
|
||||
user_assignment.update!(user_role: user_role)
|
||||
else
|
||||
UserAssignment.create!(
|
||||
assignable: experiment,
|
||||
user: user,
|
||||
user_role: user_role,
|
||||
assigned_by: current_user
|
||||
)
|
||||
end
|
||||
log_change_activity
|
||||
end
|
||||
end
|
||||
|
||||
def update(params)
|
||||
prepare_data(params)
|
||||
|
||||
|
@ -48,27 +29,6 @@ class ExperimentMember
|
|||
end
|
||||
end
|
||||
|
||||
def create(params)
|
||||
prepare_data(params)
|
||||
|
||||
ActiveRecord::Base.transaction do
|
||||
@user_assignment = UserAssignment.create!(
|
||||
assignable: experiment,
|
||||
user: user,
|
||||
user_role: user_role,
|
||||
assigned_by: current_user
|
||||
)
|
||||
log_change_activity
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
ActiveRecord::Base.transaction do
|
||||
user_assignment.destroy
|
||||
log_change_activity
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def prepare_data(params)
|
||||
|
@ -94,9 +54,4 @@ class ExperimentMember
|
|||
}
|
||||
)
|
||||
end
|
||||
|
||||
def destroy_role?
|
||||
(user_assignment.present? && user_role.nil?) ||
|
||||
UserAssignment.find_by(assignable: project, user: user)&.user_role == user_role
|
||||
end
|
||||
end
|
||||
|
|
|
@ -6,6 +6,7 @@ class MyModule < ApplicationRecord
|
|||
include SearchableByNameModel
|
||||
include TinyMceImages
|
||||
include PermissionCheckableModel
|
||||
include Assignable
|
||||
|
||||
enum state: Extends::TASKS_STATES
|
||||
|
||||
|
@ -53,14 +54,11 @@ class MyModule < ApplicationRecord
|
|||
has_many :repository_snapshots, dependent: :destroy, inverse_of: :my_module
|
||||
has_many :user_my_modules, inverse_of: :my_module, dependent: :destroy
|
||||
has_many :users, through: :user_my_modules
|
||||
has_many :user_assignments, as: :assignable, dependent: :destroy
|
||||
has_many :report_elements, inverse_of: :my_module, dependent: :destroy
|
||||
has_many :protocols, inverse_of: :my_module, dependent: :destroy
|
||||
# Associations for old activity type
|
||||
has_many :activities, inverse_of: :my_module
|
||||
|
||||
default_scope { includes(user_assignments: :user_role) }
|
||||
|
||||
scope :overdue, -> { where('my_modules.due_date < ?', Time.current.utc) }
|
||||
scope :without_group, -> { active.where(my_module_group: nil) }
|
||||
scope :one_day_prior, (lambda do
|
||||
|
|
|
@ -21,25 +21,6 @@ class MyModuleMember
|
|||
end
|
||||
end
|
||||
|
||||
def handle_change(params)
|
||||
prepare_data(params)
|
||||
ActiveRecord::Base.transaction do
|
||||
if destroy_role?
|
||||
user_assignment.destroy
|
||||
elsif user_assignment.present?
|
||||
user_assignment.update!(user_role: user_role)
|
||||
else
|
||||
UserAssignment.create!(
|
||||
assignable: my_module,
|
||||
user: user,
|
||||
user_role: user_role,
|
||||
assigned_by: current_user
|
||||
)
|
||||
end
|
||||
log_change_activity
|
||||
end
|
||||
end
|
||||
|
||||
def update(params)
|
||||
prepare_data(params)
|
||||
|
||||
|
@ -49,27 +30,6 @@ class MyModuleMember
|
|||
end
|
||||
end
|
||||
|
||||
def create(params)
|
||||
prepare_data(params)
|
||||
|
||||
ActiveRecord::Base.transaction do
|
||||
@user_assignment = UserAssignment.create!(
|
||||
assignable: my_module,
|
||||
user: user,
|
||||
user_role: user_role,
|
||||
assigned_by: current_user
|
||||
)
|
||||
log_change_activity
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
ActiveRecord::Base.transaction do
|
||||
user_assignment.destroy
|
||||
log_change_activity
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def prepare_data(params)
|
||||
|
@ -95,11 +55,4 @@ class MyModuleMember
|
|||
}
|
||||
)
|
||||
end
|
||||
|
||||
def destroy_role?
|
||||
experiment_role = UserAssignment.find_by(assignable: experiment, user: user)&.user_role
|
||||
(user_assignment.present? && user_role.nil?) ||
|
||||
(experiment_role == user_role) ||
|
||||
(experiment_role.nil? && UserAssignment.find_by(assignable: project, user: user)&.user_role == user_role)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -26,13 +26,22 @@ class ProjectMember
|
|||
|
||||
ActiveRecord::Base.transaction do
|
||||
@user_project = UserProject.create!(project: @project, user: @user)
|
||||
user_role = set_user_role
|
||||
|
||||
@user_assignment = UserAssignment.create!(
|
||||
assignable: @project,
|
||||
user: @user,
|
||||
user_role: set_user_role,
|
||||
user_role: user_role,
|
||||
assigned_by: current_user
|
||||
)
|
||||
log_activity(:assign_user_to_project)
|
||||
|
||||
UserAssignments::PropagateAssignmentJob.perform_later(
|
||||
@project,
|
||||
@user,
|
||||
user_role,
|
||||
current_user
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -41,9 +50,17 @@ class ProjectMember
|
|||
return false unless valid?
|
||||
|
||||
ActiveRecord::Base.transaction do
|
||||
user_role = set_user_role
|
||||
user_assignment = UserAssignment.find_by!(assignable: @project, user: @user)
|
||||
user_assignment.update!(user_role: set_user_role)
|
||||
user_assignment.update!(user_role: user_role)
|
||||
log_activity(:change_user_role_on_project)
|
||||
|
||||
UserAssignments::PropagateAssignmentJob.perform_later(
|
||||
@project,
|
||||
@user,
|
||||
user_role,
|
||||
current_user
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -56,6 +73,14 @@ class ProjectMember
|
|||
user_assignment.destroy!
|
||||
user_project.destroy!
|
||||
log_activity(:unassign_user_from_project)
|
||||
|
||||
UserAssignments::PropagateAssignmentJob.perform_later(
|
||||
@project,
|
||||
@user,
|
||||
user_role,
|
||||
current_user,
|
||||
destroy: true
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -702,13 +702,13 @@ Rails.application.routes.draw do
|
|||
resources :reports, only: %i(index show), path: 'reports', as: :reports
|
||||
resources :experiments, only: %i(index show create update) do
|
||||
resources :user_assignments,
|
||||
only: %i(index show create update),
|
||||
only: %i(index show update),
|
||||
controller: :experiment_user_assignments
|
||||
resources :task_groups, only: %i(index show)
|
||||
resources :connections, only: %i(index show)
|
||||
resources :tasks, only: %i(index show create update) do
|
||||
resources :user_assignments,
|
||||
only: %i(index show create update),
|
||||
only: %i(index show update),
|
||||
controller: :task_user_assignments
|
||||
resources :task_inventory_items, only: %i(index show),
|
||||
path: 'items',
|
||||
|
|
|
@ -19,43 +19,6 @@ describe ExperimentMember, type: :model do
|
|||
|
||||
let(:subject) { described_class.new(user, experiment, project) }
|
||||
|
||||
describe '#handle_change' do
|
||||
let!(:valid_params) do
|
||||
{
|
||||
user_id: user.id,
|
||||
user_role_id: normal_user_role.id
|
||||
}
|
||||
end
|
||||
|
||||
it 'creates a new user assigment when no assigment present' do
|
||||
expect {
|
||||
subject.handle_change(valid_params)
|
||||
}.to change(UserAssignment, :count).by(1)
|
||||
end
|
||||
|
||||
it 'removes the user assigment if the project role is the same as selected one' do
|
||||
create :user_assignment, assignable: experiment, user: user, user_role: owner_role, assigned_by: user
|
||||
create :user_assignment, assignable: project, user: user, user_role: normal_user_role, assigned_by: user
|
||||
|
||||
expect {
|
||||
subject.handle_change(valid_params)
|
||||
}.to change(UserAssignment, :count).by(-1)
|
||||
end
|
||||
|
||||
it 'updates the assigment user role' do
|
||||
assigment = create :user_assignment, assignable: experiment, user: user, user_role: owner_role, assigned_by: user
|
||||
subject.handle_change(valid_params)
|
||||
expect(assigment.reload.user_role).to eq normal_user_role
|
||||
end
|
||||
|
||||
it 'logs a change_user_role_on_experiment activity' do
|
||||
expect {
|
||||
subject.handle_change(valid_params)
|
||||
}.to change(Activity, :count).by(1)
|
||||
expect(Activity.last.type_of).to eq 'change_user_role_on_experiment'
|
||||
end
|
||||
end
|
||||
|
||||
describe '#update' do
|
||||
let!(:experiment_user_assignment) do
|
||||
create :user_assignment,
|
||||
|
@ -86,53 +49,4 @@ describe ExperimentMember, type: :model do
|
|||
expect(Activity.last.type_of).to eq 'change_user_role_on_experiment'
|
||||
end
|
||||
end
|
||||
|
||||
describe '#destroy' do
|
||||
let!(:experiment_user_assignment) do
|
||||
create :user_assignment,
|
||||
assignable: experiment,
|
||||
user: user,
|
||||
user_role: owner_role,
|
||||
assigned_by: user
|
||||
end
|
||||
|
||||
let!(:subject) { described_class.new(user, experiment, project, user, experiment_user_assignment) }
|
||||
|
||||
it 'destroys the assigment user role' do
|
||||
expect {
|
||||
subject.destroy
|
||||
}.to change(UserAssignment, :count).by(-1)
|
||||
end
|
||||
|
||||
it 'logs a change_user_role_on_my_module activity' do
|
||||
expect {
|
||||
subject.destroy
|
||||
}.to change(Activity, :count).by(1)
|
||||
expect(Activity.last.type_of).to eq 'change_user_role_on_experiment'
|
||||
end
|
||||
end
|
||||
|
||||
describe '#create' do
|
||||
let!(:valid_params) do
|
||||
{
|
||||
user_id: user.id,
|
||||
user_role_id: normal_user_role.id
|
||||
}
|
||||
end
|
||||
|
||||
let(:subject) { described_class.new(user, experiment, project) }
|
||||
|
||||
it 'creates a new user assigment when no assigment present' do
|
||||
expect {
|
||||
subject.create(valid_params)
|
||||
}.to change(UserAssignment, :count).by(1)
|
||||
end
|
||||
|
||||
it 'logs a change_user_role_on_my_module activity' do
|
||||
expect {
|
||||
subject.create(valid_params)
|
||||
}.to change(Activity, :count).by(1)
|
||||
expect(Activity.last.type_of).to eq 'change_user_role_on_experiment'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -273,4 +273,14 @@ describe Experiment, type: :model do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'after_create_commit' do
|
||||
it 'triggers the UserAssignments::GenerateUserAssignmentsJob job' do
|
||||
experiment.created_by = create(:user)
|
||||
expect(UserAssignments::GenerateUserAssignmentsJob).to receive(:perform_later).with(
|
||||
experiment, experiment.created_by
|
||||
)
|
||||
experiment.save!
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -18,54 +18,6 @@ describe MyModuleMember, type: :model do
|
|||
let!(:my_module) { create :my_module, experiment: experiment }
|
||||
let(:normal_user_role) { create :normal_user_role }
|
||||
|
||||
describe '#handle_change' do
|
||||
let!(:valid_params) do
|
||||
{
|
||||
user_id: user.id,
|
||||
user_role_id: normal_user_role.id
|
||||
}
|
||||
end
|
||||
|
||||
let(:subject) { described_class.new(user, my_module, experiment, project) }
|
||||
|
||||
it 'creates a new user assigment when no assigment present' do
|
||||
expect {
|
||||
subject.handle_change(valid_params)
|
||||
}.to change(UserAssignment, :count).by(1)
|
||||
end
|
||||
|
||||
it 'removes the user assigment if the experiment role is the same as selected one' do
|
||||
create :user_assignment, assignable: my_module, user: user, user_role: owner_role, assigned_by: user
|
||||
create :user_assignment, assignable: experiment, user: user, user_role: normal_user_role, assigned_by: user
|
||||
|
||||
expect {
|
||||
subject.handle_change(valid_params)
|
||||
}.to change(UserAssignment, :count).by(-1)
|
||||
end
|
||||
|
||||
it 'removes the user assigment if the project role is the same as selected one and the experiment assignable does not exist' do
|
||||
create :user_assignment, assignable: my_module, user: user, user_role: owner_role, assigned_by: user
|
||||
create :user_assignment, assignable: project, user: user, user_role: normal_user_role, assigned_by: user
|
||||
|
||||
expect {
|
||||
subject.handle_change(valid_params)
|
||||
}.to change(UserAssignment, :count).by(-1)
|
||||
end
|
||||
|
||||
it 'updates the assigment user role' do
|
||||
assigment = create :user_assignment, assignable: my_module, user: user, user_role: owner_role, assigned_by: user
|
||||
subject.handle_change(valid_params)
|
||||
expect(assigment.reload.user_role).to eq normal_user_role
|
||||
end
|
||||
|
||||
it 'logs a change_user_role_on_my_module activity' do
|
||||
expect {
|
||||
subject.handle_change(valid_params)
|
||||
}.to change(Activity, :count).by(1)
|
||||
expect(Activity.last.type_of).to eq 'change_user_role_on_my_module'
|
||||
end
|
||||
end
|
||||
|
||||
describe '#update' do
|
||||
let!(:my_module_user_assignment) do
|
||||
create :user_assignment,
|
||||
|
@ -96,53 +48,4 @@ describe MyModuleMember, type: :model do
|
|||
expect(Activity.last.type_of).to eq 'change_user_role_on_my_module'
|
||||
end
|
||||
end
|
||||
|
||||
describe '#destroy' do
|
||||
let!(:user_assignment) do
|
||||
create :user_assignment,
|
||||
assignable: my_module,
|
||||
user: user,
|
||||
user_role: owner_role,
|
||||
assigned_by: user
|
||||
end
|
||||
|
||||
let!(:subject) { described_class.new(user, my_module, experiment, project, user, user_assignment) }
|
||||
|
||||
it 'destroys the assigment user role' do
|
||||
expect {
|
||||
subject.destroy
|
||||
}.to change(UserAssignment, :count).by(-1)
|
||||
end
|
||||
|
||||
it 'logs a change_user_role_on_my_module activity' do
|
||||
expect {
|
||||
subject.destroy
|
||||
}.to change(Activity, :count).by(1)
|
||||
expect(Activity.last.type_of).to eq 'change_user_role_on_my_module'
|
||||
end
|
||||
end
|
||||
|
||||
describe '#create' do
|
||||
let!(:valid_params) do
|
||||
{
|
||||
user_id: user.id,
|
||||
user_role_id: normal_user_role.id
|
||||
}
|
||||
end
|
||||
|
||||
let(:subject) { described_class.new(user, my_module, experiment, project) }
|
||||
|
||||
it 'creates a new user assigment when no assigment present' do
|
||||
expect {
|
||||
subject.create(valid_params)
|
||||
}.to change(UserAssignment, :count).by(1)
|
||||
end
|
||||
|
||||
it 'logs a change_user_role_on_my_module activity' do
|
||||
expect {
|
||||
subject.create(valid_params)
|
||||
}.to change(Activity, :count).by(1)
|
||||
expect(Activity.last.type_of).to eq 'change_user_role_on_my_module'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -106,4 +106,14 @@ describe MyModule, type: :model do
|
|||
it { is_expected.to validate_presence_of :experiment }
|
||||
end
|
||||
end
|
||||
|
||||
describe 'after_create_commit' do
|
||||
it 'triggers the UserAssignments::GenerateUserAssignmentsJob job' do
|
||||
my_module.created_by = create(:user)
|
||||
expect(UserAssignments::GenerateUserAssignmentsJob).to receive(:perform_later).with(
|
||||
my_module, my_module.created_by
|
||||
)
|
||||
my_module.save!
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -28,6 +28,16 @@ describe ProjectMember, type: :model do
|
|||
}.to change(Activity, :count).by(1)
|
||||
expect(Activity.last.type_of).to eq 'assign_user_to_project'
|
||||
end
|
||||
|
||||
it 'triggers the UserAssignments::PropagateAssignmentJob job' do
|
||||
subject.assign = true
|
||||
subject.user_role_id = owner_role.id
|
||||
|
||||
expect(UserAssignments::PropagateAssignmentJob).to receive(:perform_later).with(
|
||||
project, user, owner_role, user
|
||||
)
|
||||
subject.create
|
||||
end
|
||||
end
|
||||
|
||||
describe '#update' do
|
||||
|
@ -53,6 +63,14 @@ describe ProjectMember, type: :model do
|
|||
}.to change(Activity, :count).by(1)
|
||||
expect(Activity.last.type_of).to eq 'change_user_role_on_project'
|
||||
end
|
||||
|
||||
it 'triggers the UserAssignments::PropagateAssignmentJob job' do
|
||||
subject.user_role_id = normal_user_role.id
|
||||
expect(UserAssignments::PropagateAssignmentJob).to receive(:perform_later).with(
|
||||
project, user, normal_user_role, user
|
||||
)
|
||||
subject.update
|
||||
end
|
||||
end
|
||||
|
||||
describe '#destroy' do
|
||||
|
@ -96,6 +114,13 @@ describe ProjectMember, type: :model do
|
|||
}.to change(Activity, :count).by(1)
|
||||
expect(Activity.last.type_of).to eq 'unassign_user_from_project'
|
||||
end
|
||||
|
||||
it 'triggers the UserAssignments::PropagateAssignmentJob job' do
|
||||
expect(UserAssignments::PropagateAssignmentJob).to receive(:perform_later).with(
|
||||
project, user, owner_role, user, destroy: true
|
||||
)
|
||||
subject.destroy
|
||||
end
|
||||
end
|
||||
|
||||
describe 'validations' do
|
||||
|
|
|
@ -118,113 +118,15 @@ RSpec.describe "Api::V1::ExperimentUserAssignmentsController", type: :request do
|
|||
end
|
||||
end
|
||||
|
||||
describe 'POST user_assignment, #create' do
|
||||
before :all do
|
||||
@valid_headers['Content-Type'] = 'application/json'
|
||||
create :user_assignment,
|
||||
assignable: @own_project,
|
||||
user: @another_user,
|
||||
user_role: @owner_role,
|
||||
assigned_by: @user
|
||||
end
|
||||
|
||||
let(:action) do
|
||||
post api_v1_team_project_experiment_user_assignments_path(
|
||||
team_id: @team.id,
|
||||
project_id: @own_project.id,
|
||||
experiment_id: @own_experiment.id
|
||||
), params: request_body.to_json, headers: @valid_headers
|
||||
end
|
||||
|
||||
context 'when has valid params' do
|
||||
let(:request_body) do
|
||||
{
|
||||
data: {
|
||||
type: 'experiment_user_assignments',
|
||||
attributes: {
|
||||
user_id: @another_user.id,
|
||||
user_role_id: @normal_user_role.id
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
it 'creates new user_assignment' do
|
||||
expect { action }.to change { UserAssignment.count }.by(1)
|
||||
end
|
||||
|
||||
it 'returns status 201' do
|
||||
action
|
||||
|
||||
expect(response).to have_http_status 201
|
||||
end
|
||||
|
||||
it 'returns well formated response' do
|
||||
action
|
||||
|
||||
expect(json).to match(
|
||||
hash_including(
|
||||
data: hash_including(
|
||||
type: 'experiment_user_assignments',
|
||||
relationships: hash_including(
|
||||
user: hash_including(data: hash_including(id: @another_user.id.to_s)),
|
||||
user_role: hash_including(data: hash_including(id: @normal_user_role.id.to_s))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when has missing param' do
|
||||
let(:request_body) do
|
||||
{
|
||||
data: {
|
||||
type: 'experiment_user_assignments',
|
||||
attributes: {}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
it 'renders 400' do
|
||||
action
|
||||
|
||||
expect(response).to have_http_status(400)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when user is not an owner of the project' do
|
||||
let(:request_body) do
|
||||
{
|
||||
data: {
|
||||
type: 'experiment_user_assignments',
|
||||
attributes: {
|
||||
user_id: @another_user.id,
|
||||
user_role_id: @normal_user_role.id
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
it 'renders 403' do
|
||||
post(
|
||||
api_v1_team_project_experiment_user_assignments_path(
|
||||
team_id: @invalid_project.team.id,
|
||||
project_id: @invalid_project.id,
|
||||
experiment_id: @invalid_experiment.id
|
||||
),
|
||||
params: request_body.to_json,
|
||||
headers: @valid_headers
|
||||
)
|
||||
|
||||
expect(response).to have_http_status(403)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'PATCH user_assignment, #update' do
|
||||
before :all do
|
||||
@valid_headers['Content-Type'] = 'application/json'
|
||||
create :user_project, user: @another_user, project: @own_project
|
||||
create :user_assignment,
|
||||
assignable: @own_project,
|
||||
user: @another_user,
|
||||
user_role: @normal_user_role,
|
||||
assigned_by: @user
|
||||
@user_assignment = create :user_assignment,
|
||||
assignable: @own_experiment,
|
||||
user: @another_user,
|
||||
|
|
|
@ -127,115 +127,15 @@ RSpec.describe "Api::V1::TaskUserAssignmentsController", type: :request do
|
|||
end
|
||||
end
|
||||
|
||||
describe 'POST user_assignment, #create' do
|
||||
before :all do
|
||||
@valid_headers['Content-Type'] = 'application/json'
|
||||
create :user_assignment,
|
||||
assignable: @own_project,
|
||||
user: @another_user,
|
||||
user_role: @owner_role,
|
||||
assigned_by: @user
|
||||
end
|
||||
|
||||
let(:action) do
|
||||
post(api_v1_team_project_experiment_task_user_assignments_path(
|
||||
team_id: @team.id,
|
||||
project_id: @own_project.id,
|
||||
experiment_id: @own_experiment.id,
|
||||
task_id: @own_task.id),
|
||||
params: request_body.to_json, headers: @valid_headers)
|
||||
end
|
||||
|
||||
context 'when has valid params' do
|
||||
let(:request_body) do
|
||||
{
|
||||
data: {
|
||||
type: 'task_user_assignments',
|
||||
attributes: {
|
||||
user_id: @another_user.id,
|
||||
user_role_id: @normal_user_role.id
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
it 'creates new user_assignment' do
|
||||
expect { action }.to change { UserAssignment.count }.by(1)
|
||||
end
|
||||
|
||||
it 'returns status 201' do
|
||||
action
|
||||
|
||||
expect(response).to have_http_status 201
|
||||
end
|
||||
|
||||
it 'returns well formated response' do
|
||||
action
|
||||
|
||||
expect(json).to match(
|
||||
hash_including(
|
||||
data: hash_including(
|
||||
type: 'task_user_assignments',
|
||||
relationships: hash_including(
|
||||
user: hash_including(data: hash_including(id: @another_user.id.to_s)),
|
||||
user_role: hash_including(data: hash_including(id: @normal_user_role.id.to_s))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when has missing param' do
|
||||
let(:request_body) do
|
||||
{
|
||||
data: {
|
||||
type: 'task_user_assignments',
|
||||
attributes: {}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
it 'renders 400' do
|
||||
action
|
||||
|
||||
expect(response).to have_http_status(400)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when user is not an owner of the project' do
|
||||
let(:request_body) do
|
||||
{
|
||||
data: {
|
||||
type: 'task_user_assignments',
|
||||
attributes: {
|
||||
user_id: @another_user.id,
|
||||
user_role_id: @normal_user_role.id
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
it 'renders 403' do
|
||||
post(
|
||||
api_v1_team_project_experiment_task_user_assignments_path(
|
||||
team_id: @invalid_project.team.id,
|
||||
project_id: @invalid_project.id,
|
||||
experiment_id: @invalid_experiment.id,
|
||||
task_id: @invalid_task.id
|
||||
),
|
||||
params: request_body.to_json,
|
||||
headers: @valid_headers
|
||||
)
|
||||
|
||||
expect(response).to have_http_status(403)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'PATCH user_assignment, #update' do
|
||||
before :all do
|
||||
@valid_headers['Content-Type'] = 'application/json'
|
||||
create :user_project, user: @another_user, project: @own_project
|
||||
create :user_assignment,
|
||||
assignable: @own_project,
|
||||
user: @another_user,
|
||||
user_role: @normal_user_role,
|
||||
assigned_by: @user
|
||||
@user_assignment = create :user_assignment,
|
||||
assignable: @own_task,
|
||||
user: @another_user,
|
||||
|
|
Loading…
Add table
Reference in a new issue