diff options
-rw-r--r-- | app/controllers/concerns/boards_actions.rb | 38 | ||||
-rw-r--r-- | app/controllers/groups/boards_controller.rb | 39 | ||||
-rw-r--r-- | app/controllers/projects/boards_controller.rb | 39 | ||||
-rw-r--r-- | app/models/project.rb | 14 | ||||
-rw-r--r-- | spec/controllers/groups/boards_controller_spec.rb | 22 | ||||
-rw-r--r-- | spec/controllers/projects/boards_controller_spec.rb | 22 | ||||
-rw-r--r-- | spec/models/project_spec.rb | 9 |
7 files changed, 41 insertions, 142 deletions
diff --git a/app/controllers/concerns/boards_actions.rb b/app/controllers/concerns/boards_actions.rb new file mode 100644 index 00000000000..ed7ea2f0e04 --- /dev/null +++ b/app/controllers/concerns/boards_actions.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module BoardsActions + include Gitlab::Utils::StrongMemoize + extend ActiveSupport::Concern + + included do + include BoardsResponses + + before_action :boards, only: :index + before_action :board, only: :show + end + + def index + respond_with_boards + end + + def show + # Add / update the board in the recent visits table + Boards::Visits::CreateService.new(parent, current_user).execute(board) if request.format.html? + + respond_with_board + end + + private + + def boards + strong_memoize(:boards) do + Boards::ListService.new(parent, current_user).execute + end + end + + def board + strong_memoize(:board) do + boards.find(params[:id]) + end + end +end diff --git a/app/controllers/groups/boards_controller.rb b/app/controllers/groups/boards_controller.rb index 51fdb6c05fb..40b8d5ed72c 100644 --- a/app/controllers/groups/boards_controller.rb +++ b/app/controllers/groups/boards_controller.rb @@ -1,53 +1,16 @@ # frozen_string_literal: true class Groups::BoardsController < Groups::ApplicationController - include BoardsResponses + include BoardsActions include RecordUserLastActivity before_action :assign_endpoint_vars - before_action :boards, only: :index - before_action :redirect_to_recent_board, only: :index - - def index - respond_with_boards - end - - def show - @board = boards.find(params[:id]) - - # add/update the board in the recent visited table - Boards::Visits::CreateService.new(@board.group, current_user).execute(@board) if request.format.html? - - respond_with_board - end private - def boards - @boards ||= Boards::ListService.new(group, current_user).execute - end - def assign_endpoint_vars @boards_endpoint = group_boards_url(group) @namespace_path = group.to_param @labels_endpoint = group_labels_url(group) end - - def serialize_as_json(resource) - resource.as_json(only: [:id]) - end - - def includes_board?(board_id) - boards.any? { |board| board.id == board_id } - end - - def redirect_to_recent_board - return if request.format.json? - - recently_visited = Boards::Visits::LatestService.new(group, current_user).execute - - if recently_visited && includes_board?(recently_visited.board_id) - redirect_to(group_board_path(id: recently_visited.board_id), status: :found) - end - end end diff --git a/app/controllers/projects/boards_controller.rb b/app/controllers/projects/boards_controller.rb index 8189b5d182a..95897aaf980 100644 --- a/app/controllers/projects/boards_controller.rb +++ b/app/controllers/projects/boards_controller.rb @@ -1,34 +1,15 @@ # frozen_string_literal: true class Projects::BoardsController < Projects::ApplicationController - include BoardsResponses + include BoardsActions include IssuableCollections before_action :check_issues_available! before_action :authorize_read_board!, only: [:index, :show] - before_action :boards, only: :index before_action :assign_endpoint_vars - before_action :redirect_to_recent_board, only: :index - - def index - respond_with_boards - end - - def show - @board = boards.find(params[:id]) - - # add/update the board in the recent visited table - Boards::Visits::CreateService.new(@board.project, current_user).execute(@board) if request.format.html? - - respond_with_board - end private - def boards - @boards ||= Boards::ListService.new(project, current_user).execute - end - def assign_endpoint_vars @boards_endpoint = project_boards_path(project) @bulk_issues_path = bulk_update_project_issues_path(project) @@ -39,22 +20,4 @@ class Projects::BoardsController < Projects::ApplicationController def authorize_read_board! access_denied! unless can?(current_user, :read_board, project) end - - def serialize_as_json(resource) - resource.as_json(only: [:id]) - end - - def includes_board?(board_id) - boards.any? { |board| board.id == board_id } - end - - def redirect_to_recent_board - return if request.format.json? - - recently_visited = Boards::Visits::LatestService.new(project, current_user).execute - - if recently_visited && includes_board?(recently_visited.board_id) - redirect_to(namespace_project_board_path(id: recently_visited.board_id), status: :found) - end - end end diff --git a/app/models/project.rb b/app/models/project.rb index 59b139e5986..a3d55d390f4 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -38,7 +38,6 @@ class Project < ActiveRecord::Base BoardLimitExceeded = Class.new(StandardError) STATISTICS_ATTRIBUTE = 'repositories_count'.freeze - NUMBER_OF_PERMITTED_BOARDS = 1 UNKNOWN_IMPORT_URL = 'http://unknown.git'.freeze # Hashed Storage versions handle rolling out new storage to project and dependents models: # nil: legacy @@ -137,7 +136,7 @@ class Project < ActiveRecord::Base alias_attribute :parent_id, :namespace_id has_one :last_event, -> {order 'events.created_at DESC'}, class_name: 'Event' - has_many :boards, before_add: :validate_board_limit + has_many :boards # Project services has_one :campfire_service @@ -2192,17 +2191,6 @@ class Project < ActiveRecord::Base "projects/#{id}/pushes_since_gc" end - # Similar to the normal callbacks that hook into the life cycle of an - # Active Record object, you can also define callbacks that get triggered - # when you add an object to an association collection. If any of these - # callbacks throw an exception, the object will not be added to the - # collection. Before you add a new board to the boards collection if you - # already have 1, 2, or n it will fail, but it if you have 0 that is lower - # than the number of permitted boards per project it won't fail. - def validate_board_limit(board) - raise BoardLimitExceeded, 'Number of permitted boards exceeded' if boards.size >= NUMBER_OF_PERMITTED_BOARDS - end - def update_project_statistics stats = statistics || build_statistics stats.update(namespace_id: namespace_id) diff --git a/spec/controllers/groups/boards_controller_spec.rb b/spec/controllers/groups/boards_controller_spec.rb index 4228e727b52..27ee37b3817 100644 --- a/spec/controllers/groups/boards_controller_spec.rb +++ b/spec/controllers/groups/boards_controller_spec.rb @@ -22,28 +22,6 @@ describe Groups::BoardsController do expect(response.content_type).to eq 'text/html' end - it 'redirects to latest visited board' do - board = create(:board, group: group) - create(:board_group_recent_visit, group: board.group, board: board, user: user) - - list_boards - - expect(response).to redirect_to(group_board_path(id: board.id)) - end - - it 'renders template if visited board is not found' do - temporary_board = create(:board, group: group) - visited = create(:board_group_recent_visit, group: temporary_board.group, board: temporary_board, user: user) - temporary_board.delete - - allow_any_instance_of(Boards::Visits::LatestService).to receive(:execute).and_return(visited) - - list_boards - - expect(response).to render_template :index - expect(response.content_type).to eq 'text/html' - end - context 'with unauthorized user' do before do allow(Ability).to receive(:allowed?).with(user, :read_cross_project, :global).and_return(true) diff --git a/spec/controllers/projects/boards_controller_spec.rb b/spec/controllers/projects/boards_controller_spec.rb index 09199067024..1eeded06459 100644 --- a/spec/controllers/projects/boards_controller_spec.rb +++ b/spec/controllers/projects/boards_controller_spec.rb @@ -28,28 +28,6 @@ describe Projects::BoardsController do expect(response.content_type).to eq 'text/html' end - it 'redirects to latest visited board' do - board = create(:board, project: project) - create(:board_project_recent_visit, project: board.project, board: board, user: user) - - list_boards - - expect(response).to redirect_to(namespace_project_board_path(id: board.id)) - end - - it 'renders template if visited board is not found' do - temporary_board = create(:board, project: project) - visited = create(:board_project_recent_visit, project: temporary_board.project, board: temporary_board, user: user) - temporary_board.delete - - allow_any_instance_of(Boards::Visits::LatestService).to receive(:execute).and_return(visited) - - list_boards - - expect(response).to render_template :index - expect(response.content_type).to eq 'text/html' - end - context 'with unauthorized user' do before do allow(Ability).to receive(:allowed?).with(user, :read_project, project).and_return(true) diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 5c09faafd83..328133e5c3c 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -136,15 +136,6 @@ describe Project do end end - describe '#boards' do - it 'raises an error when attempting to add more than one board to the project' do - subject.boards.build - - expect { subject.boards.build }.to raise_error(Project::BoardLimitExceeded, 'Number of permitted boards exceeded') - expect(subject.boards.size).to eq 1 - end - end - describe 'ci_pipelines association' do it 'returns only pipelines from ci_sources' do expect(Ci::Pipeline).to receive(:ci_sources).and_call_original |