Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
GitLab
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
projects.thm.de
GitLab
Commits
c280acb0
Commit
c280acb0
authored
Feb 20, 2017
by
Robert Schilling
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Backport API to V3
parent
f2dd2604
Changes
36
Hide whitespace changes
Inline
Side-by-side
Showing
36 changed files
with
1485 additions
and
28 deletions
+1485
-28
lib/api/api.rb
lib/api/api.rb
+8
-1
lib/api/v3/award_emoji.rb
lib/api/v3/award_emoji.rb
+59
-0
lib/api/v3/boards.rb
lib/api/v3/boards.rb
+21
-0
lib/api/v3/branches.rb
lib/api/v3/branches.rb
+20
-0
lib/api/v3/broadcast_messages.rb
lib/api/v3/broadcast_messages.rb
+31
-0
lib/api/v3/environments.rb
lib/api/v3/environments.rb
+29
-0
lib/api/v3/issues.rb
lib/api/v3/issues.rb
+2
-0
lib/api/v3/labels.rb
lib/api/v3/labels.rb
+15
-0
lib/api/v3/members.rb
lib/api/v3/members.rb
+1
-0
lib/api/v3/merge_requests.rb
lib/api/v3/merge_requests.rb
+2
-0
lib/api/v3/project_snippets.rb
lib/api/v3/project_snippets.rb
+2
-0
lib/api/v3/projects.rb
lib/api/v3/projects.rb
+3
-0
lib/api/v3/runners.rb
lib/api/v3/runners.rb
+65
-0
lib/api/v3/services.rb
lib/api/v3/services.rb
+573
-0
lib/api/v3/system_hooks.rb
lib/api/v3/system_hooks.rb
+13
-0
lib/api/v3/tags.rb
lib/api/v3/tags.rb
+20
-0
lib/api/v3/todos.rb
lib/api/v3/todos.rb
+2
-0
lib/api/v3/triggers.rb
lib/api/v3/triggers.rb
+30
-0
lib/api/v3/users.rb
lib/api/v3/users.rb
+32
-0
lib/api/v3/variables.rb
lib/api/v3/variables.rb
+29
-0
lib/api/variables.rb
lib/api/variables.rb
+1
-2
spec/requests/api/project_snippets_spec.rb
spec/requests/api/project_snippets_spec.rb
+1
-1
spec/requests/api/v3/award_emoji_spec.rb
spec/requests/api/v3/award_emoji_spec.rb
+74
-0
spec/requests/api/v3/boards_spec.rb
spec/requests/api/v3/boards_spec.rb
+34
-0
spec/requests/api/v3/branches_spec.rb
spec/requests/api/v3/branches_spec.rb
+43
-4
spec/requests/api/v3/broadcast_messages_spec.rb
spec/requests/api/v3/broadcast_messages_spec.rb
+34
-0
spec/requests/api/v3/environments_spec.rb
spec/requests/api/v3/environments_spec.rb
+39
-0
spec/requests/api/v3/files_spec.rb
spec/requests/api/v3/files_spec.rb
+12
-11
spec/requests/api/v3/labels_spec.rb
spec/requests/api/v3/labels_spec.rb
+19
-0
spec/requests/api/v3/members_spec.rb
spec/requests/api/v3/members_spec.rb
+1
-1
spec/requests/api/v3/notes_spec.rb
spec/requests/api/v3/notes_spec.rb
+9
-8
spec/requests/api/v3/runners_spec.rb
spec/requests/api/v3/runners_spec.rb
+154
-0
spec/requests/api/v3/services_spec.rb
spec/requests/api/v3/services_spec.rb
+22
-0
spec/requests/api/v3/system_hooks_spec.rb
spec/requests/api/v3/system_hooks_spec.rb
+16
-0
spec/requests/api/v3/tags_spec.rb
spec/requests/api/v3/tags_spec.rb
+22
-0
spec/requests/api/v3/triggers_spec.rb
spec/requests/api/v3/triggers_spec.rb
+47
-0
No files found.
lib/api/api.rb
View file @
c280acb0
...
...
@@ -5,10 +5,13 @@ class API < Grape::API
version
%w(v3 v4)
,
using: :path
version
'v3'
,
using: :path
do
mount
::
API
::
V3
::
AwardEmoji
mount
::
API
::
V3
::
Boards
mount
::
API
::
V3
::
Branches
mount
::
API
::
V3
::
BroadcastMessages
mount
::
API
::
V3
::
Commits
mount
::
API
::
V3
::
DeployKeys
mount
::
API
::
V3
::
Environments
mount
::
API
::
V3
::
Files
mount
::
API
::
V3
::
Groups
mount
::
API
::
V3
::
Issues
...
...
@@ -21,12 +24,16 @@ class API < Grape::API
mount
::
API
::
V3
::
Projects
mount
::
API
::
V3
::
ProjectSnippets
mount
::
API
::
V3
::
Repositories
mount
::
API
::
V3
::
Runners
mount
::
API
::
V3
::
Services
mount
::
API
::
V3
::
Subscriptions
mount
::
API
::
V3
::
SystemHooks
mount
::
API
::
V3
::
Tags
mount
::
API
::
V3
::
Todos
mount
::
API
::
V3
::
Templates
mount
::
API
::
V3
::
Todos
mount
::
API
::
V3
::
Triggers
mount
::
API
::
V3
::
Users
mount
::
API
::
V3
::
Variables
end
before
{
allow_access_with_scope
:api
}
...
...
lib/api/v3/award_emoji.rb
0 → 100644
View file @
c280acb0
module
API
module
V3
class
AwardEmoji
<
Grape
::
API
include
PaginationParams
before
{
authenticate!
}
AWARDABLES
=
%w[issue merge_request snippet]
.
freeze
resource
:projects
do
AWARDABLES
.
each
do
|
awardable_type
|
awardable_string
=
awardable_type
.
pluralize
awardable_id_string
=
"
#{
awardable_type
}
_id"
params
do
requires
:id
,
type:
String
,
desc:
'The ID of a project'
requires
:"
#{
awardable_id_string
}
"
,
type:
Integer
,
desc:
"The ID of an Issue, Merge Request or Snippet"
end
[
":id/
#{
awardable_string
}
/:
#{
awardable_id_string
}
/award_emoji"
,
":id/
#{
awardable_string
}
/:
#{
awardable_id_string
}
/notes/:note_id/award_emoji"
].
each
do
|
endpoint
|
desc
'Delete a +awardables+ award emoji'
do
detail
'This feature was introduced in 8.9'
success
::
API
::
Entities
::
AwardEmoji
end
params
do
requires
:award_id
,
type:
Integer
,
desc:
'The ID of an award emoji'
end
delete
"
#{
endpoint
}
/:award_id"
do
award
=
awardable
.
award_emoji
.
find
(
params
[
:award_id
])
unauthorized!
unless
award
.
user
==
current_user
||
current_user
.
admin?
present
award
.
destroy
,
with:
::
API
::
Entities
::
AwardEmoji
end
end
end
end
helpers
do
def
awardable
@awardable
||=
begin
if
params
.
include?
(
:note_id
)
note_id
=
params
.
delete
(
:note_id
)
awardable
.
notes
.
find
(
note_id
)
elsif
params
.
include?
(
:issue_id
)
user_project
.
issues
.
find
(
params
[
:issue_id
])
elsif
params
.
include?
(
:merge_request_id
)
user_project
.
merge_requests
.
find
(
params
[
:merge_request_id
])
else
user_project
.
snippets
.
find
(
params
[
:snippet_id
])
end
end
end
end
end
end
end
lib/api/v3/boards.rb
View file @
c280acb0
...
...
@@ -44,6 +44,27 @@ def board_lists
authorize!
(
:read_board
,
user_project
)
present
board_lists
,
with:
::
API
::
Entities
::
List
end
desc
'Delete a board list'
do
detail
'This feature was introduced in 8.13'
success
::
API
::
Entities
::
List
end
params
do
requires
:list_id
,
type:
Integer
,
desc:
'The ID of a board list'
end
delete
"/lists/:list_id"
do
authorize!
(
:admin_list
,
user_project
)
list
=
board_lists
.
find
(
params
[
:list_id
])
service
=
::
Boards
::
Lists
::
DestroyService
.
new
(
user_project
,
current_user
)
if
service
.
execute
(
list
)
present
list
,
with:
::
API
::
Entities
::
List
else
render_api_error!
({
error:
'List could not be deleted!'
},
400
)
end
end
end
end
end
...
...
lib/api/v3/branches.rb
View file @
c280acb0
...
...
@@ -19,6 +19,26 @@ class Branches < Grape::API
present
branches
,
with:
::
API
::
Entities
::
RepoBranch
,
project:
user_project
end
desc
'Delete a branch'
params
do
requires
:branch
,
type:
String
,
desc:
'The name of the branch'
end
delete
":id/repository/branches/:branch"
,
requirements:
{
branch:
/.+/
}
do
authorize_push_project
result
=
DeleteBranchService
.
new
(
user_project
,
current_user
).
execute
(
params
[
:branch
])
if
result
[
:status
]
==
:success
status
(
200
)
{
branch_name:
params
[
:branch
]
}
else
render_api_error!
(
result
[
:message
],
result
[
:return_code
])
end
end
desc
'Delete all merged branches'
delete
":id/repository/merged_branches"
do
DeleteMergedBranchesService
.
new
(
user_project
,
current_user
).
async_execute
...
...
lib/api/v3/broadcast_messages.rb
0 → 100644
View file @
c280acb0
module
API
module
V3
class
BroadcastMessages
<
Grape
::
API
include
PaginationParams
before
{
authenticate!
}
before
{
authenticated_as_admin!
}
resource
:broadcast_messages
do
helpers
do
def
find_message
BroadcastMessage
.
find
(
params
[
:id
])
end
end
desc
'Delete a broadcast message'
do
detail
'This feature was introduced in GitLab 8.12.'
success
::
API
::
Entities
::
BroadcastMessage
end
params
do
requires
:id
,
type:
Integer
,
desc:
'Broadcast message ID'
end
delete
':id'
do
message
=
find_message
present
message
.
destroy
,
with:
::
API
::
Entities
::
BroadcastMessage
end
end
end
end
end
lib/api/v3/environments.rb
0 → 100644
View file @
c280acb0
module
API
module
V3
class
Environments
<
Grape
::
API
include
PaginationParams
before
{
authenticate!
}
params
do
requires
:id
,
type:
String
,
desc:
'The project ID'
end
resource
:projects
do
desc
'Deletes an existing environment'
do
detail
'This feature was introduced in GitLab 8.11.'
success
::
API
::
Entities
::
Environment
end
params
do
requires
:environment_id
,
type:
Integer
,
desc:
'The environment ID'
end
delete
':id/environments/:environment_id'
do
authorize!
:update_environment
,
user_project
environment
=
user_project
.
environments
.
find
(
params
[
:environment_id
])
present
environment
.
destroy
,
with:
::
API
::
Entities
::
Environment
end
end
end
end
end
lib/api/v3/issues.rb
View file @
c280acb0
...
...
@@ -226,6 +226,8 @@ def find_issues(args = {})
not_found!
(
'Issue'
)
unless
issue
authorize!
(
:destroy_issue
,
issue
)
status
(
200
)
issue
.
destroy
end
end
...
...
lib/api/v3/labels.rb
View file @
c280acb0
...
...
@@ -13,6 +13,21 @@ class Labels < Grape::API
get
':id/labels'
do
present
available_labels
,
with:
::
API
::
Entities
::
Label
,
current_user:
current_user
,
project:
user_project
end
desc
'Delete an existing label'
do
success
::
API
::
Entities
::
Label
end
params
do
requires
:name
,
type:
String
,
desc:
'The name of the label to be deleted'
end
delete
':id/labels'
do
authorize!
:admin_label
,
user_project
label
=
user_project
.
labels
.
find_by
(
title:
params
[
:name
])
not_found!
(
'Label'
)
unless
label
present
label
.
destroy
,
with:
::
API
::
Entities
::
Label
,
current_user:
current_user
,
project:
user_project
end
end
end
end
...
...
lib/api/v3/members.rb
View file @
c280acb0
...
...
@@ -119,6 +119,7 @@ class Members < Grape::API
# This is to ensure back-compatibility but 204 behavior should be used
# for all DELETE endpoints in 9.0!
if
member
.
nil?
status
(
200
)
{
message:
"Access revoked"
,
id:
params
[
:user_id
].
to_i
}
else
::
Members
::
DestroyService
.
new
(
source
,
current_user
,
declared_params
).
execute
...
...
lib/api/v3/merge_requests.rb
View file @
c280acb0
...
...
@@ -103,6 +103,8 @@ def handle_merge_request_errors!(errors)
merge_request
=
find_project_merge_request
(
params
[
:merge_request_id
])
authorize!
(
:destroy_merge_request
,
merge_request
)
status
(
200
)
merge_request
.
destroy
end
...
...
lib/api/v3/project_snippets.rb
View file @
c280acb0
...
...
@@ -121,6 +121,8 @@ def snippets_for_current_user
authorize!
:admin_project_snippet
,
snippet
snippet
.
destroy
status
(
200
)
end
desc
'Get a raw project snippet'
...
...
lib/api/v3/projects.rb
View file @
c280acb0
...
...
@@ -359,6 +359,8 @@ def present_projects(projects, options = {})
desc
'Remove a project'
delete
":id"
do
authorize!
:remove_project
,
user_project
status
(
200
)
::
Projects
::
DestroyService
.
new
(
user_project
,
current_user
,
{}).
async_execute
end
...
...
@@ -384,6 +386,7 @@ def present_projects(projects, options = {})
authorize!
:remove_fork_project
,
user_project
if
user_project
.
forked?
status
(
200
)
user_project
.
forked_project_link
.
destroy
else
not_modified!
...
...
lib/api/v3/runners.rb
0 → 100644
View file @
c280acb0
module
API
module
V3
class
Runners
<
Grape
::
API
include
PaginationParams
before
{
authenticate!
}
resource
:runners
do
desc
'Remove a runner'
do
success
::
API
::
Entities
::
Runner
end
params
do
requires
:id
,
type:
Integer
,
desc:
'The ID of the runner'
end
delete
':id'
do
runner
=
Ci
::
Runner
.
find
(
params
[
:id
])
not_found!
(
'Runner'
)
unless
runner
authenticate_delete_runner!
(
runner
)
status
(
200
)
runner
.
destroy
end
end
params
do
requires
:id
,
type:
String
,
desc:
'The ID of a project'
end
resource
:projects
do
before
{
authorize_admin_project
}
desc
"Disable project's runner"
do
success
::
API
::
Entities
::
Runner
end
params
do
requires
:runner_id
,
type:
Integer
,
desc:
'The ID of the runner'
end
delete
':id/runners/:runner_id'
do
runner_project
=
user_project
.
runner_projects
.
find_by
(
runner_id:
params
[
:runner_id
])
not_found!
(
'Runner'
)
unless
runner_project
runner
=
runner_project
.
runner
forbidden!
(
"Only one project associated with the runner. Please remove the runner instead"
)
if
runner
.
projects
.
count
==
1
runner_project
.
destroy
present
runner
,
with:
::
API
::
Entities
::
Runner
end
end
helpers
do
def
authenticate_delete_runner!
(
runner
)
return
if
current_user
.
is_admin?
forbidden!
(
"Runner is shared"
)
if
runner
.
is_shared?
forbidden!
(
"Runner associated with more than one project"
)
if
runner
.
projects
.
count
>
1
forbidden!
(
"No access granted"
)
unless
user_can_access_runner?
(
runner
)
end
def
user_can_access_runner?
(
runner
)
current_user
.
ci_authorized_runners
.
exists?
(
runner
.
id
)
end
end
end
end
end
lib/api/v3/services.rb
0 → 100644
View file @
c280acb0
module
API
module
V3
class
Services
<
Grape
::
API
services
=
{
'asana'
=>
[
{
required:
true
,
name: :api_key
,
type:
String
,
desc:
'User API token'
},
{
required:
false
,
name: :restrict_to_branch
,
type:
String
,
desc:
'Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches'
}
],
'assembla'
=>
[
{
required:
true
,
name: :token
,
type:
String
,
desc:
'The authentication token'
},
{
required:
false
,
name: :subdomain
,
type:
String
,
desc:
'Subdomain setting'
}
],
'bamboo'
=>
[
{
required:
true
,
name: :bamboo_url
,
type:
String
,
desc:
'Bamboo root URL like https://bamboo.example.com'
},
{
required:
true
,
name: :build_key
,
type:
String
,
desc:
'Bamboo build plan key like'
},
{
required:
true
,
name: :username
,
type:
String
,
desc:
'A user with API access, if applicable'
},
{
required:
true
,
name: :password
,
type:
String
,
desc:
'Passord of the user'
}
],
'bugzilla'
=>
[
{
required:
true
,
name: :new_issue_url
,
type:
String
,
desc:
'New issue URL'
},
{
required:
true
,
name: :issues_url
,
type:
String
,
desc:
'Issues URL'
},
{
required:
true
,
name: :project_url
,
type:
String
,
desc:
'Project URL'
},
{
required:
false
,
name: :description
,
type:
String
,
desc:
'Description'
},
{
required:
false
,
name: :title
,
type:
String
,
desc:
'Title'
}
],
'buildkite'
=>
[
{
required:
true
,
name: :token
,
type:
String
,
desc:
'Buildkite project GitLab token'
},
{
required:
true
,
name: :project_url
,
type:
String
,
desc:
'The buildkite project URL'
},
{
required:
false
,
name: :enable_ssl_verification
,
type:
Boolean
,
desc:
'Enable SSL verification for communication'
}
],
'builds-email'
=>
[
{
required:
true
,
name: :recipients
,
type:
String
,
desc:
'Comma-separated list of recipient email addresses'
},
{
required:
false
,
name: :add_pusher
,
type:
Boolean
,
desc:
'Add pusher to recipients list'
},
{
required:
false
,
name: :notify_only_broken_builds
,
type:
Boolean
,
desc:
'Notify only broken builds'
}
],
'campfire'
=>
[
{
required:
true
,
name: :token
,
type:
String
,
desc:
'Campfire token'
},
{
required:
false
,
name: :subdomain
,
type:
String
,
desc:
'Campfire subdomain'
},
{
required:
false
,
name: :room
,
type:
String
,
desc:
'Campfire room'
}
],
'custom-issue-tracker'
=>
[
{
required:
true
,
name: :new_issue_url
,
type:
String
,
desc:
'New issue URL'
},
{
required:
true
,
name: :issues_url
,
type:
String
,
desc:
'Issues URL'
},
{
required:
true
,
name: :project_url
,
type:
String
,
desc:
'Project URL'
},
{
required:
false
,
name: :description
,
type:
String
,
desc:
'Description'
},
{
required:
false
,
name: :title
,
type:
String
,
desc:
'Title'
}
],
'drone-ci'
=>
[
{
required:
true
,
name: :token
,
type:
String
,
desc:
'Drone CI token'
},
{
required:
true
,
name: :drone_url
,
type:
String
,
desc:
'Drone CI URL'
},
{
required:
false
,
name: :enable_ssl_verification
,
type:
Boolean
,
desc:
'Enable SSL verification for communication'
}
],
'emails-on-push'
=>
[
{
required:
true
,
name: :recipients
,
type:
String
,
desc:
'Comma-separated list of recipient email addresses'
},
{
required:
false
,
name: :disable_diffs
,
type:
Boolean
,
desc:
'Disable code diffs'
},
{
required:
false
,
name: :send_from_committer_email
,
type:
Boolean
,
desc:
'Send from committer'
}
],
'external-wiki'
=>
[
{
required:
true
,
name: :external_wiki_url
,
type:
String
,
desc:
'The URL of the external Wiki'
}
],
'flowdock'
=>
[
{
required:
true
,
name: :token
,
type:
String
,
desc:
'Flowdock token'
}
],
'gemnasium'
=>
[
{
required:
true
,
name: :api_key
,
type:
String
,
desc:
'Your personal API key on gemnasium.com'
},
{
required:
true
,
name: :token
,
type:
String
,
desc:
"The project's slug on gemnasium.com"
}
],
'hipchat'
=>
[
{
required:
true
,
name: :token
,
type:
String
,
desc:
'The room token'
},
{
required:
false
,
name: :room
,
type:
String
,
desc:
'The room name or ID'
},
{
required:
false
,
name: :color
,
type:
String
,
desc:
'The room color'
},
{
required:
false
,
name: :notify
,
type:
Boolean
,
desc:
'Enable notifications'
},
{
required:
false
,
name: :api_version
,
type:
String
,
desc:
'Leave blank for default (v2)'
},
{
required:
false
,
name: :server
,
type:
String
,
desc:
'Leave blank for default. https://hipchat.example.com'
}