Prefer service object over after_save hook

Closes #26921
This commit is contained in:
Lin Jen-Shin 2017-01-20 21:57:01 +08:00
parent 4b7e8f2570
commit 7a109402a8
7 changed files with 52 additions and 23 deletions

View file

@ -13,7 +13,7 @@ class Admin::RunnersController < Admin::ApplicationController
end
def update
if @runner.update_attributes(runner_params)
if Ci::UpdateRunnerService.new(@runner).update(runner_params)
respond_to do |format|
format.js
format.html { redirect_to admin_runner_path(@runner) }
@ -31,7 +31,7 @@ class Admin::RunnersController < Admin::ApplicationController
end
def resume
if @runner.update_attributes(active: true)
if Ci::UpdateRunnerService.new(@runner).update(active: true)
redirect_to admin_runners_path, notice: 'Runner was successfully updated.'
else
redirect_to admin_runners_path, alert: 'Runner was not updated.'
@ -39,7 +39,7 @@ class Admin::RunnersController < Admin::ApplicationController
end
def pause
if @runner.update_attributes(active: false)
if Ci::UpdateRunnerService.new(@runner).update(active: false)
redirect_to admin_runners_path, notice: 'Runner was successfully updated.'
else
redirect_to admin_runners_path, alert: 'Runner was not updated.'

View file

@ -16,7 +16,7 @@ class Projects::RunnersController < Projects::ApplicationController
end
def update
if @runner.update_attributes(runner_params)
if Ci::UpdateRunnerService.new(@runner).update(runner_params)
redirect_to runner_path(@runner), notice: 'Runner was successfully updated.'
else
render 'edit'
@ -32,7 +32,7 @@ class Projects::RunnersController < Projects::ApplicationController
end
def resume
if @runner.update_attributes(active: true)
if Ci::UpdateRunnerService.new(@runner).update(active: true)
redirect_to runner_path(@runner), notice: 'Runner was successfully updated.'
else
redirect_to runner_path(@runner), alert: 'Runner was not updated.'
@ -40,7 +40,7 @@ class Projects::RunnersController < Projects::ApplicationController
end
def pause
if @runner.update_attributes(active: false)
if Ci::UpdateRunnerService.new(@runner).update(active: false)
redirect_to runner_path(@runner), notice: 'Runner was successfully updated.'
else
redirect_to runner_path(@runner), alert: 'Runner was not updated.'

View file

@ -22,8 +22,6 @@ module Ci
scope :online, ->() { where('contacted_at > ?', LAST_CONTACT_TIME) }
scope :ordered, ->() { order(id: :desc) }
after_save :tick_runner_queue, if: :form_editable_changed?
scope :owned_or_shared, ->(project_id) do
joins('LEFT JOIN ci_runner_projects ON ci_runner_projects.runner_id = ci_runners.id')
.where("ci_runner_projects.gl_project_id = :project_id OR ci_runners.is_shared = true", project_id: project_id)
@ -149,12 +147,6 @@ module Ci
"runner:build_queue:#{self.token}"
end
def form_editable_changed?
FORM_EDITABLE.any? do |editable|
public_send("#{editable}_changed?")
end
end
def tag_constraints
unless has_tags? || run_untagged?
errors.add(:tags_list,

View file

@ -0,0 +1,15 @@
module Ci
class UpdateRunnerService
attr_reader :runner
def initialize(runner)
@runner = runner
end
def update(params)
runner.update(params).tap do
runner.tick_runner_queue
end
end
end
end

View file

@ -28,23 +28,27 @@ module Ci
post "register" do
required_attributes! [:token]
attributes = attributes_for_keys(
[:description, :tag_list, :run_untagged, :locked]
)
project = nil
runner =
if runner_registration_token_valid?
# Create shared runner. Requires admin access
Ci::Runner.create(attributes.merge(is_shared: true))
Ci::Runner.new(is_shared: true)
elsif project = Project.find_by(runners_token: params[:token])
# Create a specific runner for project.
project.runners.create(attributes)
Ci::Runner.new
end
return forbidden! unless runner
attributes = attributes_for_keys(
[:description, :tag_list, :run_untagged, :locked]
).merge(get_runner_version_from_params || {})
Ci::UpdateRunnerService.new(runner).update(attributes)
# Assign the specific runner for the project
project.runners << runner if project
if runner.id
runner.update(get_runner_version_from_params)
present runner, with: Entities::Runner
else
not_found!

View file

@ -291,7 +291,7 @@ describe Ci::Runner, models: true do
let!(:last_update) { runner.ensure_runner_queue_value }
before do
runner.update(description: 'new runner')
Ci::UpdateRunnerService.new(runner).update(description: 'new runner')
end
it 'sets a new last_update value' do

View file

@ -0,0 +1,18 @@
require 'spec_helper'
describe Ci::UpdateRunnerService, services: true do
let(:runner) { create(:ci_runner) }
describe '#update' do
before do
allow(runner).to receive(:tick_runner_queue)
described_class.new(runner).update(description: 'new runner')
end
it 'updates the runner and ticking the queue' do
expect(runner.description).to eq('new runner')
expect(runner).to have_received(:tick_runner_queue)
end
end
end