Merge pull request #8837 from artoscinote/ma_SCI_12301

Refactor RecentWorkService to work with different assignment types [SCI-12301]
This commit is contained in:
Alex Kriuchykhin 2025-08-29 14:55:45 +02:00 committed by GitHub
commit 94b4c78fb5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -23,14 +23,14 @@ module Dashboard
all_activities = join_step_user_roles(all_activities)
team_activities = all_activities.where(subject_type: %w(Team RepositoryBase ProjectFolder))
project_activities = all_activities.where.not(project_user_roles: { id: nil })
report_activities = all_activities.where.not(report_project_user_roles: { id: nil })
experiment_activities = all_activities.where.not(experiment_user_roles: { id: nil })
my_module_activities = all_activities.where.not(my_module_user_roles: { id: nil })
result_activities = all_activities.where.not(result_my_module_user_roles: { id: nil })
protocol_activities = all_activities.where.not(protocol_my_module_user_roles: { id: nil })
project_activities = all_activities.where.not(project_subjects_user_roles: { id: nil })
report_activities = all_activities.where.not(report_projects_user_roles: { id: nil })
experiment_activities = all_activities.where.not(experiment_subjects_user_roles: { id: nil })
my_module_activities = all_activities.where.not(my_module_subjects_user_roles: { id: nil })
result_activities = all_activities.where.not(result_my_modules_user_roles: { id: nil })
protocol_activities = all_activities.where.not(protocol_my_modules_user_roles: { id: nil })
protocol_repository_activities = all_activities.where(project_id: nil, subject_type: 'Protocol')
step_activities = all_activities.where.not(step_my_module_user_roles: { id: nil })
step_activities = all_activities.where.not(step_my_modules_user_roles: { id: nil })
activities = team_activities.or(project_activities)
.or(report_activities)
@ -128,109 +128,128 @@ module Dashboard
private
def join_project_user_roles(activities)
activities.joins(
"LEFT OUTER JOIN projects project_subjects
ON project_subjects.id = activities.subject_id AND activities.subject_type='Project'
LEFT OUTER JOIN user_assignments project_user_assignments
ON project_user_assignments.assignable_type = 'Project'
AND project_user_assignments.assignable_id = project_subjects.id
AND project_user_assignments.user_id = #{@user.id}
LEFT OUTER JOIN user_roles project_user_roles
ON project_user_roles.id = project_user_assignments.user_role_id
AND project_user_roles.permissions @> ARRAY['#{ProjectPermissions::ACTIVITIES_READ}']::varchar[]"
)
def join_permitted_subjects(activities, join_alias, permission_model, permission)
activities.joins("
LEFT OUTER JOIN user_assignments #{join_alias}_user_assignments
ON #{join_alias}_user_assignments.assignable_type = '#{permission_model}'
AND #{join_alias}_user_assignments.assignable_id = #{join_alias}.id
AND #{join_alias}_user_assignments.user_id = #{@user.id}
LEFT OUTER JOIN user_roles #{join_alias}_user_roles
ON #{join_alias}_user_roles.id = #{join_alias}_user_assignments.user_role_id
AND #{join_alias}_user_roles.permissions @> ARRAY['#{permission}']::varchar[]
LEFT OUTER JOIN user_group_assignments #{join_alias}_user_group_assignments
ON #{join_alias}_user_group_assignments.assignable_type = '#{permission_model}'
AND #{join_alias}_user_group_assignments.assignable_id = #{join_alias}.id
LEFT OUTER JOIN user_group_memberships #{join_alias}_user_group_memberships
ON #{join_alias}_user_group_memberships.user_group_id = #{join_alias}_user_group_assignments.user_group_id
AND #{join_alias}_user_group_memberships.user_id = #{@user.id}
LEFT OUTER JOIN user_roles #{join_alias}_user_group_roles
ON #{join_alias}_user_group_roles.id = #{join_alias}_user_group_assignments.user_role_id
AND #{join_alias}_user_group_roles.permissions @> ARRAY['#{permission}']::varchar[]
LEFT OUTER JOIN team_assignments #{join_alias}_team_assignments
ON #{join_alias}_team_assignments.assignable_type = '#{permission_model}'
AND #{join_alias}_team_assignments.assignable_id = #{join_alias}.id
LEFT OUTER JOIN user_assignments #{join_alias}_team_user_assignments
ON #{join_alias}_team_user_assignments.assignable_type = 'Team'
AND #{join_alias}_team_user_assignments.assignable_id = #{join_alias}_team_assignments.team_id
AND #{join_alias}_team_user_assignments.user_id = #{@user.id}
LEFT OUTER JOIN user_roles #{join_alias}_team_user_roles
ON #{join_alias}_team_user_roles.id = #{join_alias}_team_user_assignments.user_role_id
AND #{join_alias}_team_user_roles.permissions @> ARRAY['#{permission}']::varchar[]
")
end
def join_report_project_user_roles(activities)
activities.joins(
"LEFT OUTER JOIN projects report_project_subjects
ON report_project_subjects.id = activities.project_id AND activities.subject_type='Report'
LEFT OUTER JOIN user_assignments report_project_user_assignments
ON report_project_user_assignments.assignable_type = 'Project'
AND report_project_user_assignments.assignable_id = report_project_subjects.id
AND report_project_user_assignments.user_id = #{@user.id}
LEFT OUTER JOIN user_roles report_project_user_roles
ON report_project_user_roles.id = report_project_user_assignments.user_role_id
AND report_project_user_roles.permissions @> ARRAY['#{ProjectPermissions::ACTIVITIES_READ}']::varchar[]"
def join_project_user_roles(activities)
join_permitted_subjects(
activities.joins(
"LEFT OUTER JOIN projects AS project_subjects
ON project_subjects.id = activities.subject_id AND activities.subject_type='Project'"
),
:project_subjects,
Project,
ProjectPermissions::ACTIVITIES_READ
)
end
def join_experiment_user_roles(activities)
activities.joins(
"LEFT OUTER JOIN experiments experiment_subjects
ON experiment_subjects.id = activities.subject_id AND activities.subject_type='Experiment'
LEFT OUTER JOIN user_assignments experiment_user_assignments
ON experiment_user_assignments.assignable_type = 'Experiment'
AND experiment_user_assignments.assignable_id = experiment_subjects.id
AND experiment_user_assignments.user_id = #{@user.id}
LEFT OUTER JOIN user_roles experiment_user_roles
ON experiment_user_roles.id = experiment_user_assignments.user_role_id
AND experiment_user_roles.permissions @> ARRAY['#{ExperimentPermissions::ACTIVITIES_READ}']::varchar[]"
join_permitted_subjects(
activities.joins(
"LEFT OUTER JOIN projects AS experiment_subjects
ON experiment_subjects.id = activities.subject_id AND activities.subject_type='Experiment'"
),
:experiment_subjects,
Experiment,
ExperimentPermissions::ACTIVITIES_READ
)
end
def join_my_module_user_roles(activities)
activities.joins(
"LEFT OUTER JOIN my_modules my_module_subjects
ON my_module_subjects.id = activities.subject_id AND activities.subject_type='MyModule'
LEFT OUTER JOIN user_assignments my_module_user_assignments
ON my_module_user_assignments.assignable_type = 'MyModule'
AND my_module_user_assignments.assignable_id = my_module_subjects.id
AND my_module_user_assignments.user_id = #{@user.id}
LEFT OUTER JOIN user_roles my_module_user_roles
ON my_module_user_roles.id = my_module_user_assignments.user_role_id
AND my_module_user_roles.permissions @> ARRAY['#{MyModulePermissions::ACTIVITIES_READ}']::varchar[]"
join_permitted_subjects(
activities.joins(
"LEFT OUTER JOIN my_modules AS my_module_subjects
ON my_module_subjects.id = activities.subject_id AND activities.subject_type='MyModule'"
),
:my_module_subjects,
MyModule,
MyModulePermissions::ACTIVITIES_READ
)
end
def join_report_project_user_roles(activities)
join_permitted_subjects(
activities.joins(
"LEFT OUTER JOIN projects report_projects
ON report_projects.id = activities.project_id AND activities.subject_type='Report'"
),
:report_projects,
Project,
ProjectPermissions::ACTIVITIES_READ
)
end
def join_result_user_roles(activities)
activities.joins(
"LEFT OUTER JOIN results result_subjects
ON result_subjects.id = activities.subject_id AND activities.subject_type='Result'
LEFT OUTER JOIN my_modules result_my_modules
ON result_subjects.my_module_id = result_my_modules.id
LEFT OUTER JOIN user_assignments result_my_module_user_assignments
ON result_my_module_user_assignments.assignable_type = 'MyModule'
AND result_my_module_user_assignments.assignable_id = result_my_modules.id
AND result_my_module_user_assignments.user_id = #{@user.id}
LEFT OUTER JOIN user_roles result_my_module_user_roles
ON result_my_module_user_roles.id = result_my_module_user_assignments.user_role_id
AND result_my_module_user_roles.permissions @> ARRAY['#{MyModulePermissions::ACTIVITIES_READ}']::varchar[]"
join_permitted_subjects(
activities.joins(
"LEFT OUTER JOIN results result_subjects
ON result_subjects.id = activities.subject_id AND activities.subject_type='Result'
LEFT OUTER JOIN my_modules result_my_modules
ON result_subjects.my_module_id = result_my_modules.id"
),
:result_my_modules,
MyModule,
MyModulePermissions::ACTIVITIES_READ
)
end
def join_protocol_user_roles(activities)
activities.joins(
"LEFT OUTER JOIN protocols protocol_subjects
ON protocol_subjects.id = activities.subject_id AND activities.subject_type='Protocol'
LEFT OUTER JOIN my_modules protocol_my_modules
ON protocol_subjects.my_module_id = protocol_my_modules.id
LEFT OUTER JOIN user_assignments protocol_my_module_user_assignments
ON protocol_my_module_user_assignments.assignable_type = 'MyModule'
AND protocol_my_module_user_assignments.assignable_id = protocol_my_modules.id
AND protocol_my_module_user_assignments.user_id = #{@user.id}
LEFT OUTER JOIN user_roles protocol_my_module_user_roles
ON protocol_my_module_user_roles.id = protocol_my_module_user_assignments.user_role_id
AND protocol_my_module_user_roles.permissions @> ARRAY['#{MyModulePermissions::ACTIVITIES_READ}']::varchar[]"
join_permitted_subjects(
activities.joins(
"LEFT OUTER JOIN protocols protocol_subjects
ON protocol_subjects.id = activities.subject_id AND activities.subject_type='Protocol'
LEFT OUTER JOIN my_modules protocol_my_modules
ON protocol_subjects.my_module_id = protocol_my_modules.id"
),
:protocol_my_modules,
MyModule,
MyModulePermissions::ACTIVITIES_READ
)
end
def join_step_user_roles(activities)
activities.joins(
"LEFT OUTER JOIN steps step_subjects
ON step_subjects.id = activities.subject_id AND activities.subject_type='Step'
LEFT OUTER JOIN protocols step_protocols
ON step_subjects.protocol_id = step_protocols.id
LEFT OUTER JOIN my_modules step_my_modules
ON step_protocols.my_module_id = step_my_modules.id
LEFT OUTER JOIN user_assignments step_my_module_user_assignments
ON step_my_module_user_assignments.assignable_type = 'MyModule'
AND step_my_module_user_assignments.assignable_id = step_my_modules.id
AND step_my_module_user_assignments.user_id = #{@user.id}
LEFT OUTER JOIN user_roles step_my_module_user_roles
ON step_my_module_user_roles.id = step_my_module_user_assignments.user_role_id
AND step_my_module_user_roles.permissions @> ARRAY['#{MyModulePermissions::ACTIVITIES_READ}']::varchar[]"
join_permitted_subjects(
activities.joins(
"LEFT OUTER JOIN steps step_subjects
ON step_subjects.id = activities.subject_id AND activities.subject_type='Step'
LEFT OUTER JOIN protocols step_protocols
ON step_subjects.protocol_id = step_protocols.id
LEFT OUTER JOIN my_modules step_my_modules
ON step_protocols.my_module_id = step_my_modules.id"
),
:step_my_modules,
MyModule,
MyModulePermissions::ACTIVITIES_READ
)
end