mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-10-03 18:35:36 +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
|
def update
|
||||||
@experiment_member = ExperimentMember.new(current_user, @experiment, @project)
|
@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|
|
respond_to do |format|
|
||||||
format.json do
|
format.json do
|
||||||
|
|
|
@ -22,7 +22,7 @@ module AccessPermissions
|
||||||
|
|
||||||
def update
|
def update
|
||||||
@my_module_member = MyModuleMember.new(current_user, @my_module, @experiment, @project)
|
@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|
|
respond_to do |format|
|
||||||
format.json do
|
format.json do
|
||||||
|
|
|
@ -6,8 +6,8 @@ module Api
|
||||||
before_action :load_team
|
before_action :load_team
|
||||||
before_action :load_project
|
before_action :load_project
|
||||||
before_action :load_experiment
|
before_action :load_experiment
|
||||||
before_action :load_user_assignment, 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 destroy)
|
before_action :load_user_assignment_for_managing, only: %i(update show)
|
||||||
|
|
||||||
def index
|
def index
|
||||||
user_assignments = @experiment.user_assignments
|
user_assignments = @experiment.user_assignments
|
||||||
|
@ -26,20 +26,6 @@ module Api
|
||||||
include: %i(user user_role)
|
include: %i(user user_role)
|
||||||
end
|
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
|
def update
|
||||||
user_role = UserRole.find user_assignment_params[:user_role_id]
|
user_role = UserRole.find user_assignment_params[:user_role_id]
|
||||||
user = @user_assignment.user
|
user = @user_assignment.user
|
||||||
|
@ -59,18 +45,6 @@ module Api
|
||||||
status: :ok
|
status: :ok
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
|
||||||
experiment_member = ExperimentMember.new(
|
|
||||||
current_user,
|
|
||||||
@experiment,
|
|
||||||
@project,
|
|
||||||
@user_assignment.user,
|
|
||||||
@user_assignment
|
|
||||||
)
|
|
||||||
experiment_member.destroy
|
|
||||||
render body: nil
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def load_user_assignment
|
def load_user_assignment
|
||||||
|
|
|
@ -7,8 +7,8 @@ module Api
|
||||||
before_action :load_project
|
before_action :load_project
|
||||||
before_action :load_experiment
|
before_action :load_experiment
|
||||||
before_action :load_task
|
before_action :load_task
|
||||||
before_action :load_user_assignment, 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 destroy)
|
before_action :load_user_assignment_for_managing, only: %i(update show)
|
||||||
|
|
||||||
def index
|
def index
|
||||||
user_assignments = @task.user_assignments
|
user_assignments = @task.user_assignments
|
||||||
|
@ -27,20 +27,6 @@ module Api
|
||||||
include: %i(user user_role)
|
include: %i(user user_role)
|
||||||
end
|
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
|
def update
|
||||||
user_role = UserRole.find user_assignment_params[:user_role_id]
|
user_role = UserRole.find user_assignment_params[:user_role_id]
|
||||||
user = @user_assignment.user
|
user = @user_assignment.user
|
||||||
|
@ -62,19 +48,6 @@ module Api
|
||||||
status: :ok
|
status: :ok
|
||||||
end
|
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
|
private
|
||||||
|
|
||||||
def load_user_assignment
|
def load_user_assignment
|
||||||
|
|
|
@ -14,24 +14,37 @@ module UserAssignmentsHelper
|
||||||
# Triggers N+1 but the partial is cached
|
# Triggers N+1 but the partial is cached
|
||||||
|
|
||||||
if resource.is_a?(Experiment)
|
if resource.is_a?(Experiment)
|
||||||
project_user_assignment = resource.permission_parent.user_assignments.find_by(user: user)
|
project_user_assignment_name = resource.permission_parent
|
||||||
current_user_assignment_name = user_assignment&.user_role&.name
|
.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),
|
t('user_assignment.from_project', user_role: project_user_assignment_name),
|
||||||
current_user_assignment_name
|
(current_user_assignment_name unless current_user_assignment_name == project_user_assignment_name)
|
||||||
].compact.join(' / ')
|
].compact.join(' / ')
|
||||||
elsif resource.is_a?(MyModule)
|
elsif resource.is_a?(MyModule)
|
||||||
project_user_assignment = resource.permission_parent.permission_parent.user_assignments.find_by(user: user)
|
project_user_assignment_name = resource.permission_parent
|
||||||
experiment_user_assignment = resource.permission_parent.user_assignments.find_by(user: user)
|
.permission_parent
|
||||||
current_user_assignment_name = user_assignment&.user_role&.name
|
.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',
|
t('user_assignment.from_project',
|
||||||
user_role: project_user_assignment.user_role.name),
|
user_role: project_user_assignment_name),
|
||||||
(t('user_assignment.from_experiment',
|
(t('user_assignment.from_experiment',
|
||||||
user_role: experiment_user_assignment.user_role.name) if experiment_user_assignment.present?),
|
user_role: experiment_user_assignment_name) unless project_user_assignment_name == experiment_user_assignment_name),
|
||||||
current_user_assignment_name
|
(current_user_assignment_name unless experiment_user_assignment_name == current_user_assignment_name)
|
||||||
].compact.join(' / ')
|
].compact.join(' / ')
|
||||||
else
|
else
|
||||||
user_assignment.user_role.name
|
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 SearchableModel
|
||||||
include SearchableByNameModel
|
include SearchableByNameModel
|
||||||
include PermissionCheckableModel
|
include PermissionCheckableModel
|
||||||
|
include Assignable
|
||||||
|
|
||||||
belongs_to :project, inverse_of: :experiments, touch: true
|
belongs_to :project, inverse_of: :experiments, touch: true
|
||||||
belongs_to :created_by,
|
belongs_to :created_by,
|
||||||
|
@ -23,7 +24,6 @@ class Experiment < ApplicationRecord
|
||||||
has_many :report_elements, inverse_of: :experiment, dependent: :destroy
|
has_many :report_elements, inverse_of: :experiment, dependent: :destroy
|
||||||
# Associations for old activity type
|
# Associations for old activity type
|
||||||
has_many :activities, inverse_of: :experiment
|
has_many :activities, inverse_of: :experiment
|
||||||
has_many :user_assignments, as: :assignable, dependent: :destroy
|
|
||||||
has_many :users, through: :user_assignments
|
has_many :users, through: :user_assignments
|
||||||
|
|
||||||
has_one_attached :workflowimg
|
has_one_attached :workflowimg
|
||||||
|
@ -37,8 +37,6 @@ class Experiment < ApplicationRecord
|
||||||
validates :uuid, uniqueness: { scope: :project },
|
validates :uuid, uniqueness: { scope: :project },
|
||||||
unless: proc { |e| e.uuid.blank? }
|
unless: proc { |e| e.uuid.blank? }
|
||||||
|
|
||||||
default_scope { includes(user_assignments: :user_role) }
|
|
||||||
|
|
||||||
scope :is_archived, lambda { |is_archived|
|
scope :is_archived, lambda { |is_archived|
|
||||||
if is_archived
|
if is_archived
|
||||||
joins(:project).where('experiments.archived = TRUE OR projects.archived = TRUE')
|
joins(:project).where('experiments.archived = TRUE OR projects.archived = TRUE')
|
||||||
|
|
|
@ -20,25 +20,6 @@ class ExperimentMember
|
||||||
end
|
end
|
||||||
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)
|
def update(params)
|
||||||
prepare_data(params)
|
prepare_data(params)
|
||||||
|
|
||||||
|
@ -48,27 +29,6 @@ class ExperimentMember
|
||||||
end
|
end
|
||||||
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
|
private
|
||||||
|
|
||||||
def prepare_data(params)
|
def prepare_data(params)
|
||||||
|
@ -94,9 +54,4 @@ class ExperimentMember
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy_role?
|
|
||||||
(user_assignment.present? && user_role.nil?) ||
|
|
||||||
UserAssignment.find_by(assignable: project, user: user)&.user_role == user_role
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,6 +6,7 @@ class MyModule < ApplicationRecord
|
||||||
include SearchableByNameModel
|
include SearchableByNameModel
|
||||||
include TinyMceImages
|
include TinyMceImages
|
||||||
include PermissionCheckableModel
|
include PermissionCheckableModel
|
||||||
|
include Assignable
|
||||||
|
|
||||||
enum state: Extends::TASKS_STATES
|
enum state: Extends::TASKS_STATES
|
||||||
|
|
||||||
|
@ -53,14 +54,11 @@ class MyModule < ApplicationRecord
|
||||||
has_many :repository_snapshots, dependent: :destroy, inverse_of: :my_module
|
has_many :repository_snapshots, dependent: :destroy, inverse_of: :my_module
|
||||||
has_many :user_my_modules, inverse_of: :my_module, dependent: :destroy
|
has_many :user_my_modules, inverse_of: :my_module, dependent: :destroy
|
||||||
has_many :users, through: :user_my_modules
|
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 :report_elements, inverse_of: :my_module, dependent: :destroy
|
||||||
has_many :protocols, inverse_of: :my_module, dependent: :destroy
|
has_many :protocols, inverse_of: :my_module, dependent: :destroy
|
||||||
# Associations for old activity type
|
# Associations for old activity type
|
||||||
has_many :activities, inverse_of: :my_module
|
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 :overdue, -> { where('my_modules.due_date < ?', Time.current.utc) }
|
||||||
scope :without_group, -> { active.where(my_module_group: nil) }
|
scope :without_group, -> { active.where(my_module_group: nil) }
|
||||||
scope :one_day_prior, (lambda do
|
scope :one_day_prior, (lambda do
|
||||||
|
|
|
@ -21,25 +21,6 @@ class MyModuleMember
|
||||||
end
|
end
|
||||||
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)
|
def update(params)
|
||||||
prepare_data(params)
|
prepare_data(params)
|
||||||
|
|
||||||
|
@ -49,27 +30,6 @@ class MyModuleMember
|
||||||
end
|
end
|
||||||
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
|
private
|
||||||
|
|
||||||
def prepare_data(params)
|
def prepare_data(params)
|
||||||
|
@ -95,11 +55,4 @@ class MyModuleMember
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
end
|
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
|
end
|
||||||
|
|
|
@ -26,13 +26,22 @@ class ProjectMember
|
||||||
|
|
||||||
ActiveRecord::Base.transaction do
|
ActiveRecord::Base.transaction do
|
||||||
@user_project = UserProject.create!(project: @project, user: @user)
|
@user_project = UserProject.create!(project: @project, user: @user)
|
||||||
|
user_role = set_user_role
|
||||||
|
|
||||||
@user_assignment = UserAssignment.create!(
|
@user_assignment = UserAssignment.create!(
|
||||||
assignable: @project,
|
assignable: @project,
|
||||||
user: @user,
|
user: @user,
|
||||||
user_role: set_user_role,
|
user_role: user_role,
|
||||||
assigned_by: current_user
|
assigned_by: current_user
|
||||||
)
|
)
|
||||||
log_activity(:assign_user_to_project)
|
log_activity(:assign_user_to_project)
|
||||||
|
|
||||||
|
UserAssignments::PropagateAssignmentJob.perform_later(
|
||||||
|
@project,
|
||||||
|
@user,
|
||||||
|
user_role,
|
||||||
|
current_user
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -41,9 +50,17 @@ class ProjectMember
|
||||||
return false unless valid?
|
return false unless valid?
|
||||||
|
|
||||||
ActiveRecord::Base.transaction do
|
ActiveRecord::Base.transaction do
|
||||||
|
user_role = set_user_role
|
||||||
user_assignment = UserAssignment.find_by!(assignable: @project, user: @user)
|
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)
|
log_activity(:change_user_role_on_project)
|
||||||
|
|
||||||
|
UserAssignments::PropagateAssignmentJob.perform_later(
|
||||||
|
@project,
|
||||||
|
@user,
|
||||||
|
user_role,
|
||||||
|
current_user
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -56,6 +73,14 @@ class ProjectMember
|
||||||
user_assignment.destroy!
|
user_assignment.destroy!
|
||||||
user_project.destroy!
|
user_project.destroy!
|
||||||
log_activity(:unassign_user_from_project)
|
log_activity(:unassign_user_from_project)
|
||||||
|
|
||||||
|
UserAssignments::PropagateAssignmentJob.perform_later(
|
||||||
|
@project,
|
||||||
|
@user,
|
||||||
|
user_role,
|
||||||
|
current_user,
|
||||||
|
destroy: true
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -702,13 +702,13 @@ Rails.application.routes.draw do
|
||||||
resources :reports, only: %i(index show), path: 'reports', as: :reports
|
resources :reports, only: %i(index show), path: 'reports', as: :reports
|
||||||
resources :experiments, only: %i(index show create update) do
|
resources :experiments, only: %i(index show create update) do
|
||||||
resources :user_assignments,
|
resources :user_assignments,
|
||||||
only: %i(index show create update),
|
only: %i(index show update),
|
||||||
controller: :experiment_user_assignments
|
controller: :experiment_user_assignments
|
||||||
resources :task_groups, only: %i(index show)
|
resources :task_groups, only: %i(index show)
|
||||||
resources :connections, only: %i(index show)
|
resources :connections, only: %i(index show)
|
||||||
resources :tasks, only: %i(index show create update) do
|
resources :tasks, only: %i(index show create update) do
|
||||||
resources :user_assignments,
|
resources :user_assignments,
|
||||||
only: %i(index show create update),
|
only: %i(index show update),
|
||||||
controller: :task_user_assignments
|
controller: :task_user_assignments
|
||||||
resources :task_inventory_items, only: %i(index show),
|
resources :task_inventory_items, only: %i(index show),
|
||||||
path: 'items',
|
path: 'items',
|
||||||
|
|
|
@ -19,43 +19,6 @@ describe ExperimentMember, type: :model do
|
||||||
|
|
||||||
let(:subject) { described_class.new(user, experiment, project) }
|
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
|
describe '#update' do
|
||||||
let!(:experiment_user_assignment) do
|
let!(:experiment_user_assignment) do
|
||||||
create :user_assignment,
|
create :user_assignment,
|
||||||
|
@ -86,53 +49,4 @@ describe ExperimentMember, type: :model do
|
||||||
expect(Activity.last.type_of).to eq 'change_user_role_on_experiment'
|
expect(Activity.last.type_of).to eq 'change_user_role_on_experiment'
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|
|
@ -273,4 +273,14 @@ describe Experiment, type: :model do
|
||||||
end
|
end
|
||||||
end
|
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
|
end
|
||||||
|
|
|
@ -18,54 +18,6 @@ describe MyModuleMember, type: :model do
|
||||||
let!(:my_module) { create :my_module, experiment: experiment }
|
let!(:my_module) { create :my_module, experiment: experiment }
|
||||||
let(:normal_user_role) { create :normal_user_role }
|
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
|
describe '#update' do
|
||||||
let!(:my_module_user_assignment) do
|
let!(:my_module_user_assignment) do
|
||||||
create :user_assignment,
|
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'
|
expect(Activity.last.type_of).to eq 'change_user_role_on_my_module'
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|
|
@ -106,4 +106,14 @@ describe MyModule, type: :model do
|
||||||
it { is_expected.to validate_presence_of :experiment }
|
it { is_expected.to validate_presence_of :experiment }
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|
|
@ -28,6 +28,16 @@ describe ProjectMember, type: :model do
|
||||||
}.to change(Activity, :count).by(1)
|
}.to change(Activity, :count).by(1)
|
||||||
expect(Activity.last.type_of).to eq 'assign_user_to_project'
|
expect(Activity.last.type_of).to eq 'assign_user_to_project'
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
describe '#update' do
|
describe '#update' do
|
||||||
|
@ -53,6 +63,14 @@ describe ProjectMember, type: :model do
|
||||||
}.to change(Activity, :count).by(1)
|
}.to change(Activity, :count).by(1)
|
||||||
expect(Activity.last.type_of).to eq 'change_user_role_on_project'
|
expect(Activity.last.type_of).to eq 'change_user_role_on_project'
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
describe '#destroy' do
|
describe '#destroy' do
|
||||||
|
@ -96,6 +114,13 @@ describe ProjectMember, type: :model do
|
||||||
}.to change(Activity, :count).by(1)
|
}.to change(Activity, :count).by(1)
|
||||||
expect(Activity.last.type_of).to eq 'unassign_user_from_project'
|
expect(Activity.last.type_of).to eq 'unassign_user_from_project'
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
describe 'validations' do
|
describe 'validations' do
|
||||||
|
|
|
@ -118,113 +118,15 @@ RSpec.describe "Api::V1::ExperimentUserAssignmentsController", type: :request do
|
||||||
end
|
end
|
||||||
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
|
describe 'PATCH user_assignment, #update' do
|
||||||
before :all do
|
before :all do
|
||||||
@valid_headers['Content-Type'] = 'application/json'
|
@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,
|
@user_assignment = create :user_assignment,
|
||||||
assignable: @own_experiment,
|
assignable: @own_experiment,
|
||||||
user: @another_user,
|
user: @another_user,
|
||||||
|
|
|
@ -127,115 +127,15 @@ RSpec.describe "Api::V1::TaskUserAssignmentsController", type: :request do
|
||||||
end
|
end
|
||||||
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
|
describe 'PATCH user_assignment, #update' do
|
||||||
before :all do
|
before :all do
|
||||||
@valid_headers['Content-Type'] = 'application/json'
|
@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,
|
@user_assignment = create :user_assignment,
|
||||||
assignable: @own_task,
|
assignable: @own_task,
|
||||||
user: @another_user,
|
user: @another_user,
|
||||||
|
|
Loading…
Add table
Reference in a new issue