Skip to content

Commit

Permalink
Create service classes and use only set_project before_action
Browse files Browse the repository at this point in the history
  • Loading branch information
vpereira committed Dec 5, 2018
1 parent fb36d9e commit 5c94e8f
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 40 deletions.
54 changes: 15 additions & 39 deletions src/api/app/controllers/webui/projects/meta_controller.rb
@@ -1,10 +1,8 @@
module Webui
module Projects
class MetaController < WebuiController
require_dependency 'opensuse/validator'
before_action :set_project, only: [:show]
before_action :set_project_by_name, only: [:update]
before_action :validate_meta, only: [:update], unless: -> { !params[:meta] }
before_action :set_project
before_action :validate_meta, only: [:update], if: -> { params[:meta] }
after_action :verify_authorized, only: [:update]

def show
Expand All @@ -14,14 +12,14 @@ def show

def update
authorize @project, :update?
errors = []
errors = validate_request_and_set_error(errors)
errors = run_update(errors) if errors.empty?
status = if errors.empty?
updater = ::MetaControllerService::ProjectUpdater.new(project: @project, request_data: @request_data)
updater.call

status = if updater.valid?
flash.now[:success] = 'Config successfully saved!'
200
else
flash.now[:error] = errors.compact.join("\n")
flash.now[:error] = updater.errors
400
end
switch_to_webui2
Expand All @@ -31,41 +29,19 @@ def update
private

def validate_meta
Suse::Validator.validate('project', params[:meta])
@request_data = Xmlhash.parse(params[:meta])
rescue Suse::ValidationError => exception
flash.now[:error] = exception.message
render layout: false, status: 400, partial: "layouts/#{view_namespace}/flash", object: flash
meta_validator = ::MetaControllerService::MetaXMLValidator.new(params)
meta_validator.call
if meta_validator.errors?
flash.now[:error] = meta_validator.errors
render layout: false, status: 400, partial: "layouts/#{view_namespace}/flash", object: flash
else
@request_data = meta_validator.request_data
end
end

def view_namespace
switch_to_webui2? ? 'webui2' : 'webui'
end

def validate_request_and_set_error(errors)
remove_repositories = @project.get_removed_repositories(@request_data)
errors << Project.check_repositories(remove_repositories)[:error]
errors << Project.validate_remote_permissions(@request_data)[:error]
errors << Project.validate_link_xml_attribute(@request_data, @project.name)[:error]
errors << Project.validate_maintenance_xml_attribute(@request_data)[:error]
errors << Project.validate_repository_xml_attribute(@request_data, @project.name)[:error]
errors.compact
end

def run_update(errors)
Project.transaction do
errors << @project.update_from_xml(@request_data)[:error]
errors = errors.compact
@project.store if errors.empty?
end
errors.compact
end

def set_project_by_name
@project = Project.get_by_name(params[:project])
rescue Project::UnknownObjectError
@project = nil
end
end
end
end
25 changes: 25 additions & 0 deletions src/api/app/services/meta_controller_service/meta_validator.rb
@@ -0,0 +1,25 @@
module MetaControllerService
class MetaValidator
attr_reader :project, :request_data, :errors

def initialize(params = {})
@project = params[:project]
@request_data = params[:request_data]
@errors = []
end

def call
remove_repositories = @project.get_removed_repositories(@request_data)
@errors << Project.check_repositories(remove_repositories)[:error]
@errors << Project.validate_remote_permissions(@request_data)[:error]
@errors << Project.validate_link_xml_attribute(@request_data, @project.name)[:error]
@errors << Project.validate_maintenance_xml_attribute(@request_data)[:error]
@errors << Project.validate_repository_xml_attribute(@request_data, @project.name)[:error]
@errors.compact!
end

def valid?
@errors.empty?
end
end
end
22 changes: 22 additions & 0 deletions src/api/app/services/meta_controller_service/meta_xml_validator.rb
@@ -0,0 +1,22 @@
module MetaControllerService
class MetaXMLValidator
require_dependency 'opensuse/validator'

attr_reader :meta, :request_data, :errors

def initialize(params = {})
@meta = params[:meta]
end

def call
Suse::Validator.validate('project', @meta)
@request_data = Xmlhash.parse(@meta)
rescue Suse::ValidationError => exception
@errors = exception.message
end

def errors?
@errors.present?
end
end
end
30 changes: 30 additions & 0 deletions src/api/app/services/meta_controller_service/project_updater.rb
@@ -0,0 +1,30 @@
module MetaControllerService
class ProjectUpdater
def initialize(project: nil, request_data: {}, validator_klass: ::MetaControllerService::MetaValidator)
@project = project
@request_data = request_data
@validator = validator_klass.new(project: project, request_data: request_data)
end

def call
@validator.call
unless @validator.valid?
@errors = @validator.errors
return
end

Project.transaction do
@errors = @project.update_from_xml(@request_data)[:error]
@project.store if valid?
end
end

def errors
@errors.is_a?(Array) ? @errors.join("\n") : @errors
end

def valid?
@validator.valid? && @errors.blank?
end
end
end
Expand Up @@ -20,7 +20,7 @@
context 'with a nonexistent project' do
let(:post_save_meta) { post :update, params: { project: 'nonexistent_project' }, xhr: true }

it { expect { post_save_meta }.to raise_error(Pundit::NotDefinedError) }
it { expect { post_save_meta }.to raise_error(ActiveRecord::RecordNotFound) }
end

context 'with a valid project' do
Expand Down

0 comments on commit 5c94e8f

Please sign in to comment.