From d9da81f736b770bb44c4869aef5d5c455e74ab7a Mon Sep 17 00:00:00 2001 From: Tomasz Maczukin Date: Mon, 4 Jan 2016 16:38:32 +0100 Subject: Add triggers feature to API --- lib/api/entities.rb | 10 ++++++++ lib/api/triggers.rb | 18 ++++++++++++++ spec/factories/ci/trigger_requests.rb | 2 ++ spec/requests/api/triggers_spec.rb | 45 +++++++++++++++++++++++++++++++---- 4 files changed, 71 insertions(+), 4 deletions(-) diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 26e7c956e8f..bc0cd76a2b8 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -365,5 +365,15 @@ module API class TriggerRequest < Grape::Entity expose :id, :variables end + + class Trigger < Grape::Entity + expose :id, :token, :created_at, :updated_at, :deleted_at + expose :last_used do |repo_obj, _options| + if repo_obj.respond_to?(:last_trigger_request) + request = repo_obj.last_trigger_request + request.created_at if request + end + end + end end end diff --git a/lib/api/triggers.rb b/lib/api/triggers.rb index 2781f1cf191..9a1e3fdc976 100644 --- a/lib/api/triggers.rb +++ b/lib/api/triggers.rb @@ -43,6 +43,24 @@ module API render_api_error!(errors, 400) end end + + # Get triggers list + # + # Parameters: + # id (required) - The ID of a project + # page (optional) - The page number for pagination + # per_page (optional) - The value of items per page to show + # Example Request: + # GET /projects/:id/triggers + get ':id/triggers' do + authenticate! + authorize_admin_project + + triggers = user_project.triggers.includes(:trigger_requests) + triggers = paginate(triggers) + + present triggers, with: Entities::Trigger + end end end end diff --git a/spec/factories/ci/trigger_requests.rb b/spec/factories/ci/trigger_requests.rb index db053c610cd..5298d9fa7c3 100644 --- a/spec/factories/ci/trigger_requests.rb +++ b/spec/factories/ci/trigger_requests.rb @@ -3,6 +3,8 @@ FactoryGirl.define do factory :ci_trigger_request, class: Ci::TriggerRequest do factory :ci_trigger_request_with_variables do + trigger :ci_trigger + variables do { TRIGGER_KEY: 'TRIGGER_VALUE' diff --git a/spec/requests/api/triggers_spec.rb b/spec/requests/api/triggers_spec.rb index 314bd7ddc59..4b356108c80 100644 --- a/spec/requests/api/triggers_spec.rb +++ b/spec/requests/api/triggers_spec.rb @@ -3,11 +3,19 @@ require 'spec_helper' describe API::API do include ApiHelpers + let(:user) { create(:user) } + let(:user2) { create(:user) } + let!(:trigger_token) { 'secure token' } + let!(:trigger_token_2) { 'secure token 2' } + let!(:project) { create(:project, creator_id: user.id) } + let!(:master) { create(:project_member, user: user, project: project, access_level: ProjectMember::MASTER) } + let!(:developer) { create(:project_member, user: user2, project: project, access_level: ProjectMember::DEVELOPER) } + let!(:trigger) { create(:ci_trigger, project: project, token: trigger_token) } + let!(:trigger2) { create(:ci_trigger, project: project, token: trigger_token_2) } + let!(:trigger_request) { create(:ci_trigger_request, trigger: trigger, created_at: '2015-01-01 12:13:14') } + describe 'POST /projects/:project_id/trigger' do - let!(:trigger_token) { 'secure token' } - let!(:project) { FactoryGirl.create(:project) } - let!(:project2) { FactoryGirl.create(:empty_project) } - let!(:trigger) { FactoryGirl.create(:ci_trigger, project: project, token: trigger_token) } + let!(:project2) { create(:empty_project) } let(:options) do { token: trigger_token @@ -77,4 +85,33 @@ describe API::API do end end end + + describe 'GET /projects/:id/triggets' do + context 'authenticated user with valid permissions' do + it 'should return list of triggers' do + get api("/projects/#{project.id}/triggers", user) + + expect(response.status).to eq(200) + expect(json_response).to be_a(Array) + expect(json_response[0]['token']).to eq(trigger_token) + expect(json_response[1]['token']).to eq(trigger_token_2) + end + end + + context 'authenticated user with invalid permissions' do + it 'should not return triggers list' do + get api("/projects/#{project.id}/triggers", user2) + + expect(response.status).to eq(403) + end + end + + context 'unauthentikated user' do + it 'should not return triggers list' do + get api("/projects/#{project.id}/triggers") + + expect(response.status).to eq(401) + end + end + end end -- cgit v1.2.1 From 3098500835aad26748d982fa81c84a2deed97931 Mon Sep 17 00:00:00 2001 From: Tomasz Maczukin Date: Tue, 5 Jan 2016 11:01:44 +0100 Subject: Fix ci_trigger_request factory --- spec/factories/ci/trigger_requests.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/factories/ci/trigger_requests.rb b/spec/factories/ci/trigger_requests.rb index 5298d9fa7c3..2c0d004d267 100644 --- a/spec/factories/ci/trigger_requests.rb +++ b/spec/factories/ci/trigger_requests.rb @@ -3,7 +3,7 @@ FactoryGirl.define do factory :ci_trigger_request, class: Ci::TriggerRequest do factory :ci_trigger_request_with_variables do - trigger :ci_trigger + trigger factory: :ci_trigger variables do { -- cgit v1.2.1 From f00607431cd13a952731e36701ebc3b39e64d09b Mon Sep 17 00:00:00 2001 From: Tomasz Maczukin Date: Tue, 5 Jan 2016 11:27:38 +0100 Subject: Add delete feature to triggers API --- lib/api/triggers.rb | 19 +++++++++++++++++++ spec/requests/api/triggers_spec.rb | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/lib/api/triggers.rb b/lib/api/triggers.rb index 9a1e3fdc976..3cb7810241f 100644 --- a/lib/api/triggers.rb +++ b/lib/api/triggers.rb @@ -61,6 +61,25 @@ module API present triggers, with: Entities::Trigger end + + # Delete trigger + # + # Parameters: + # id (required) - The ID of a project + # trigger_id - The ID of trigger to delete + # Example Request: + # DELETE /projects/:id/triggers/:trigger_id + delete ':id/triggers/:trigger_id' do + authenticate! + authorize_admin_project + + trigger = user_project.triggers.where(id: params[:trigger_id].to_i).first + return not_found!('Trigger') unless trigger + + trigger.destroy + + present trigger, with: Entities::Trigger + end end end end diff --git a/spec/requests/api/triggers_spec.rb b/spec/requests/api/triggers_spec.rb index 4b356108c80..4e073a55d9c 100644 --- a/spec/requests/api/triggers_spec.rb +++ b/spec/requests/api/triggers_spec.rb @@ -114,4 +114,37 @@ describe API::API do end end end + + describe 'DELETE /projects/:id/triggets/:trigger_id' do + context 'authenticated user with valid permissions' do + it 'should delete trigger' do + expect do + delete api("/projects/#{project.id}/triggers/#{trigger.id}", user) + end.to change{project.triggers.count}.by(-1) + expect(response.status).to eq(200) + end + + it 'should responde with 404 Not Found if requesting non-existing trigger' do + delete api("/projects/#{project.id}/triggers/9999", user) + + expect(response.status).to eq(404) + end + end + + context 'authenticated user with invalid permissions' do + it 'should not delete trigger' do + delete api("/projects/#{project.id}/triggers/#{trigger.id}", user2) + + expect(response.status).to eq(403) + end + end + + context 'unauthentikated user' do + it 'should not delete trigger' do + delete api("/projects/#{project.id}/triggers/#{trigger.id}") + + expect(response.status).to eq(401) + end + end + end end -- cgit v1.2.1 From 49c8bf4e9b510be51859dcc301cb46b29b750cb0 Mon Sep 17 00:00:00 2001 From: Tomasz Maczukin Date: Tue, 5 Jan 2016 11:44:10 +0100 Subject: Add create feature to triggers API --- lib/api/triggers.rb | 16 ++++++++++++++++ spec/requests/api/triggers_spec.rb | 29 +++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/lib/api/triggers.rb b/lib/api/triggers.rb index 3cb7810241f..38cf1e9a2e0 100644 --- a/lib/api/triggers.rb +++ b/lib/api/triggers.rb @@ -62,6 +62,22 @@ module API present triggers, with: Entities::Trigger end + # Create trigger + # + # Parameters: + # id (required) - The ID of a project + # Example Request: + # POST /projects/:id/triggers + post ':id/triggers' do + authenticate! + authorize_admin_project + + trigger = user_project.triggers.new + trigger.save + + present trigger, with: Entities::Trigger + end + # Delete trigger # # Parameters: diff --git a/spec/requests/api/triggers_spec.rb b/spec/requests/api/triggers_spec.rb index 4e073a55d9c..316c2ae958d 100644 --- a/spec/requests/api/triggers_spec.rb +++ b/spec/requests/api/triggers_spec.rb @@ -115,6 +115,35 @@ describe API::API do end end + describe 'POST /projects/:id/triggets' do + context 'authenticated user with valid permissions' do + it 'should create trigger' do + expect do + post api("/projects/#{project.id}/triggers", user) + end.to change{project.triggers.count}.by(1) + + expect(response.status).to eq(201) + expect(json_response).to be_a(Hash) + end + end + + context 'authenticated user with invalid permissions' do + it 'should not create trigger' do + post api("/projects/#{project.id}/triggers", user2) + + expect(response.status).to eq(403) + end + end + + context 'unauthentikated user' do + it 'should not create trigger' do + post api("/projects/#{project.id}/triggers") + + expect(response.status).to eq(401) + end + end + end + describe 'DELETE /projects/:id/triggets/:trigger_id' do context 'authenticated user with valid permissions' do it 'should delete trigger' do -- cgit v1.2.1 From 8675664655c4e0f1e043afa88ff1fd75ae5a6a9e Mon Sep 17 00:00:00 2001 From: Tomasz Maczukin Date: Tue, 5 Jan 2016 12:25:16 +0100 Subject: Get show details feature to triggers API --- lib/api/triggers.rb | 26 ++++++++++++++++++ spec/requests/api/triggers_spec.rb | 56 ++++++++++++++++++++++++++++++++++---- 2 files changed, 77 insertions(+), 5 deletions(-) diff --git a/lib/api/triggers.rb b/lib/api/triggers.rb index 38cf1e9a2e0..0e548b936cd 100644 --- a/lib/api/triggers.rb +++ b/lib/api/triggers.rb @@ -62,6 +62,32 @@ module API present triggers, with: Entities::Trigger end + # Get specific trigger of a project + # + # Parameters: + # id (required) - The ID of a project + # trigger_id (required) - The ID or `token` of a trigger to show; if trigger_id contains only digits it's + # treated as ID other ways it's reated as `key` + # Example Request: + # GET /projects/:id/triggers/:trigger_id + get ':id/triggers/:trigger_id' do + authenticate! + authorize_admin_project + + trigger_id = params[:trigger_id] + triggers = user_project.triggers + triggers = + if trigger_id.match(/^\d+$/) + triggers.where(id: trigger_id.to_i) + else + triggers.where(token: trigger_id) + end + + return not_found!('Trigger') if triggers.empty? + + present triggers.first, with: Entities::Trigger + end + # Create trigger # # Parameters: diff --git a/spec/requests/api/triggers_spec.rb b/spec/requests/api/triggers_spec.rb index 316c2ae958d..c1c2bb04b29 100644 --- a/spec/requests/api/triggers_spec.rb +++ b/spec/requests/api/triggers_spec.rb @@ -5,8 +5,8 @@ describe API::API do let(:user) { create(:user) } let(:user2) { create(:user) } - let!(:trigger_token) { 'secure token' } - let!(:trigger_token_2) { 'secure token 2' } + let!(:trigger_token) { 'secure_token' } + let!(:trigger_token_2) { 'secure_token_2' } let!(:project) { create(:project, creator_id: user.id) } let!(:master) { create(:project_member, user: user, project: project, access_level: ProjectMember::MASTER) } let!(:developer) { create(:project_member, user: user2, project: project, access_level: ProjectMember::DEVELOPER) } @@ -86,7 +86,7 @@ describe API::API do end end - describe 'GET /projects/:id/triggets' do + describe 'GET /projects/:id/triggers' do context 'authenticated user with valid permissions' do it 'should return list of triggers' do get api("/projects/#{project.id}/triggers", user) @@ -115,7 +115,53 @@ describe API::API do end end - describe 'POST /projects/:id/triggets' do + describe 'GET /projects/:id/triggers/:triggers_id' do + context 'authenticated user with valid permissions' do + context 'ID is used as :trigger_id' do + it 'should return trigger details' do + get api("/projects/#{project.id}/triggers/#{trigger.id}", user) + + expect(response.status).to eq(200) + expect(json_response).to be_a(Hash) + expect(json_response['token']).to eq(trigger_token) + end + end + + context '`token` is used as :trigger_id' do + it 'should return trigger details' do + get api("/projects/#{project.id}/triggers/#{trigger.token}", user) + + expect(response.status).to eq(200) + expect(json_response).to be_a(Hash) + expect(json_response['id']).to eq(trigger.id) + end + end + + it 'should responde with 404 Not Found if requesting non-existing trigger' do + get api("/projects/#{project.id}/triggers/9999", user) + + expect(response.status).to eq(404) + end + end + + context 'authenticated user with invalid permissions' do + it 'should not return triggers list' do + get api("/projects/#{project.id}/triggers/#{trigger.id}", user2) + + expect(response.status).to eq(403) + end + end + + context 'unauthentikated user' do + it 'should not return triggers list' do + get api("/projects/#{project.id}/triggers/#{trigger.id}") + + expect(response.status).to eq(401) + end + end + end + + describe 'POST /projects/:id/triggers' do context 'authenticated user with valid permissions' do it 'should create trigger' do expect do @@ -144,7 +190,7 @@ describe API::API do end end - describe 'DELETE /projects/:id/triggets/:trigger_id' do + describe 'DELETE /projects/:id/triggers/:trigger_id' do context 'authenticated user with valid permissions' do it 'should delete trigger' do expect do -- cgit v1.2.1 From b0a77a224857ed45afaf642b26ce3ba87d9828a7 Mon Sep 17 00:00:00 2001 From: Tomasz Maczukin Date: Thu, 7 Jan 2016 11:04:25 +0100 Subject: Update ./doc/api --- doc/api/README.md | 1 + doc/api/triggers.md | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 doc/api/triggers.md diff --git a/doc/api/README.md b/doc/api/README.md index 25a31b235cc..1838bcc0bb9 100644 --- a/doc/api/README.md +++ b/doc/api/README.md @@ -23,6 +23,7 @@ - [Namespaces](namespaces.md) - [Settings](settings.md) - [Keys](keys.md) +- [Triggers](triggers.md) ## Clients diff --git a/doc/api/triggers.md b/doc/api/triggers.md new file mode 100644 index 00000000000..6adcc8fe3b8 --- /dev/null +++ b/doc/api/triggers.md @@ -0,0 +1,94 @@ +# Triggers + +## List project triggers + +Get a list of project triggers + +``` +GET /projects/:id/triggers +``` + +Parameters: + +- `id` (required) - The ID of a project + +```json +[ + { + "created_at": "2015-12-23T16:24:34.716Z", + "deleted_at": null, + "id": 1, + "last_used": "2016-01-04T15:41:21.986Z", + "token": "fbdb730c2fbdb095a0862dbd8ab88b", + "updated_at": "2015-12-23T16:24:34.716Z" + }, + { + "created_at": "2015-12-23T16:25:56.760Z", + "deleted_at": null, + "id": 2, + "last_used": null, + "token": "7b9148c158980bbd9bcea92c17522d", + "updated_at": "2015-12-23T16:25:56.760Z" + } +] +``` + +## Get trigger details + +Get details of trigger of a project + +``` +GET /projects/:id/triggers/:trigger_id +``` + +Parameters: + +- `id` (required) - The ID of a project +- `trigger_id` (required) - The ID of a trigger + +```json +{ + "created_at": "2015-12-23T16:25:56.760Z", + "deleted_at": null, + "id": 2, + "last_used": null, + "token": "7b9148c158980bbd9bcea92c17522d", + "updated_at": "2015-12-23T16:25:56.760Z" +} +``` + +## Create a project trigger + +Create a trigger for a project + +``` +POST /projects/:id/triggers +``` + +Parameters: + +- `id` (required) - The ID of a project + +```json +{ + "created_at": "2016-01-07T09:53:58.235Z", + "deleted_at": null, + "id": 5, + "last_used": null, + "token": "6d056f63e50fe6f8c5f8f4aa10edb7", + "updated_at": "2016-01-07T09:53:58.235Z" +} +``` + +## Remove a project trigger + +Remove a trigger of a project + +``` +DELETE /projects/:id/triggers/:trigger_id +``` + +Parameters: + +- `id` (required) - The ID of a project +- `trigger_id` (required) - The ID of a trigger -- cgit v1.2.1 From e0ec69d919cb44194e76034f2324ec0d4f5f1df6 Mon Sep 17 00:00:00 2001 From: Tomasz Maczukin Date: Thu, 7 Jan 2016 18:48:33 +0100 Subject: Change 'trigger_id' to 'token' as resource ID in triggers API --- doc/api/triggers.md | 12 ++++------- lib/api/entities.rb | 2 +- lib/api/triggers.rb | 25 ++++++++--------------- spec/requests/api/triggers_spec.rb | 42 +++++++++++++------------------------- 4 files changed, 27 insertions(+), 54 deletions(-) diff --git a/doc/api/triggers.md b/doc/api/triggers.md index 6adcc8fe3b8..4150d7b4c10 100644 --- a/doc/api/triggers.md +++ b/doc/api/triggers.md @@ -17,7 +17,6 @@ Parameters: { "created_at": "2015-12-23T16:24:34.716Z", "deleted_at": null, - "id": 1, "last_used": "2016-01-04T15:41:21.986Z", "token": "fbdb730c2fbdb095a0862dbd8ab88b", "updated_at": "2015-12-23T16:24:34.716Z" @@ -25,7 +24,6 @@ Parameters: { "created_at": "2015-12-23T16:25:56.760Z", "deleted_at": null, - "id": 2, "last_used": null, "token": "7b9148c158980bbd9bcea92c17522d", "updated_at": "2015-12-23T16:25:56.760Z" @@ -38,19 +36,18 @@ Parameters: Get details of trigger of a project ``` -GET /projects/:id/triggers/:trigger_id +GET /projects/:id/triggers/:token ``` Parameters: - `id` (required) - The ID of a project -- `trigger_id` (required) - The ID of a trigger +- `token` (required) - The `token` of a trigger ```json { "created_at": "2015-12-23T16:25:56.760Z", "deleted_at": null, - "id": 2, "last_used": null, "token": "7b9148c158980bbd9bcea92c17522d", "updated_at": "2015-12-23T16:25:56.760Z" @@ -73,7 +70,6 @@ Parameters: { "created_at": "2016-01-07T09:53:58.235Z", "deleted_at": null, - "id": 5, "last_used": null, "token": "6d056f63e50fe6f8c5f8f4aa10edb7", "updated_at": "2016-01-07T09:53:58.235Z" @@ -85,10 +81,10 @@ Parameters: Remove a trigger of a project ``` -DELETE /projects/:id/triggers/:trigger_id +DELETE /projects/:id/triggers/:token ``` Parameters: - `id` (required) - The ID of a project -- `trigger_id` (required) - The ID of a trigger +- `token` (required) - The `token` of a trigger diff --git a/lib/api/entities.rb b/lib/api/entities.rb index bc0cd76a2b8..37c483b45ec 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -367,7 +367,7 @@ module API end class Trigger < Grape::Entity - expose :id, :token, :created_at, :updated_at, :deleted_at + expose :token, :created_at, :updated_at, :deleted_at expose :last_used do |repo_obj, _options| if repo_obj.respond_to?(:last_trigger_request) request = repo_obj.last_trigger_request diff --git a/lib/api/triggers.rb b/lib/api/triggers.rb index 0e548b936cd..25bb8aef20b 100644 --- a/lib/api/triggers.rb +++ b/lib/api/triggers.rb @@ -66,23 +66,14 @@ module API # # Parameters: # id (required) - The ID of a project - # trigger_id (required) - The ID or `token` of a trigger to show; if trigger_id contains only digits it's - # treated as ID other ways it's reated as `key` + # token (required) - The `token` of a trigger # Example Request: - # GET /projects/:id/triggers/:trigger_id - get ':id/triggers/:trigger_id' do + # GET /projects/:id/triggers/:token + get ':id/triggers/:token' do authenticate! authorize_admin_project - trigger_id = params[:trigger_id] - triggers = user_project.triggers - triggers = - if trigger_id.match(/^\d+$/) - triggers.where(id: trigger_id.to_i) - else - triggers.where(token: trigger_id) - end - + triggers = user_project.triggers.where(token: params[:token]) return not_found!('Trigger') if triggers.empty? present triggers.first, with: Entities::Trigger @@ -108,14 +99,14 @@ module API # # Parameters: # id (required) - The ID of a project - # trigger_id - The ID of trigger to delete + # token (required) - The `token` of a trigger # Example Request: - # DELETE /projects/:id/triggers/:trigger_id - delete ':id/triggers/:trigger_id' do + # DELETE /projects/:id/triggers/:token + delete ':id/triggers/:token' do authenticate! authorize_admin_project - trigger = user_project.triggers.where(id: params[:trigger_id].to_i).first + trigger = user_project.triggers.where(token: params[:token]).first return not_found!('Trigger') unless trigger trigger.destroy diff --git a/spec/requests/api/triggers_spec.rb b/spec/requests/api/triggers_spec.rb index c1c2bb04b29..e8d89426ec0 100644 --- a/spec/requests/api/triggers_spec.rb +++ b/spec/requests/api/triggers_spec.rb @@ -93,8 +93,7 @@ describe API::API do expect(response.status).to eq(200) expect(json_response).to be_a(Array) - expect(json_response[0]['token']).to eq(trigger_token) - expect(json_response[1]['token']).to eq(trigger_token_2) + expect(json_response[0]).to have_key('token') end end @@ -115,30 +114,17 @@ describe API::API do end end - describe 'GET /projects/:id/triggers/:triggers_id' do + describe 'GET /projects/:id/triggers/:token' do context 'authenticated user with valid permissions' do - context 'ID is used as :trigger_id' do - it 'should return trigger details' do - get api("/projects/#{project.id}/triggers/#{trigger.id}", user) + it 'should return trigger details' do + get api("/projects/#{project.id}/triggers/#{trigger.token}", user) - expect(response.status).to eq(200) - expect(json_response).to be_a(Hash) - expect(json_response['token']).to eq(trigger_token) - end - end - - context '`token` is used as :trigger_id' do - it 'should return trigger details' do - get api("/projects/#{project.id}/triggers/#{trigger.token}", user) - - expect(response.status).to eq(200) - expect(json_response).to be_a(Hash) - expect(json_response['id']).to eq(trigger.id) - end + expect(response.status).to eq(200) + expect(json_response).to be_a(Hash) end it 'should responde with 404 Not Found if requesting non-existing trigger' do - get api("/projects/#{project.id}/triggers/9999", user) + get api("/projects/#{project.id}/triggers/abcdef012345", user) expect(response.status).to eq(404) end @@ -146,7 +132,7 @@ describe API::API do context 'authenticated user with invalid permissions' do it 'should not return triggers list' do - get api("/projects/#{project.id}/triggers/#{trigger.id}", user2) + get api("/projects/#{project.id}/triggers/#{trigger.token}", user2) expect(response.status).to eq(403) end @@ -154,7 +140,7 @@ describe API::API do context 'unauthentikated user' do it 'should not return triggers list' do - get api("/projects/#{project.id}/triggers/#{trigger.id}") + get api("/projects/#{project.id}/triggers/#{trigger.token}") expect(response.status).to eq(401) end @@ -190,17 +176,17 @@ describe API::API do end end - describe 'DELETE /projects/:id/triggers/:trigger_id' do + describe 'DELETE /projects/:id/triggers/:token' do context 'authenticated user with valid permissions' do it 'should delete trigger' do expect do - delete api("/projects/#{project.id}/triggers/#{trigger.id}", user) + delete api("/projects/#{project.id}/triggers/#{trigger.token}", user) end.to change{project.triggers.count}.by(-1) expect(response.status).to eq(200) end it 'should responde with 404 Not Found if requesting non-existing trigger' do - delete api("/projects/#{project.id}/triggers/9999", user) + delete api("/projects/#{project.id}/triggers/abcdef012345", user) expect(response.status).to eq(404) end @@ -208,7 +194,7 @@ describe API::API do context 'authenticated user with invalid permissions' do it 'should not delete trigger' do - delete api("/projects/#{project.id}/triggers/#{trigger.id}", user2) + delete api("/projects/#{project.id}/triggers/#{trigger.token}", user2) expect(response.status).to eq(403) end @@ -216,7 +202,7 @@ describe API::API do context 'unauthentikated user' do it 'should not delete trigger' do - delete api("/projects/#{project.id}/triggers/#{trigger.id}") + delete api("/projects/#{project.id}/triggers/#{trigger.token}") expect(response.status).to eq(401) end -- cgit v1.2.1 From d44653da1f74c2c15fe7ec3f8aa9b16563ffebd6 Mon Sep 17 00:00:00 2001 From: Tomasz Maczukin Date: Wed, 13 Jan 2016 12:16:27 +0100 Subject: Add some fixes after review --- app/models/ci/trigger.rb | 4 ++++ lib/api/entities.rb | 8 +------- lib/api/triggers.rb | 11 +++++------ spec/requests/api/triggers_spec.rb | 12 ++++++------ 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/app/models/ci/trigger.rb b/app/models/ci/trigger.rb index 23516709a41..3328459c4c5 100644 --- a/app/models/ci/trigger.rb +++ b/app/models/ci/trigger.rb @@ -32,6 +32,10 @@ module Ci trigger_requests.last end + def last_used + last_trigger_request.try(:created_at) + end + def short_token token[0...10] end diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 37c483b45ec..1108277aabf 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -367,13 +367,7 @@ module API end class Trigger < Grape::Entity - expose :token, :created_at, :updated_at, :deleted_at - expose :last_used do |repo_obj, _options| - if repo_obj.respond_to?(:last_trigger_request) - request = repo_obj.last_trigger_request - request.created_at if request - end - end + expose :token, :created_at, :updated_at, :deleted_at, :last_used end end end diff --git a/lib/api/triggers.rb b/lib/api/triggers.rb index 25bb8aef20b..5e4964f446c 100644 --- a/lib/api/triggers.rb +++ b/lib/api/triggers.rb @@ -73,10 +73,10 @@ module API authenticate! authorize_admin_project - triggers = user_project.triggers.where(token: params[:token]) - return not_found!('Trigger') if triggers.empty? + trigger = user_project.triggers.find_by(token: params[:token].to_s) + return not_found!('Trigger') unless trigger - present triggers.first, with: Entities::Trigger + present trigger, with: Entities::Trigger end # Create trigger @@ -89,8 +89,7 @@ module API authenticate! authorize_admin_project - trigger = user_project.triggers.new - trigger.save + trigger = user_project.triggers.create present trigger, with: Entities::Trigger end @@ -106,7 +105,7 @@ module API authenticate! authorize_admin_project - trigger = user_project.triggers.where(token: params[:token]).first + trigger = user_project.triggers.find_by(token: params[:token].to_s) return not_found!('Trigger') unless trigger trigger.destroy diff --git a/spec/requests/api/triggers_spec.rb b/spec/requests/api/triggers_spec.rb index e8d89426ec0..2a86b60bc4d 100644 --- a/spec/requests/api/triggers_spec.rb +++ b/spec/requests/api/triggers_spec.rb @@ -105,7 +105,7 @@ describe API::API do end end - context 'unauthentikated user' do + context 'unauthenticated user' do it 'should not return triggers list' do get api("/projects/#{project.id}/triggers") @@ -123,7 +123,7 @@ describe API::API do expect(json_response).to be_a(Hash) end - it 'should responde with 404 Not Found if requesting non-existing trigger' do + it 'should respond with 404 Not Found if requesting non-existing trigger' do get api("/projects/#{project.id}/triggers/abcdef012345", user) expect(response.status).to eq(404) @@ -138,7 +138,7 @@ describe API::API do end end - context 'unauthentikated user' do + context 'unauthenticated user' do it 'should not return triggers list' do get api("/projects/#{project.id}/triggers/#{trigger.token}") @@ -167,7 +167,7 @@ describe API::API do end end - context 'unauthentikated user' do + context 'unauthenticated user' do it 'should not create trigger' do post api("/projects/#{project.id}/triggers") @@ -185,7 +185,7 @@ describe API::API do expect(response.status).to eq(200) end - it 'should responde with 404 Not Found if requesting non-existing trigger' do + it 'should respond with 404 Not Found if requesting non-existing trigger' do delete api("/projects/#{project.id}/triggers/abcdef012345", user) expect(response.status).to eq(404) @@ -200,7 +200,7 @@ describe API::API do end end - context 'unauthentikated user' do + context 'unauthenticated user' do it 'should not delete trigger' do delete api("/projects/#{project.id}/triggers/#{trigger.token}") -- cgit v1.2.1 From 633ac13404a38bfa3901f515179dc795cded2fa9 Mon Sep 17 00:00:00 2001 From: Tomasz Maczukin Date: Wed, 13 Jan 2016 20:46:34 +0100 Subject: Modify triggers API documentation style [ci skip] --- doc/api/README.md | 2 +- doc/api/build_triggers.md | 128 ++++++++++++++++++++++++++++++++++++++++++++++ doc/api/triggers.md | 90 -------------------------------- 3 files changed, 129 insertions(+), 91 deletions(-) create mode 100644 doc/api/build_triggers.md delete mode 100644 doc/api/triggers.md diff --git a/doc/api/README.md b/doc/api/README.md index 1838bcc0bb9..4dc5c931f52 100644 --- a/doc/api/README.md +++ b/doc/api/README.md @@ -23,7 +23,7 @@ - [Namespaces](namespaces.md) - [Settings](settings.md) - [Keys](keys.md) -- [Triggers](triggers.md) +- [Build triggers](build_triggers.md) ## Clients diff --git a/doc/api/build_triggers.md b/doc/api/build_triggers.md new file mode 100644 index 00000000000..14f7e3534bd --- /dev/null +++ b/doc/api/build_triggers.md @@ -0,0 +1,128 @@ +# Build triggers + +## List project triggers + +Get a list of project triggers + +``` +GET /projects/:id/triggers +``` + +### Parameters + +| Attribute | Type | required | Description | +|-----------|---------|----------|---------------------| +| id | integer | yes | The ID of a project | + +### Example of request + +``` +curl -H "PRIVATE_TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/1/triggers" +``` + +### Example of response + +```json +[ + { + "created_at": "2015-12-23T16:24:34.716Z", + "deleted_at": null, + "last_used": "2016-01-04T15:41:21.986Z", + "token": "fbdb730c2fbdb095a0862dbd8ab88b", + "updated_at": "2015-12-23T16:24:34.716Z" + }, + { + "created_at": "2015-12-23T16:25:56.760Z", + "deleted_at": null, + "last_used": null, + "token": "7b9148c158980bbd9bcea92c17522d", + "updated_at": "2015-12-23T16:25:56.760Z" + } +] +``` + +## Get trigger details + +Get details of trigger of a project + +``` +GET /projects/:id/triggers/:token +``` + +### Parameters + +| Attribute | Type | required | Description | +|-----------|---------|----------|--------------------------| +| id | integer | yes | The ID of a project | +| token | string | yes | The `token` of a project | + +### Example of request + +``` +curl -H "PRIVATE_TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/1/triggers/7b9148c158980bbd9bcea92c17522d" +``` + +### Example of response + +```json +{ + "created_at": "2015-12-23T16:25:56.760Z", + "deleted_at": null, + "last_used": null, + "token": "7b9148c158980bbd9bcea92c17522d", + "updated_at": "2015-12-23T16:25:56.760Z" +} +``` + +## Create a project trigger + +Create a trigger for a project + +``` +POST /projects/:id/triggers +``` + +### Parameters + +| Attribute | Type | required | Description | +|-----------|---------|----------|--------------------------| +| id | integer | yes | The ID of a project | + +### Example of request + +``` +curl -X POST -H "PRIVATE_TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/1/triggers" +``` + +### Example of response + +```json +{ + "created_at": "2016-01-07T09:53:58.235Z", + "deleted_at": null, + "last_used": null, + "token": "6d056f63e50fe6f8c5f8f4aa10edb7", + "updated_at": "2016-01-07T09:53:58.235Z" +} +``` + +## Remove a project trigger + +Remove a trigger of a project + +``` +DELETE /projects/:id/triggers/:token +``` + +### Parameters + +| Attribute | Type | required | Description | +|-----------|---------|----------|--------------------------| +| id | integer | yes | The ID of a project | +| token | string | yes | The `token` of a project | + +### Example of request + +``` +curl -X DELETE -H "PRIVATE_TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/1/triggers/7b9148c158980bbd9bcea92c17522d" +``` diff --git a/doc/api/triggers.md b/doc/api/triggers.md deleted file mode 100644 index 4150d7b4c10..00000000000 --- a/doc/api/triggers.md +++ /dev/null @@ -1,90 +0,0 @@ -# Triggers - -## List project triggers - -Get a list of project triggers - -``` -GET /projects/:id/triggers -``` - -Parameters: - -- `id` (required) - The ID of a project - -```json -[ - { - "created_at": "2015-12-23T16:24:34.716Z", - "deleted_at": null, - "last_used": "2016-01-04T15:41:21.986Z", - "token": "fbdb730c2fbdb095a0862dbd8ab88b", - "updated_at": "2015-12-23T16:24:34.716Z" - }, - { - "created_at": "2015-12-23T16:25:56.760Z", - "deleted_at": null, - "last_used": null, - "token": "7b9148c158980bbd9bcea92c17522d", - "updated_at": "2015-12-23T16:25:56.760Z" - } -] -``` - -## Get trigger details - -Get details of trigger of a project - -``` -GET /projects/:id/triggers/:token -``` - -Parameters: - -- `id` (required) - The ID of a project -- `token` (required) - The `token` of a trigger - -```json -{ - "created_at": "2015-12-23T16:25:56.760Z", - "deleted_at": null, - "last_used": null, - "token": "7b9148c158980bbd9bcea92c17522d", - "updated_at": "2015-12-23T16:25:56.760Z" -} -``` - -## Create a project trigger - -Create a trigger for a project - -``` -POST /projects/:id/triggers -``` - -Parameters: - -- `id` (required) - The ID of a project - -```json -{ - "created_at": "2016-01-07T09:53:58.235Z", - "deleted_at": null, - "last_used": null, - "token": "6d056f63e50fe6f8c5f8f4aa10edb7", - "updated_at": "2016-01-07T09:53:58.235Z" -} -``` - -## Remove a project trigger - -Remove a trigger of a project - -``` -DELETE /projects/:id/triggers/:token -``` - -Parameters: - -- `id` (required) - The ID of a project -- `token` (required) - The `token` of a trigger -- cgit v1.2.1 From d8359a4f6ec7b4d2927c5878360314024c4e0761 Mon Sep 17 00:00:00 2001 From: Tomasz Maczukin Date: Thu, 14 Jan 2016 11:00:08 +0100 Subject: Update CHANGELOG [ci skip] --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index b430d4981a9..593d3e1c0cd 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -43,6 +43,7 @@ v 8.4.0 (unreleased) - API: Add support for deleting a tag via the API (Robert Schilling) - Allow subsequent validations in CI Linter - Fix Encoding::CompatibilityError bug when markdown content has some complex URL (Jason Lee) + - Add API support for managing project's build triggers v 8.3.4 - Use gitlab-workhorse 0.5.4 (fixes API routing bug) -- cgit v1.2.1 From c5b429f099d8b6b71225a96f111d65c97f15d2a8 Mon Sep 17 00:00:00 2001 From: Tomasz Maczukin Date: Thu, 14 Jan 2016 11:08:33 +0100 Subject: Add mofications to triggers API documentation [ci skip] --- doc/api/build_triggers.md | 44 ++++++++++++-------------------------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/doc/api/build_triggers.md b/doc/api/build_triggers.md index 14f7e3534bd..4a12e962b62 100644 --- a/doc/api/build_triggers.md +++ b/doc/api/build_triggers.md @@ -1,27 +1,23 @@ # Build triggers +You can read more about [triggering builds through the API](../ci/triggers/README.md). + ## List project triggers -Get a list of project triggers +Get a list of project's build triggers. ``` GET /projects/:id/triggers ``` -### Parameters - | Attribute | Type | required | Description | |-----------|---------|----------|---------------------| -| id | integer | yes | The ID of a project | - -### Example of request +| `id` | integer | yes | The ID of a project | ``` curl -H "PRIVATE_TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/1/triggers" ``` -### Example of response - ```json [ { @@ -43,27 +39,21 @@ curl -H "PRIVATE_TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3 ## Get trigger details -Get details of trigger of a project +Get details of project's build trigger. ``` GET /projects/:id/triggers/:token ``` -### Parameters - | Attribute | Type | required | Description | |-----------|---------|----------|--------------------------| -| id | integer | yes | The ID of a project | -| token | string | yes | The `token` of a project | - -### Example of request +| `id` | integer | yes | The ID of a project | +| `token` | string | yes | The `token` of a trigger | ``` curl -H "PRIVATE_TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/1/triggers/7b9148c158980bbd9bcea92c17522d" ``` -### Example of response - ```json { "created_at": "2015-12-23T16:25:56.760Z", @@ -76,26 +66,20 @@ curl -H "PRIVATE_TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3 ## Create a project trigger -Create a trigger for a project +Create a build trigger for a project. ``` POST /projects/:id/triggers ``` -### Parameters - | Attribute | Type | required | Description | |-----------|---------|----------|--------------------------| -| id | integer | yes | The ID of a project | - -### Example of request +| `id` | integer | yes | The ID of a project | ``` curl -X POST -H "PRIVATE_TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/1/triggers" ``` -### Example of response - ```json { "created_at": "2016-01-07T09:53:58.235Z", @@ -108,20 +92,16 @@ curl -X POST -H "PRIVATE_TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.co ## Remove a project trigger -Remove a trigger of a project +Remove a project's build trigger. ``` DELETE /projects/:id/triggers/:token ``` -### Parameters - | Attribute | Type | required | Description | |-----------|---------|----------|--------------------------| -| id | integer | yes | The ID of a project | -| token | string | yes | The `token` of a project | - -### Example of request +| `id` | integer | yes | The ID of a project | +| `token` | string | yes | The `token` of a project | ``` curl -X DELETE -H "PRIVATE_TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/1/triggers/7b9148c158980bbd9bcea92c17522d" -- cgit v1.2.1 From 41eedd45716cbb68fa8c6eaeb110ce2b1f612919 Mon Sep 17 00:00:00 2001 From: Tomasz Maczukin Date: Thu, 14 Jan 2016 12:25:29 +0100 Subject: Fix version --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 408340137f0..ce669730119 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -8.4.0.rc1 \ No newline at end of file +8.4.0.pre -- cgit v1.2.1 From 7ed5bc5c9b69e6caf45541dc8f820aa59a20c160 Mon Sep 17 00:00:00 2001 From: Tomasz Maczukin Date: Thu, 14 Jan 2016 13:10:35 +0100 Subject: Modify entry in CHANGELOG --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 8ead15d70ab..2e0e26b4026 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -46,7 +46,7 @@ v 8.4.0 (unreleased) - Show referenced MRs & Issues only when the current viewer can access them - Fix Encoding::CompatibilityError bug when markdown content has some complex URL (Jason Lee) - Add API support for managing project's build triggers - - Add API support for managing build variables of project + - Add API support for managing project's build variables - Allow broadcast messages to be edited v 8.3.4 -- cgit v1.2.1 From 96aeaeafb561990c554c8e0544b29a83240f45d2 Mon Sep 17 00:00:00 2001 From: Tomasz Maczukin Date: Thu, 14 Jan 2016 21:59:30 +0100 Subject: Update CHANGELOG --- CHANGELOG | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 3dd3fcf3b87..7bbc0fc79f0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -50,10 +50,9 @@ v 8.4.0 (unreleased) - Allow subsequent validations in CI Linter - Show referenced MRs & Issues only when the current viewer can access them - Fix Encoding::CompatibilityError bug when markdown content has some complex URL (Jason Lee) + - Add API support for managing project's builds - Add API support for managing project's build triggers - Add API support for managing project's build variables - - Add API support for managing builds of a project - - Add API support for managing build variables of project - Allow broadcast messages to be edited - Autosize Markdown textareas - Import GitHub wiki into GitLab -- cgit v1.2.1