Modify builds scope filtering in builds API

This commit is contained in:
Tomasz Maczukin 2016-01-08 14:01:31 +01:00
parent a862ade55b
commit 549a2fa787
4 changed files with 39 additions and 16 deletions

View file

@ -94,6 +94,10 @@ module Ci
new_build.save
new_build
end
def available_statuses
state_machines[:status].states.map &:value
end
end
state_machine :status, initial: :pending do

View file

@ -11,7 +11,7 @@ GET /projects/:id/builds
Parameters:
- `id` (required) - The ID of a project
- `scope` (optional) - The scope of builds to show (one of: `all`, `finished`, `running`; default: `all`)
- `scope` (optional) - The scope of builds to show (one or array of: pending, running, failed, success, canceled; if none provided showing all builds)
```json
[
@ -64,8 +64,7 @@ Parameters:
- `id` (required) - The ID of a project
- `sha` (required) - The SHA id of a commit
- `scope` (optional) - The scope of builds to show (one of: `all`, `finished`, `running`; default: `all`)
- `scope` (optional) - The scope of builds to show (one or array of: pending, running, failed, success, canceled; if none provided showing all builds)
```json
[

View file

@ -8,9 +8,8 @@ module API
#
# Parameters:
# id (required) - The ID of a project
# scope (optional) - The scope of builds to show (one of: all, finished, running; default: all)
# page (optional) - The page number for pagination
# per_page (ooptional) - The value of items per page to show
# scope (optional) - The scope of builds to show (one or array of: pending, running, failed, success, canceled;
# if none provided showing all builds)
# Example Request:
# GET /projects/:id/builds
get ':id/builds' do
@ -24,7 +23,8 @@ module API
# Parameters:
# id (required) - The ID of a project
# sha (required) - The SHA id of a commit
# scope (optional) - The scope of builds to show (one of: all, finished, running; default: all)
# scope (optional) - The scope of builds to show (one or array of: pending, running, failed, success, canceled;
# if none provided showing all builds)
# Example Request:
# GET /projects/:id/builds/commit/:sha
get ':id/builds/commit/:sha' do
@ -112,14 +112,21 @@ module API
end
def filter_builds(builds, scope)
case scope
when 'finished'
builds.finished
when 'running'
builds.running
else
builds
end
available_scopes = Ci::Build.available_statuses
scope =
if scope.is_a?(String) || scope.is_a?(Symbol)
available_scopes & [scope.to_s]
elsif scope.is_a?(Array)
available_scopes & scope
elsif scope.respond_to?(:to_h)
available_scopes & scope.to_h.values
else
[]
end
return builds if scope.empty?
builds.where(status: scope)
end
def authorize_manage_builds!

View file

@ -18,7 +18,20 @@ describe API::API, api: true do
it 'should return project builds' do
get api("/projects/#{project.id}/builds", user)
puts json_response
expect(response.status).to eq(200)
expect(json_response).to be_an Array
end
it 'should filter project with one scope element' do
get api("/projects/#{project.id}/builds?scope=pending", user)
expect(response.status).to eq(200)
expect(json_response).to be_an Array
end
it 'should filter project with array of scope elements' do
get api("/projects/#{project.id}/builds?scope[0]=pending&scope[1]=running", user)
expect(response.status).to eq(200)
expect(json_response).to be_an Array
end