Skip to content

Commit

Permalink
Merge pull request #5115 from vpereira/source-project-meta
Browse files Browse the repository at this point in the history
[api] move project meta actions to its own controller and make it REST
  • Loading branch information
bgeuken committed Jun 11, 2018
2 parents 025a7c6 + a5d483a commit 9f2f56e
Show file tree
Hide file tree
Showing 9 changed files with 187 additions and 183 deletions.
93 changes: 0 additions & 93 deletions src/api/app/controllers/source_project_controller.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
class SourceProjectController < SourceController
validate_action update_project_meta: { request: :project, response: :status }
validate_action show_project_meta: { response: :project }

# GET /source/:project
def show
project_name = params[:project]
Expand Down Expand Up @@ -116,94 +113,4 @@ def project_command
raise CmdExecutionNoPermission, "no permission to execute command '#{command}'"
end
end

# GET /source/:project/_meta
#---------------------------
def show_project_meta
if Project.find_remote_project params[:project]
# project from remote buildservice, get metadata from backend
raise InvalidProjectParameters if params[:view]
pass_to_backend
else
# access check
prj = Project.get_by_name params[:project]
render xml: prj.to_axml
end
end

# PUT /source/:project/_meta
def update_project_meta
project_name = params[:project]
params[:user] = User.current.login

request_data = Xmlhash.parse(request.raw_post)

# permission check
if request_data['name'] != project_name
raise ProjectNameMismatch, "project name in xml data ('#{request_data['name']}) does not match resource path component ('#{project_name}')"
end

begin
project = Project.get_by_name(request_data['name'])
rescue Project::UnknownObjectError
project = nil
end

# Need permission
logger.debug 'Checking permission for the put'
if project
# project exists, change it
unless User.current.can_modify_project?(project)
if project.is_locked?
logger.debug "no permission to modify LOCKED project #{project.name}"
raise ChangeProjectNoPermission, "The project #{project.name} is locked"
end
logger.debug "user #{user.login} has no permission to modify project #{project.name}"
raise ChangeProjectNoPermission, 'no permission to change project'
end
else
# project is new
unless User.current.can_create_project?(project_name)
logger.debug 'Not allowed to create new project'
raise CreateProjectNoPermission, "no permission to create project #{project_name}"
end
end

# projects using remote resources must be edited by the admin
result = Project.validate_remote_permissions(request_data)
if result[:error]
raise ChangeProjectNoPermission, 'admin rights are required to change projects using remote resources'
end

result = Project.validate_link_xml_attribute(request_data, project_name)
raise ProjectReadAccessFailure, result[:error] if result[:error]

result = Project.validate_maintenance_xml_attribute(request_data)
raise ModifyProjectNoPermission, result[:error] if result[:error]

result = Project.validate_repository_xml_attribute(request_data, project_name)
raise RepositoryAccessFailure, result[:error] if result[:error]

if project
remove_repositories = project.get_removed_repositories(request_data)
opts = { no_write_to_backend: true,
force: params[:force].present?,
recursive_remove: params[:remove_linking_repositories].present? }
check_and_remove_repositories!(remove_repositories, opts)
end

Project.transaction do
# exec
if project
project.update_from_xml!(request_data)
else
project = Project.new(name: project_name)
project.update_from_xml!(request_data)
# FIXME3.0: don't modify send data
project.relationships.build(user: User.current, role: Role.find_by_title!('maintainer'))
end
project.store(comment: params[:comment])
end
render_ok
end
end
94 changes: 94 additions & 0 deletions src/api/app/controllers/source_project_meta_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
class SourceProjectMetaController < SourceController
validate_action update: { request: :project, response: :status }
validate_action show: { response: :project }

# GET /source/:project/_meta
#---------------------------
def show
if Project.find_remote_project params[:project]
# project from remote buildservice, get metadata from backend
raise InvalidProjectParameters if params[:view]
pass_to_backend
else
# access check
prj = Project.get_by_name params[:project]
render xml: prj.to_axml
end
end

# PUT /source/:project/_meta
def update
project_name = params[:project]
params[:user] = User.current.login

request_data = Xmlhash.parse(request.raw_post)

# permission check
if request_data['name'] != project_name
raise ProjectNameMismatch, "project name in xml data ('#{request_data['name']}) does not match resource path component ('#{project_name}')"
end

begin
project = Project.get_by_name(request_data['name'])
rescue Project::UnknownObjectError
project = nil
end

# Need permission
logger.debug 'Checking permission for the put'
if project
# project exists, change it
unless User.current.can_modify_project?(project)
if project.is_locked?
logger.debug "no permission to modify LOCKED project #{project.name}"
raise ChangeProjectNoPermission, "The project #{project.name} is locked"
end
logger.debug "user #{user.login} has no permission to modify project #{project.name}"
raise ChangeProjectNoPermission, 'no permission to change project'
end
else
# project is new
unless User.current.can_create_project?(project_name)
logger.debug 'Not allowed to create new project'
raise CreateProjectNoPermission, "no permission to create project #{project_name}"
end
end

# projects using remote resources must be edited by the admin
result = Project.validate_remote_permissions(request_data)
if result[:error]
raise ChangeProjectNoPermission, 'admin rights are required to change projects using remote resources'
end

result = Project.validate_link_xml_attribute(request_data, project_name)
raise ProjectReadAccessFailure, result[:error] if result[:error]

result = Project.validate_maintenance_xml_attribute(request_data)
raise ModifyProjectNoPermission, result[:error] if result[:error]

result = Project.validate_repository_xml_attribute(request_data, project_name)
raise RepositoryAccessFailure, result[:error] if result[:error]

if project
remove_repositories = project.get_removed_repositories(request_data)
opts = { no_write_to_backend: true,
force: params[:force].present?,
recursive_remove: params[:remove_linking_repositories].present? }
check_and_remove_repositories!(remove_repositories, opts)
end

Project.transaction do
# exec
if project
project.update_from_xml!(request_data)
else
project = Project.new(name: project_name)
project.update_from_xml!(request_data)
# FIXME3.0: don't modify send data
project.relationships.build(user: User.current, role: Role.find_by_title!('maintainer'))
end
project.store(comment: params[:comment])
end
render_ok
end
end
7 changes: 5 additions & 2 deletions src/api/config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -730,12 +730,15 @@ def self.public_or_about_path?(request)
end

# project level
controller :source_project_meta do
get 'source/:project/_meta' => :show, constraints: cons
put 'source/:project/_meta' => :update, constraints: cons
end

controller :source_project do
get 'source/:project' => :show, constraints: cons
delete 'source/:project' => :delete, constraints: cons
post 'source/:project' => :project_command, constraints: cons
get 'source/:project/_meta' => :show_project_meta, constraints: cons
put 'source/:project/_meta' => :update_project_meta, constraints: cons
end

controller :source do
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
require 'rails_helper'

RSpec.describe SourceProjectController, vcr: true do
RSpec.describe SourceProjectMetaController, vcr: true do
let(:user) { create(:confirmed_user, login: 'tom') }
let(:project) { user.home_project }

describe 'GET #show_project_meta' do
describe 'GET #show' do
before do
login user
get :show_project_meta, params: { project: project }
get :show, params: { project: project }
end

it { expect(response).to be_success }
Expand Down
Loading

0 comments on commit 9f2f56e

Please sign in to comment.