diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 9fa67dde3..2799a453a 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -37,7 +37,7 @@ class RepositoriesController < ApplicationController render 'index' end format.json do - repositories = Lists::RepositoriesService.new(@repositories, params).call + repositories = Lists::RepositoriesService.new(@repositories, params, user: current_user).call render json: repositories, each_serializer: Lists::RepositorySerializer, user: current_user, meta: pagination_dict(repositories) end diff --git a/app/javascript/vue/repositories/table.vue b/app/javascript/vue/repositories/table.vue index 12c741c01..c8bb35d2c 100644 --- a/app/javascript/vue/repositories/table.vue +++ b/app/javascript/vue/repositories/table.vue @@ -140,7 +140,8 @@ export default { }, { field: 'shared_label', - headerName: this.i18n.t('libraries.index.table.shared') + headerName: this.i18n.t('libraries.index.table.shared'), + sortable: true }, { field: 'team', diff --git a/app/serializers/lists/repository_serializer.rb b/app/serializers/lists/repository_serializer.rb index e03aab95b..27119e15c 100644 --- a/app/serializers/lists/repository_serializer.rb +++ b/app/serializers/lists/repository_serializer.rb @@ -18,15 +18,14 @@ module Lists end def shared_label - if object.i_shared?(current_user.current_team) + case object[:shared] + when 1 I18n.t('libraries.index.shared') - elsif object.shared_with?(current_user.current_team) - if object.shared_with_read?(current_user.current_team) - I18n.t('libraries.index.shared_for_viewing') - else - I18n.t('libraries.index.shared_for_editing') - end - else + when 2 + I18n.t('libraries.index.shared_for_editing') + when 3 + I18n.t('libraries.index.shared_for_viewing') + when 4 I18n.t('libraries.index.not_shared') end end diff --git a/app/services/lists/repositories_service.rb b/app/services/lists/repositories_service.rb index 74b0ab2a7..c97bfc7d0 100644 --- a/app/services/lists/repositories_service.rb +++ b/app/services/lists/repositories_service.rb @@ -16,6 +16,7 @@ module Lists .select('COUNT(repository_rows.*) AS row_count') .select('MAX(creators.full_name) AS created_by_user') .select('MAX(archivers.full_name) AS archived_by_user') + .select(shared_sql_select) .group('repositories.id') view_mode = @params[:view_mode] || 'active' @@ -47,8 +48,49 @@ module Lists archived_on: 'repositories.archived_on', archived_by: 'archived_by_user', nr_of_rows: 'row_count', - code: 'repositories.id' + code: 'repositories.id', + shared_label: 'shared' } end + + def shared_sql_select + shared_write_value = Repository.permission_levels['shared_write'] + not_shared_value = Repository.permission_levels['not_shared'] + team_id = @user.current_team.id + + case_statement = <<-SQL.squish + CASE + WHEN repositories.team_id = :team_id AND repositories.permission_level NOT IN (:not_shared_value) + OR EXISTS ( + SELECT 1 FROM team_shared_objects + WHERE team_shared_objects.shared_object_id = repositories.id + AND team_shared_objects.shared_object_type = 'RepositoryBase' + ) THEN 1 + WHEN repositories.team_id != :team_id AND repositories.permission_level NOT IN (:not_shared_value) + OR EXISTS ( + SELECT 1 FROM team_shared_objects + WHERE team_shared_objects.shared_object_id = repositories.id + AND team_shared_objects.shared_object_type = 'RepositoryBase' + AND team_shared_objects.team_id = :team_id + ) THEN + CASE + WHEN repositories.permission_level IN (:shared_write_value) + OR EXISTS ( + SELECT 1 FROM team_shared_objects + WHERE team_shared_objects.shared_object_id = repositories.id + AND team_shared_objects.shared_object_type = 'RepositoryBase' + AND team_shared_objects.permission_level = :shared_write_value + AND team_shared_objects.team_id = :team_id + ) THEN 2 + ELSE 3 + END + ELSE 4 + END as shared + SQL + + ActiveRecord::Base.sanitize_sql_array( + [case_statement, { team_id:, not_shared_value:, shared_write_value: }] + ) + end end end