Commit 87880cb8 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge branch '60730-service-response' into 'master'

Introduce ServiceResponse to wrap around response

Closes #60730

See merge request gitlab-org/gitlab-ce!27516
parents c45bc6d0 b77d811c
...@@ -100,14 +100,14 @@ class Projects::BranchesController < Projects::ApplicationController ...@@ -100,14 +100,14 @@ class Projects::BranchesController < Projects::ApplicationController
respond_to do |format| respond_to do |format|
format.html do format.html do
flash_type = result[:status] == :error ? :alert : :notice flash_type = result.error? ? :alert : :notice
flash[flash_type] = result[:message] flash[flash_type] = result.message
redirect_to project_branches_path(@project), status: :see_other redirect_to project_branches_path(@project), status: :see_other
end end
format.js { head result[:return_code] } format.js { head result.http_status }
format.json { render json: { message: result[:message] }, status: result[:return_code] } format.json { render json: { message: result.message }, status: result.http_status }
end end
end end
......
...@@ -6,27 +6,25 @@ class DeleteBranchService < BaseService ...@@ -6,27 +6,25 @@ class DeleteBranchService < BaseService
branch = repository.find_branch(branch_name) branch = repository.find_branch(branch_name)
unless current_user.can?(:push_code, project) unless current_user.can?(:push_code, project)
return error('You dont have push access to repo', 405) return ServiceResponse.error(
message: 'You dont have push access to repo',
http_status: 405)
end end
unless branch unless branch
return error('No such branch', 404) return ServiceResponse.error(
message: 'No such branch',
http_status: 404)
end end
if repository.rm_branch(current_user, branch_name) if repository.rm_branch(current_user, branch_name)
success('Branch was deleted') ServiceResponse.success(message: 'Branch was deleted')
else else
error('Failed to remove branch') ServiceResponse.error(
message: 'Failed to remove branch',
http_status: 400)
end end
rescue Gitlab::Git::PreReceiveError => ex rescue Gitlab::Git::PreReceiveError => ex
error(ex.message) ServiceResponse.error(message: ex.message, http_status: 400)
end
def error(message, return_code = 400)
super(message).merge(return_code: return_code)
end
def success(message)
super().merge(message: message)
end end
end end
# frozen_string_literal: true
class ServiceResponse
def self.success(message: nil)
new(status: :success, message: message)
end
def self.error(message:, http_status: nil)
new(status: :error, message: message, http_status: http_status)
end
attr_reader :status, :message, :http_status
def initialize(status:, message: nil, http_status: nil)
self.status = status
self.message = message
self.http_status = http_status
end
def success?
status == :success
end
def error?
status == :error
end
private
attr_writer :status, :message, :http_status
end
...@@ -162,8 +162,8 @@ module API ...@@ -162,8 +162,8 @@ module API
result = DeleteBranchService.new(user_project, current_user) result = DeleteBranchService.new(user_project, current_user)
.execute(params[:branch]) .execute(params[:branch])
if result[:status] != :success if result.error?
render_api_error!(result[:message], result[:return_code]) render_api_error!(result.message, result.http_status)
end end
end end
end end
......
...@@ -8,20 +8,24 @@ describe DeleteBranchService do ...@@ -8,20 +8,24 @@ describe DeleteBranchService do
let(:user) { create(:user) } let(:user) { create(:user) }
let(:service) { described_class.new(project, user) } let(:service) { described_class.new(project, user) }
shared_examples 'a deleted branch' do |branch_name|
it 'removes the branch' do
expect(branch_exists?(branch_name)).to be true
result = service.execute(branch_name)
expect(result.status).to eq :success
expect(branch_exists?(branch_name)).to be false
end
end
describe '#execute' do describe '#execute' do
context 'when user has access to push to repository' do context 'when user has access to push to repository' do
before do before do
project.add_developer(user) project.add_developer(user)
end end
it 'removes the branch' do it_behaves_like 'a deleted branch', 'feature'
expect(branch_exists?('feature')).to be true
result = service.execute('feature')
expect(result[:status]).to eq :success
expect(branch_exists?('feature')).to be false
end
end end
context 'when user does not have access to push to repository' do context 'when user does not have access to push to repository' do
...@@ -30,8 +34,8 @@ describe DeleteBranchService do ...@@ -30,8 +34,8 @@ describe DeleteBranchService do
result = service.execute('feature') result = service.execute('feature')
expect(result[:status]).to eq :error expect(result.status).to eq :error
expect(result[:message]).to eq 'You dont have push access to repo' expect(result.message).to eq 'You dont have push access to repo'
expect(branch_exists?('feature')).to be true expect(branch_exists?('feature')).to be true
end end
end end
......
# frozen_string_literal: true
require 'fast_spec_helper'
ActiveSupport::Dependencies.autoload_paths << 'app/services'
describe ServiceResponse do
describe '.success' do
it 'creates a successful response without a message' do
expect(described_class.success).to be_success
end
it 'creates a successful response with a message' do
response = described_class.success(message: 'Good orange')
expect(response).to be_success
expect(response.message).to eq('Good orange')
end
end
describe '.error' do
it 'creates a failed response without HTTP status' do
response = described_class.error(message: 'Bad apple')
expect(response).to be_error
expect(response.message).to eq('Bad apple')
end
it 'creates a failed response with HTTP status' do
response = described_class.error(message: 'Bad apple', http_status: 400)
expect(response).to be_error
expect(response.message).to eq('Bad apple')
expect(response.http_status).to eq(400)
end
end
describe '#success?' do
it 'returns true for a successful response' do
expect(described_class.success.success?).to eq(true)
end
it 'returns false for a failed response' do
expect(described_class.error(message: 'Bad apple').success?).to eq(false)
end
end
describe '#error?' do
it 'returns false for a successful response' do
expect(described_class.success.error?).to eq(false)
end
it 'returns true for a failed response' do
expect(described_class.error(message: 'Bad apple').error?).to eq(true)
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment