Merge branch '22373-reduce-queries-in-api-helpers-find_project' into 'master'
Resolve "Reduce queries in API::Helpers#find_project" See merge request !7714
This commit is contained in:
commit
838c1aad68
8 changed files with 32 additions and 12 deletions
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: 'Make API::Helpers find a project with only one query'
|
||||
merge_request: 7714
|
||||
author:
|
|
@ -82,7 +82,7 @@ module API
|
|||
:lfs_enabled, :request_access_enabled
|
||||
end
|
||||
put ':id' do
|
||||
group = find_group(params[:id])
|
||||
group = find_group!(params[:id])
|
||||
authorize! :admin_group, group
|
||||
|
||||
if ::Groups::UpdateService.new(group, current_user, declared_params(include_missing: false)).execute
|
||||
|
@ -96,13 +96,13 @@ module API
|
|||
success Entities::GroupDetail
|
||||
end
|
||||
get ":id" do
|
||||
group = find_group(params[:id])
|
||||
group = find_group!(params[:id])
|
||||
present group, with: Entities::GroupDetail
|
||||
end
|
||||
|
||||
desc 'Remove a group.'
|
||||
delete ":id" do
|
||||
group = find_group(params[:id])
|
||||
group = find_group!(params[:id])
|
||||
authorize! :admin_group, group
|
||||
DestroyGroupService.new(group, current_user).execute
|
||||
end
|
||||
|
@ -111,7 +111,7 @@ module API
|
|||
success Entities::Project
|
||||
end
|
||||
get ":id/projects" do
|
||||
group = find_group(params[:id])
|
||||
group = find_group!(params[:id])
|
||||
projects = GroupProjectsFinder.new(group).execute(current_user)
|
||||
projects = paginate projects
|
||||
present projects, with: Entities::Project, user: current_user
|
||||
|
|
|
@ -68,7 +68,7 @@ module API
|
|||
end
|
||||
|
||||
def user_project
|
||||
@project ||= find_project(params[:id])
|
||||
@project ||= find_project!(params[:id])
|
||||
end
|
||||
|
||||
def available_labels
|
||||
|
@ -76,7 +76,15 @@ module API
|
|||
end
|
||||
|
||||
def find_project(id)
|
||||
project = Project.find_with_namespace(id) || Project.find_by(id: id)
|
||||
if id =~ /^\d+$/
|
||||
Project.find_by(id: id)
|
||||
else
|
||||
Project.find_with_namespace(id)
|
||||
end
|
||||
end
|
||||
|
||||
def find_project!(id)
|
||||
project = find_project(id)
|
||||
|
||||
if can?(current_user, :read_project, project)
|
||||
project
|
||||
|
@ -97,7 +105,15 @@ module API
|
|||
end
|
||||
|
||||
def find_group(id)
|
||||
group = Group.find_by(path: id) || Group.find_by(id: id)
|
||||
if id =~ /^\d+$/
|
||||
Group.find_by(id: id)
|
||||
else
|
||||
Group.find_by(path: id)
|
||||
end
|
||||
end
|
||||
|
||||
def find_group!(id)
|
||||
group = find_group(id)
|
||||
|
||||
if can?(current_user, :read_group, group)
|
||||
group
|
||||
|
|
|
@ -2,7 +2,7 @@ module API
|
|||
module Helpers
|
||||
module MembersHelpers
|
||||
def find_source(source_type, id)
|
||||
public_send("find_#{source_type}", id)
|
||||
public_send("find_#{source_type}!", id)
|
||||
end
|
||||
|
||||
def authorize_admin_source!(source_type, source)
|
||||
|
|
|
@ -68,7 +68,7 @@ module API
|
|||
# GET /groups/:id/issues?milestone=1.0.0
|
||||
# GET /groups/:id/issues?milestone=1.0.0&state=closed
|
||||
get ":id/issues" do
|
||||
group = find_group(params[:id])
|
||||
group = find_group!(params[:id])
|
||||
|
||||
params[:state] ||= 'opened'
|
||||
params[:group_id] = group.id
|
||||
|
|
|
@ -379,7 +379,7 @@ module API
|
|||
# POST /projects/:id/fork/:forked_from_id
|
||||
post ":id/fork/:forked_from_id" do
|
||||
authenticated_as_admin!
|
||||
forked_from_project = find_project(params[:forked_from_id])
|
||||
forked_from_project = find_project!(params[:forked_from_id])
|
||||
unless forked_from_project.nil?
|
||||
if user_project.forked_from_project.nil?
|
||||
user_project.create_forked_project_link(forked_to_project_id: user_project.id, forked_from_project_id: forked_from_project.id)
|
||||
|
|
|
@ -65,7 +65,7 @@ module API
|
|||
detail 'Added in GitLab 8.13'
|
||||
end
|
||||
post ':id/services/:service_slug/trigger' do
|
||||
project = Project.find_with_namespace(params[:id]) || Project.find_by(id: params[:id])
|
||||
project = find_project(params[:id])
|
||||
|
||||
# This is not accurate, but done to prevent leakage of the project names
|
||||
not_found!('Service') unless project
|
||||
|
|
|
@ -13,7 +13,7 @@ module API
|
|||
optional :variables, type: Hash, desc: 'The list of variables to be injected into build'
|
||||
end
|
||||
post ":id/(ref/:ref/)trigger/builds" do
|
||||
project = Project.find_with_namespace(params[:id]) || Project.find_by(id: params[:id])
|
||||
project = find_project(params[:id])
|
||||
trigger = Ci::Trigger.find_by_token(params[:token].to_s)
|
||||
not_found! unless project && trigger
|
||||
unauthorized! unless trigger.project == project
|
||||
|
|
Loading…
Reference in a new issue