Fix automatic user assigning to reports and inventories [SCI-7365][SCI-7366]

This commit is contained in:
Oleksii Kriuchykhin 2022-10-20 15:35:43 +02:00
parent a55390898a
commit 94978ea2ea
14 changed files with 117 additions and 62 deletions

View file

@ -83,7 +83,7 @@ module AccessPermissions
def update_default_public_user_role
@project.update!(permitted_default_public_user_role_params)
UserAssignments::GroupAssignmentJob.perform_later(current_team, @project, current_user)
UserAssignments::ProjectGroupAssignmentJob.perform_later(current_team, @project, current_user)
end
private

View file

@ -16,6 +16,8 @@ module UserAssignments
assign_users_to_repository(object)
when Protocol
assign_users_to_protocol(object)
when Report
assign_users_to_report(object)
end
end
end
@ -49,6 +51,13 @@ module UserAssignments
protocol.add_team_users_as_viewers!(@assigned_by)
end
def assign_users_to_report(report)
team = report.team
team.user_assignments.find_each do |user_assignment|
create_or_update_user_assignment(user_assignment, report)
end
end
def create_or_update_user_assignment(parent_user_assignment, object)
user_role = parent_user_assignment.user_role
user = parent_user_assignment.user

View file

@ -1,7 +1,7 @@
# frozen_string_literal: true
module UserAssignments
class GroupAssignmentJob < ApplicationJob
class ProjectGroupAssignmentJob < ApplicationJob
queue_as :high_priority
def perform(team, project, assigned_by)
@ -18,7 +18,7 @@ module UserAssignments
next if user_assignment.manually_assigned?
user_assignment.update!(
user_role: project.default_public_user_role,
user_role: project.default_public_user_role || UserRole.find_predefined_viewer_role,
assigned_by: @assigned_by
)
@ -26,7 +26,7 @@ module UserAssignments
UserAssignments::PropagateAssignmentJob.perform_later(
project,
user,
project.default_public_user_role,
project.default_public_user_role || UserRole.find_predefined_viewer_role,
@assigned_by
)
end

View file

@ -1,7 +1,7 @@
# frozen_string_literal: true
module UserAssignments
class GroupUnAssignmentJob < ApplicationJob
class ProjectGroupUnAssignmentJob < ApplicationJob
queue_as :high_priority
def perform(project)

View file

@ -1,12 +1,12 @@
# frozen_string_literal: true
module UserAssignments
class RemoveTeamUserAssignmentJob < ApplicationJob
class RemoveTeamUserAssignmentsJob < ApplicationJob
queue_as :high_priority
def perform(user, team)
ActiveRecord::Base.transaction do
RemoveTeamUserAssignmentService.new(user, team).call
RemoveTeamUserAssignmentsService.new(user, team).call
end
end
end

View file

@ -1,12 +1,12 @@
# frozen_string_literal: true
module UserAssignments
class UpdateTeamUserAssignmentJob < ApplicationJob
class UpdateTeamUserAssignmentsJob < ApplicationJob
queue_as :high_priority
def perform(user, team, user_role)
ActiveRecord::Base.transaction do
UpdateTeamUserAssignmentService.new(user, team, user_role).call
UpdateTeamUserAssignmentsService.new(user, team, user_role).call
end
end
end

View file

@ -326,7 +326,7 @@ class Project < ApplicationRecord
def auto_assign_project_members
return if skip_user_assignments
UserAssignments::GroupAssignmentJob.perform_now(
UserAssignments::ProjectGroupAssignmentJob.perform_now(
team,
self,
last_modified_by || created_by
@ -345,7 +345,7 @@ class Project < ApplicationRecord
if visible?
auto_assign_project_members
else
UserAssignments::GroupUnAssignmentJob.perform_now(self)
UserAssignments::ProjectGroupUnAssignmentJob.perform_now(self)
end
end
end

View file

@ -85,7 +85,8 @@ class Report < ApplicationRecord
end
def self.viewable_by_user(user, teams)
where(project: Project.viewable_by_user(user, teams))
with_granted_permissions(user, ReportPermissions::READ)
.where(project: Project.viewable_by_user(user, teams))
end
def self.filter_by_teams(teams = [])

View file

@ -2,10 +2,8 @@
class UserAssignment < ApplicationRecord
before_validation -> { self.team ||= (assignable.is_a?(Team) ? assignable : assignable.team) }
after_create :assign_shared_inventories, if: -> { assignable.is_a?(Team) }
after_create :assign_public_projects, if: -> { assignable.is_a?(Team) }
after_create :assign_team_child_objects, if: -> { assignable.is_a?(Team) }
after_update :update_team_children_assignments, if: -> { assignable.is_a?(Team) && saved_change_to_user_role_id? }
before_destroy :unassign_shared_inventories, if: -> { assignable.is_a?(Team) }
before_destroy :unassign_team_child_objects, if: -> { assignable.is_a?(Team) }
belongs_to :assignable, polymorphic: true, touch: true
@ -20,46 +18,15 @@ class UserAssignment < ApplicationRecord
private
def assign_shared_inventories
viewer_role = UserRole.find_by(name: UserRole.public_send('viewer_role').name)
normal_user_role = UserRole.find_by(name: UserRole.public_send('normal_user_role').name)
assignable.team_shared_repositories.find_each do |team_shared_repository|
assignable.repository_sharing_user_assignments.create!(
user: user,
user_role: team_shared_repository.shared_write? ? normal_user_role : viewer_role,
assignable: team_shared_repository.shared_object
)
end
Repository.globally_shared.find_each do |repository|
assignable.repository_sharing_user_assignments.create!(
user: user,
user_role: repository.shared_write? ? normal_user_role : viewer_role,
assignable: repository
)
end
end
def assign_public_projects
assignable.projects.visible.find_each do |project|
UserAssignments::GroupAssignmentJob.perform_later(
assignable,
project,
assigned_by
)
end
def assign_team_child_objects
UserAssignments::CreateTeamUserAssignmentsService.new(self).call
end
def update_team_children_assignments
UserAssignments::UpdateTeamUserAssignmentService.new(user, assignable, user_role).call
end
def unassign_shared_inventories
assignable.repository_sharing_user_assignments.where(user: user).find_each(&:destroy!)
UserAssignments::UpdateTeamUserAssignmentsService.new(self).call
end
def unassign_team_child_objects
UserAssignments::RemoveTeamUserAssignmentService.new(user, assignable).call
UserAssignments::RemoveTeamUserAssignmentsService.new(self).call
end
end

View file

@ -57,7 +57,7 @@ class UserTeam < ApplicationRecord
def assign_user_to_visible_projects
team.projects.visible.each do |project|
UserAssignments::GroupAssignmentJob.perform_later(
UserAssignments::ProjectGroupAssignmentJob.perform_later(
team,
project,
assigned_by

View file

@ -94,11 +94,11 @@ end
Canaid::Permissions.register_for(Report) do
can :read_report do |user, report|
report.permission_granted?(user, ReportPermissions::READ)
can_read_project?(report.project) && report.permission_granted?(user, ReportPermissions::READ)
end
can :manage_report do |user, report|
report.permission_granted?(user, ReportPermissions::MANAGE)
can_read_project?(report.project) && report.permission_granted?(user, ReportPermissions::MANAGE)
end
can :manage_report_users do |user, report|

View file

@ -0,0 +1,77 @@
# frozen_string_literal: true
module UserAssignments
class CreateTeamUserAssignmentsService
def initialize(team_user_assignment)
@user = team_user_assignment.user
@team = team_user_assignment.assignable
@user_role = team_user_assignment.user_role
@assigned_by = team_user_assignment.assigned_by
@viewer_role = UserRole.find_predefined_viewer_role
@normal_user_role = UserRole.find_predefined_normal_user_role
end
def call
create_public_projects_assignments
create_repositories_assignments
create_protocols_assignments
create_reports_assignments
end
private
def create_public_projects_assignments
@team.projects.visible.find_each do |project|
UserAssignments::ProjectGroupAssignmentJob.perform_later(
@team,
project,
@assigned_by
)
end
end
def create_repositories_assignments
@team.repositories.find_each do |repository|
create_or_update_user_assignment(repository)
end
@team.team_shared_repositories.find_each do |team_shared_repository|
@team.repository_sharing_user_assignments.create!(
user: @user,
user_role: team_shared_repository.shared_write? ? @normal_user_role : @viewer_role,
assignable: team_shared_repository.shared_object
)
end
Repository.globally_shared.where.not(team: @team).find_each do |repository|
@team.repository_sharing_user_assignments.create!(
user: @user,
user_role: repository.shared_write? ? @normal_user_role : @viewer_role,
assignable: repository
)
end
end
def create_protocols_assignments
@team.repository_protocols.in_repository_public.find_each do |protocol|
create_or_update_user_assignment(protocol, @viewer_role)
end
end
def create_reports_assignments
@team.reports.find_each do |report|
create_or_update_user_assignment(report)
end
end
def create_or_update_user_assignment(object, role = nil)
new_user_assignment = object.user_assignments.find_or_initialize_by(user: @user)
return if new_user_assignment.manually_assigned?
new_user_assignment.user_role = role || @user_role
new_user_assignment.assigned_by = @assigned_by
new_user_assignment.assigned = :automatically
new_user_assignment.save!
end
end
end

View file

@ -1,10 +1,10 @@
# frozen_string_literal: true
module UserAssignments
class RemoveTeamUserAssignmentService
def initialize(user, team)
@user = user
@team = team
class RemoveTeamUserAssignmentsService
def initialize(team_user_assignment)
@user = team_user_assignment.user
@team = team_user_assignment.assignable
end
def call
@ -28,6 +28,7 @@ module UserAssignments
.select { |assignment| assignment.user_id == @user.id && assignment.team_id == @team.id }
.each(&:destroy!)
end
@team.repository_sharing_user_assignments.where(user: @user).find_each(&:destroy!)
end
def remove_protocols_assignments

View file

@ -1,10 +1,10 @@
# frozen_string_literal: true
module UserAssignments
class UpdateTeamUserAssignmentService
def initialize(user, team, user_role)
@user = user
@team = team
class UpdateTeamUserAssignmentsService
def initialize(team_user_assignment)
@user = team_user_assignment.user
@team = team_user_assignment.assignable
@user_role = user_role
end
@ -34,7 +34,7 @@ module UserAssignments
.where(automatic_user_assignments: { user: @user })
.find_each do |report|
report.automatic_user_assignments
.select { |assignment| assignment.user_id == @user.id && assignment.automatically_assigned? }
.select { |assignment| assignment.user_id == @user.id }
.each { |assignment| assignment.update!(user_role: @user_role) }
end
end