From 1693729b4236cad4d1c20d0420b0bf0c2efaa4ff Mon Sep 17 00:00:00 2001 From: Martin Artnik Date: Thu, 3 Jul 2025 14:32:26 +0200 Subject: [PATCH] Add permission management to repositories [SCI-12029] --- .../repositories_controller.rb | 21 ++++++++++ app/controllers/repositories_controller.rb | 9 +++- app/javascript/vue/repositories/table.vue | 30 ++++++++++++-- .../generate_user_assignments_job.rb | 9 ---- app/models/repository.rb | 9 ++++ app/permissions/repository.rb | 4 ++ app/serializers/lists/form_serializer.rb | 2 - .../lists/project_and_folder_serializer.rb | 2 - app/serializers/lists/protocol_serializer.rb | 2 - .../lists/repository_serializer.rb | 41 ++++++++++++++++++- app/serializers/user_assignment_serializer.rb | 2 +- app/services/toolbars/repositories_service.rb | 15 ++++++- app/views/repositories/index.html.erb | 1 + config/initializers/extends.rb | 13 +++++- config/locales/en.yml | 9 ++++ config/locales/global_activities/en.yml | 18 ++++++++ config/routes.rb | 13 ++++-- 17 files changed, 170 insertions(+), 30 deletions(-) create mode 100644 app/controllers/access_permissions/repositories_controller.rb diff --git a/app/controllers/access_permissions/repositories_controller.rb b/app/controllers/access_permissions/repositories_controller.rb new file mode 100644 index 000000000..8f2fe8678 --- /dev/null +++ b/app/controllers/access_permissions/repositories_controller.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module AccessPermissions + class RepositoriesController < BaseController + private + + def set_model + @model = current_team.repositories.includes(user_assignments: %i(user user_role)).find_by(id: params[:id]) + + render_404 unless @model + end + + def check_manage_permissions + render_403 unless can_manage_repository_users?(@model) + end + + def check_read_permissions + render_403 unless can_read_repository?(@model) || can_manage_team?(@model.team) + end + end +end diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 4baf20faa..8b644060f 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -8,17 +8,18 @@ class RepositoriesController < ApplicationController include TeamsHelper include RepositoriesDatatableHelper include MyModulesHelper + include UserRolesHelper before_action :switch_team_with_param, only: %i(index) before_action :load_repository, except: %i(index create create_modal sidebar archive restore actions_toolbar - export_repositories list) + export_repositories list user_roles) before_action :load_repositories, only: %i(index list) before_action :load_repositories_for_archiving, only: :archive before_action :load_repositories_for_restoring, only: :restore before_action :check_view_all_permissions, only: %i(index sidebar list) before_action :check_view_permissions, except: %i(index create_modal create update destroy parse_sheet import_records sidebar archive restore actions_toolbar - export_repositories list) + export_repositories list user_roles) before_action :check_manage_permissions, only: %i(rename_modal update) before_action :check_delete_permissions, only: %i(destroy destroy_modal) before_action :check_archive_permissions, only: %i(archive restore) @@ -482,6 +483,10 @@ class RepositoriesController < ApplicationController } end + def user_roles + render json: { data: user_roles_collection(Repository.new).map(&:reverse) } + end + private def load_repository diff --git a/app/javascript/vue/repositories/table.vue b/app/javascript/vue/repositories/table.vue index a7c11ce8e..682b8895f 100644 --- a/app/javascript/vue/repositories/table.vue +++ b/app/javascript/vue/repositories/table.vue @@ -18,6 +18,7 @@ @share="share" @create="newRepository = true" @tableReloaded="reloadingTable = false" + @access="access" /> +