diff --git a/src/api/app/controllers/webui/projects/meta_controller.rb b/src/api/app/controllers/webui/projects/meta_controller.rb index 69909e7150fd..79c1a80a0e86 100644 --- a/src/api/app/controllers/webui/projects/meta_controller.rb +++ b/src/api/app/controllers/webui/projects/meta_controller.rb @@ -2,8 +2,7 @@ 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 :set_project before_action :validate_meta, only: [:update], unless: -> { !params[:meta] } after_action :verify_authorized, only: [:update] @@ -14,14 +13,18 @@ def show def update authorize @project, :update? - errors = [] - errors = validate_request_and_set_error(errors) - errors = run_update(errors) if errors.empty? + errors = validate_request_and_set_error + + if errors.empty? + err = run_update + errors << err if err + end + status = if errors.empty? flash.now[:success] = 'Config successfully saved!' 200 else - flash.now[:error] = errors.compact.join("\n") + flash.now[:error] = errors.join("\n") 400 end switch_to_webui2 @@ -31,40 +34,30 @@ 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::MetaValidator.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 + def validate_request_and_set_error + request_validator = ::MetaControllerService::RequestValidator.new(project: @project, request_data: @request_data) + request_validator.call + request_validator.errors end - def set_project_by_name - @project = Project.get_by_name(params[:project]) - rescue Project::UnknownObjectError - @project = nil + def run_update + project_validator = ::MetaControllerService::ProjectUpdater.new(project: @project, request_data: @request_data) + project_validator.call + project_validator.errors end end end diff --git a/src/api/app/services/meta_controller_service/meta_validator.rb b/src/api/app/services/meta_controller_service/meta_validator.rb new file mode 100644 index 000000000000..b8ad99e3677a --- /dev/null +++ b/src/api/app/services/meta_controller_service/meta_validator.rb @@ -0,0 +1,22 @@ +module MetaControllerService + class MetaValidator + require_dependency 'opensuse/validator' + + attr_reader :meta, :request_data, :errors + + def initialize(params = {}) + @meta = params[:meta] if params.key?(: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 diff --git a/src/api/app/services/meta_controller_service/project_updater.rb b/src/api/app/services/meta_controller_service/project_updater.rb new file mode 100644 index 000000000000..c4081241bded --- /dev/null +++ b/src/api/app/services/meta_controller_service/project_updater.rb @@ -0,0 +1,21 @@ +module MetaControllerService + class ProjectUpdater + attr_reader :errors + + def initialize(params = {}) + @project = params[:project] if params.key?(:project) + @request_data = params[:request_data] if params.key?(:request_data) + end + + def call + Project.transaction do + @errors = @project.update_from_xml(@request_data)[:error] + @project.store unless errors? + end + end + + def errors? + @errors.present? + end + end +end diff --git a/src/api/app/services/meta_controller_service/request_validator.rb b/src/api/app/services/meta_controller_service/request_validator.rb new file mode 100644 index 000000000000..b9ab631c194f --- /dev/null +++ b/src/api/app/services/meta_controller_service/request_validator.rb @@ -0,0 +1,24 @@ +module MetaControllerService + class RequestValidator + attr_reader :project, :request_data, :errors + def initialize(params = {}) + @project = params[:project] if params.key?(:project) + @request_data = params[:request_data] if params.key?(: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 errors? + @errors.empty? + end + end +end diff --git a/src/api/spec/controllers/webui/projects/meta_controller_spec.rb b/src/api/spec/controllers/webui/projects/meta_controller_spec.rb index b6b7bffb5923..3b3c88acd432 100644 --- a/src/api/spec/controllers/webui/projects/meta_controller_spec.rb +++ b/src/api/spec/controllers/webui/projects/meta_controller_spec.rb @@ -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