Commit 838c1aad authored by Yorick Peterse's avatar Yorick Peterse

Merge branch '22373-reduce-queries-in-api-helpers-find_project' into 'master'

Resolve "Reduce queries in API::Helpers#find_project"

See merge request !7714
parents afe90d52 81ba3f91
---
title: 'Make API::Helpers find a project with only one query'
merge_request: 7714
author:
...@@ -82,7 +82,7 @@ module API ...@@ -82,7 +82,7 @@ module API
:lfs_enabled, :request_access_enabled :lfs_enabled, :request_access_enabled
end end
put ':id' do put ':id' do
group = find_group(params[:id]) group = find_group!(params[:id])
authorize! :admin_group, group authorize! :admin_group, group
if ::Groups::UpdateService.new(group, current_user, declared_params(include_missing: false)).execute if ::Groups::UpdateService.new(group, current_user, declared_params(include_missing: false)).execute
...@@ -96,13 +96,13 @@ module API ...@@ -96,13 +96,13 @@ module API
success Entities::GroupDetail success Entities::GroupDetail
end end
get ":id" do get ":id" do
group = find_group(params[:id]) group = find_group!(params[:id])
present group, with: Entities::GroupDetail present group, with: Entities::GroupDetail
end end
desc 'Remove a group.' desc 'Remove a group.'
delete ":id" do delete ":id" do
group = find_group(params[:id]) group = find_group!(params[:id])
authorize! :admin_group, group authorize! :admin_group, group
DestroyGroupService.new(group, current_user).execute DestroyGroupService.new(group, current_user).execute
end end
...@@ -111,7 +111,7 @@ module API ...@@ -111,7 +111,7 @@ module API
success Entities::Project success Entities::Project
end end
get ":id/projects" do get ":id/projects" do
group = find_group(params[:id]) group = find_group!(params[:id])
projects = GroupProjectsFinder.new(group).execute(current_user) projects = GroupProjectsFinder.new(group).execute(current_user)
projects = paginate projects projects = paginate projects
present projects, with: Entities::Project, user: current_user present projects, with: Entities::Project, user: current_user
......
...@@ -68,7 +68,7 @@ module API ...@@ -68,7 +68,7 @@ module API
end end
def user_project def user_project
@project ||= find_project(params[:id]) @project ||= find_project!(params[:id])
end end
def available_labels def available_labels
...@@ -76,7 +76,15 @@ module API ...@@ -76,7 +76,15 @@ module API
end end
def find_project(id) 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) if can?(current_user, :read_project, project)
project project
...@@ -97,7 +105,15 @@ module API ...@@ -97,7 +105,15 @@ module API
end end
def find_group(id) 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) if can?(current_user, :read_group, group)
group group
......
...@@ -2,7 +2,7 @@ module API ...@@ -2,7 +2,7 @@ module API
module Helpers module Helpers
module MembersHelpers module MembersHelpers
def find_source(source_type, id) def find_source(source_type, id)
public_send("find_#{source_type}", id) public_send("find_#{source_type}!", id)
end end
def authorize_admin_source!(source_type, source) def authorize_admin_source!(source_type, source)
......
...@@ -68,7 +68,7 @@ module API ...@@ -68,7 +68,7 @@ module API
# GET /groups/:id/issues?milestone=1.0.0 # GET /groups/:id/issues?milestone=1.0.0
# GET /groups/:id/issues?milestone=1.0.0&state=closed # GET /groups/:id/issues?milestone=1.0.0&state=closed
get ":id/issues" do get ":id/issues" do
group = find_group(params[:id]) group = find_group!(params[:id])
params[:state] ||= 'opened' params[:state] ||= 'opened'
params[:group_id] = group.id params[:group_id] = group.id
......
...@@ -379,7 +379,7 @@ module API ...@@ -379,7 +379,7 @@ module API
# POST /projects/:id/fork/:forked_from_id # POST /projects/:id/fork/:forked_from_id
post ":id/fork/:forked_from_id" do post ":id/fork/:forked_from_id" do
authenticated_as_admin! 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? unless forked_from_project.nil?
if user_project.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) 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 ...@@ -65,7 +65,7 @@ module API
detail 'Added in GitLab 8.13' detail 'Added in GitLab 8.13'
end end
post ':id/services/:service_slug/trigger' do 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 # This is not accurate, but done to prevent leakage of the project names
not_found!('Service') unless project not_found!('Service') unless project
......
...@@ -13,7 +13,7 @@ module API ...@@ -13,7 +13,7 @@ module API
optional :variables, type: Hash, desc: 'The list of variables to be injected into build' optional :variables, type: Hash, desc: 'The list of variables to be injected into build'
end end
post ":id/(ref/:ref/)trigger/builds" do 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) trigger = Ci::Trigger.find_by_token(params[:token].to_s)
not_found! unless project && trigger not_found! unless project && trigger
unauthorized! unless trigger.project == project unauthorized! unless trigger.project == project
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment