Skip to content

Commit

Permalink
Merge pull request #6190 from vpereira/add_remove_requests_from_stagi…
Browse files Browse the repository at this point in the history
…ng_project

Assign and unassigned requests to staging project
  • Loading branch information
ChrisBr committed Nov 19, 2018
2 parents 9018945 + 5d53340 commit 9cff063
Show file tree
Hide file tree
Showing 23 changed files with 9,324 additions and 33 deletions.
9 changes: 0 additions & 9 deletions src/api/app/controllers/staging/projects_controller.rb

This file was deleted.

80 changes: 78 additions & 2 deletions src/api/app/controllers/staging/staged_requests_controller.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,81 @@
class Staging::StagedRequestsController < Staging::ProjectsController
class Staging::StagedRequestsController < ApplicationController
before_action :require_login, except: [:index]
before_action :set_staging_project
before_action :set_staging_workflow, :set_project, :set_xml_hash, only: [:create, :destroy]

def index
@requests = @project.staged_requests
@requests = @staging_project.staged_requests
end

def create
authorize @staging_project, :update?
requests = @staging_workflow.unassigned_requests.where(number: request_numbers)

result = ::Staging::StageRequests.new(requests: requests, staging_project_name: @staging_project.name).perform
@staging_project.staged_requests << result
unassigned_requests = request_numbers - result.pluck(:number).map(&:to_s)

if unassigned_requests.empty?
render_ok
else
render_error(
status: 400,
errorcode: 'invalid_request',
message: "Could not assign requests #{unassigned_requests.to_sentence} to #{@staging_project}."
)
end
end

def destroy
authorize @staging_project, :update?
requests = @staging_project.staged_requests.where(number: request_numbers)
package_names = requests.joins(:bs_request_actions).pluck('bs_request_actions.target_package')

@staging_project.staged_requests.delete(requests)
not_unassigned_requests = request_numbers - requests.pluck(:number).map(&:to_s)

result = @staging_project.packages.where(name: package_names).destroy_all
not_deleted_packages = package_names - result.pluck(:name)

if not_unassigned_requests.empty? && not_deleted_packages.empty?
render_ok
else
message = 'Error while unassigning requests: '
message << "Requests with number #{not_unassigned_requests.to_sentence} not found. " unless not_unassigned_requests.empty?
message << "Could not delete packages #{not_deleted_packages.to_sentence}." unless not_deleted_packages.empty?
render_error(
status: 400,
errorcode: 'invalid_request',
message: message
)
end
end

private

def set_xml_hash
@xml_hash = (Xmlhash.parse(request.body.read) || {}).with_indifferent_access
end

def request_numbers
[@xml_hash[:number]].flatten
end

def set_staging_project
@staging_project = Staging::StagingProject.find_by!(name: params[:staging_project_name])
end

def set_staging_workflow
@staging_workflow = @staging_project.staging_workflow
return if @staging_workflow
render_error(
status: 422,
errorcode: 'invalid_request',
message: "#{@staging_project} is not a valid staging project, can't assign requests to it."
)
end

def set_project
@project = @staging_workflow.project
end
end
38 changes: 38 additions & 0 deletions src/api/app/models/staging/stage_requests.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
class Staging::StageRequests
include ActiveModel::Model
attr_accessor :requests, :staging_project_name

def perform
self.result = []
requests.each do |request|
bs_request_action = request.bs_request_actions.first
if bs_request_action.is_submit?
branch_package(bs_request_action)
elsif bs_request_action.is_delete?
# TODO: implement delete requests
end
result
end
end

private

attr_accessor :result

def branch_package(bs_request_action)
request = bs_request_action.bs_request
BranchPackage.new(
target_project: staging_project_name,
target_package: bs_request_action.target_package,
project: bs_request_action.source_project,
package: bs_request_action.source_package,
extend_package_names: false
).branch
result << request
rescue BranchPackage::DoubleBranchPackageError
# we leave the package there and do not report as success
# because packages might differ
rescue APIError, Backend::Error => e
Airbrake.notify(e, bs_request: request.number)
end
end
4 changes: 2 additions & 2 deletions src/api/app/models/staging/workflow.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ def ready_to_stage
after_create :create_staging_projects

def unassigned_requests
target_of_bs_requests.stageable - staged_requests - ignored_requests
target_of_bs_requests.stageable.where.not(id: ignored_requests | staged_requests)
end

def ready_requests
target_of_bs_requests.ready_to_stage - staged_requests - ignored_requests
target_of_bs_requests.ready_to_stage.where.not(id: ignored_requests | staged_requests)
end

def ignored_requests
Expand Down
23 changes: 23 additions & 0 deletions src/api/app/policies/staging/staging_project_policy.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
class Staging::StagingProjectPolicy < ApplicationPolicy
def initialize(user, record)
raise Pundit::NotAuthorizedError, 'staging workflow does not exist' unless record
@user = user
@record = record
end

def create?
ProjectPolicy.new(@user, @record).create?
end

def update?
ProjectPolicy.new(@user, @record).update?
end

def edit?
update?
end

def destroy?
ProjectPolicy.new(@user, @record).destroy?
end
end
5 changes: 4 additions & 1 deletion src/api/config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -730,7 +730,10 @@ def self.public_or_about_path?(request)
end

# StagingWorkflow API
get 'staging_project/:project/staged_requests' => 'staging/staged_requests#index', constraints: cons, as: 'staged_requests'
resources :staging_project, only: [], param: :name do
get 'staged_requests' => 'staging/staged_requests#index', constraints: cons
resource :staged_requests, controller: 'staging/staged_requests', only: [:create, :destroy], constraints: cons
end

controller :source_attribute do
get 'source/:project(/:package(/:binary))/_attribute(/:attribute)' => :show, constraints: cons
Expand Down

0 comments on commit 9cff063

Please sign in to comment.