Merge branch 'add-ability-to-archive-a-project-via-api-14296' into 'master'
Add endpoints for archiving and unarchiving Closes #14296 See merge request !3372
This commit is contained in:
commit
df725aec98
|
@ -8,6 +8,7 @@ v 8.7.0 (unreleased)
|
|||
- Expose label description in API (Mariusz Jachimowicz)
|
||||
- Allow back dating on issues when created through the API
|
||||
- Fix avatar stretching by providing a cropping feature
|
||||
- Add endpoints to archive or unarchive a project !3372
|
||||
- Add links to CI setup documentation from project settings and builds pages
|
||||
- Handle nil descriptions in Slack issue messages (Stan Hu)
|
||||
- Add default scope to projects to exclude projects pending deletion
|
||||
|
|
|
@ -491,6 +491,172 @@ Parameters:
|
|||
|
||||
- `id` (required) - The ID of the project to be forked
|
||||
|
||||
### Archive a project
|
||||
|
||||
Archives the project if the user is either admin or the project owner of this project. This action is
|
||||
idempotent, thus archiving an already archived project will not change the project.
|
||||
|
||||
Status code 201 with the project as body is given when successful, in case the user doesn't
|
||||
have the proper access rights, code 403 is returned. Status 404 is returned if the project
|
||||
doesn't exist, or is hidden to the user.
|
||||
|
||||
```
|
||||
POST /projects/:id/archive
|
||||
```
|
||||
|
||||
| Attribute | Type | Required | Description |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `id` | integer | yes | The ID of the project |
|
||||
|
||||
```bash
|
||||
curl -X POST -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/archive"
|
||||
```
|
||||
|
||||
Example response:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": 3,
|
||||
"description": null,
|
||||
"default_branch": "master",
|
||||
"public": false,
|
||||
"visibility_level": 0,
|
||||
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git",
|
||||
"http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git",
|
||||
"web_url": "http://example.com/diaspora/diaspora-project-site",
|
||||
"tag_list": [
|
||||
"example",
|
||||
"disapora project"
|
||||
],
|
||||
"owner": {
|
||||
"id": 3,
|
||||
"name": "Diaspora",
|
||||
"created_at": "2013-09-30T13: 46: 02Z"
|
||||
},
|
||||
"name": "Diaspora Project Site",
|
||||
"name_with_namespace": "Diaspora / Diaspora Project Site",
|
||||
"path": "diaspora-project-site",
|
||||
"path_with_namespace": "diaspora/diaspora-project-site",
|
||||
"issues_enabled": true,
|
||||
"open_issues_count": 1,
|
||||
"merge_requests_enabled": true,
|
||||
"builds_enabled": true,
|
||||
"wiki_enabled": true,
|
||||
"snippets_enabled": false,
|
||||
"created_at": "2013-09-30T13: 46: 02Z",
|
||||
"last_activity_at": "2013-09-30T13: 46: 02Z",
|
||||
"creator_id": 3,
|
||||
"namespace": {
|
||||
"created_at": "2013-09-30T13: 46: 02Z",
|
||||
"description": "",
|
||||
"id": 3,
|
||||
"name": "Diaspora",
|
||||
"owner_id": 1,
|
||||
"path": "diaspora",
|
||||
"updated_at": "2013-09-30T13: 46: 02Z"
|
||||
},
|
||||
"permissions": {
|
||||
"project_access": {
|
||||
"access_level": 10,
|
||||
"notification_level": 3
|
||||
},
|
||||
"group_access": {
|
||||
"access_level": 50,
|
||||
"notification_level": 3
|
||||
}
|
||||
},
|
||||
"archived": true,
|
||||
"avatar_url": "http://example.com/uploads/project/avatar/3/uploads/avatar.png",
|
||||
"shared_runners_enabled": true,
|
||||
"forks_count": 0,
|
||||
"star_count": 0,
|
||||
"runners_token": "b8bc4a7a29eb76ea83cf79e4908c2b"
|
||||
}
|
||||
```
|
||||
|
||||
### Unarchive a project
|
||||
|
||||
Unarchives the project if the user is either admin or the project owner of this project. This action is
|
||||
idempotent, thus unarchiving an non-archived project will not change the project.
|
||||
|
||||
Status code 201 with the project as body is given when successful, in case the user doesn't
|
||||
have the proper access rights, code 403 is returned. Status 404 is returned if the project
|
||||
doesn't exist, or is hidden to the user.
|
||||
|
||||
```
|
||||
POST /projects/:id/archive
|
||||
```
|
||||
|
||||
| Attribute | Type | Required | Description |
|
||||
| --------- | ---- | -------- | ----------- |
|
||||
| `id` | integer | yes | The ID of the project |
|
||||
|
||||
```bash
|
||||
curl -X POST -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/unarchive"
|
||||
```
|
||||
|
||||
Example response:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": 3,
|
||||
"description": null,
|
||||
"default_branch": "master",
|
||||
"public": false,
|
||||
"visibility_level": 0,
|
||||
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git",
|
||||
"http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git",
|
||||
"web_url": "http://example.com/diaspora/diaspora-project-site",
|
||||
"tag_list": [
|
||||
"example",
|
||||
"disapora project"
|
||||
],
|
||||
"owner": {
|
||||
"id": 3,
|
||||
"name": "Diaspora",
|
||||
"created_at": "2013-09-30T13: 46: 02Z"
|
||||
},
|
||||
"name": "Diaspora Project Site",
|
||||
"name_with_namespace": "Diaspora / Diaspora Project Site",
|
||||
"path": "diaspora-project-site",
|
||||
"path_with_namespace": "diaspora/diaspora-project-site",
|
||||
"issues_enabled": true,
|
||||
"open_issues_count": 1,
|
||||
"merge_requests_enabled": true,
|
||||
"builds_enabled": true,
|
||||
"wiki_enabled": true,
|
||||
"snippets_enabled": false,
|
||||
"created_at": "2013-09-30T13: 46: 02Z",
|
||||
"last_activity_at": "2013-09-30T13: 46: 02Z",
|
||||
"creator_id": 3,
|
||||
"namespace": {
|
||||
"created_at": "2013-09-30T13: 46: 02Z",
|
||||
"description": "",
|
||||
"id": 3,
|
||||
"name": "Diaspora",
|
||||
"owner_id": 1,
|
||||
"path": "diaspora",
|
||||
"updated_at": "2013-09-30T13: 46: 02Z"
|
||||
},
|
||||
"permissions": {
|
||||
"project_access": {
|
||||
"access_level": 10,
|
||||
"notification_level": 3
|
||||
},
|
||||
"group_access": {
|
||||
"access_level": 50,
|
||||
"notification_level": 3
|
||||
}
|
||||
},
|
||||
"archived": false,
|
||||
"avatar_url": "http://example.com/uploads/project/avatar/3/uploads/avatar.png",
|
||||
"shared_runners_enabled": true,
|
||||
"forks_count": 0,
|
||||
"star_count": 0,
|
||||
"runners_token": "b8bc4a7a29eb76ea83cf79e4908c2b"
|
||||
}
|
||||
```
|
||||
|
||||
### Remove project
|
||||
|
||||
Removes a project including all associated resources (issues, merge requests etc.)
|
||||
|
|
|
@ -244,6 +244,34 @@ module API
|
|||
end
|
||||
end
|
||||
|
||||
# Archive project
|
||||
#
|
||||
# Parameters:
|
||||
# id (required) - The ID of a project
|
||||
# Example Request:
|
||||
# PUT /projects/:id/archive
|
||||
post ':id/archive' do
|
||||
authorize!(:archive_project, user_project)
|
||||
|
||||
user_project.archive!
|
||||
|
||||
present user_project, with: Entities::Project
|
||||
end
|
||||
|
||||
# Unarchive project
|
||||
#
|
||||
# Parameters:
|
||||
# id (required) - The ID of a project
|
||||
# Example Request:
|
||||
# PUT /projects/:id/unarchive
|
||||
post ':id/unarchive' do
|
||||
authorize!(:archive_project, user_project)
|
||||
|
||||
user_project.unarchive!
|
||||
|
||||
present user_project, with: Entities::Project
|
||||
end
|
||||
|
||||
# Remove project
|
||||
#
|
||||
# Parameters:
|
||||
|
|
|
@ -948,6 +948,78 @@ describe API::API, api: true do
|
|||
end
|
||||
end
|
||||
|
||||
describe 'POST /projects/:id/archive' do
|
||||
context 'on an unarchived project' do
|
||||
it 'archives the project' do
|
||||
post api("/projects/#{project.id}/archive", user)
|
||||
|
||||
expect(response.status).to eq(201)
|
||||
expect(json_response['archived']).to be_truthy
|
||||
end
|
||||
end
|
||||
|
||||
context 'on an archived project' do
|
||||
before do
|
||||
project.archive!
|
||||
end
|
||||
|
||||
it 'remains archived' do
|
||||
post api("/projects/#{project.id}/archive", user)
|
||||
|
||||
expect(response.status).to eq(201)
|
||||
expect(json_response['archived']).to be_truthy
|
||||
end
|
||||
end
|
||||
|
||||
context 'user without archiving rights to the project' do
|
||||
before do
|
||||
project.team << [user3, :developer]
|
||||
end
|
||||
|
||||
it 'rejects the action' do
|
||||
post api("/projects/#{project.id}/archive", user3)
|
||||
|
||||
expect(response.status).to eq(403)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'POST /projects/:id/unarchive' do
|
||||
context 'on an unarchived project' do
|
||||
it 'remains unarchived' do
|
||||
post api("/projects/#{project.id}/unarchive", user)
|
||||
|
||||
expect(response.status).to eq(201)
|
||||
expect(json_response['archived']).to be_falsey
|
||||
end
|
||||
end
|
||||
|
||||
context 'on an archived project' do
|
||||
before do
|
||||
project.archive!
|
||||
end
|
||||
|
||||
it 'unarchives the project' do
|
||||
post api("/projects/#{project.id}/unarchive", user)
|
||||
|
||||
expect(response.status).to eq(201)
|
||||
expect(json_response['archived']).to be_falsey
|
||||
end
|
||||
end
|
||||
|
||||
context 'user without archiving rights to the project' do
|
||||
before do
|
||||
project.team << [user3, :developer]
|
||||
end
|
||||
|
||||
it 'rejects the action' do
|
||||
post api("/projects/#{project.id}/unarchive", user3)
|
||||
|
||||
expect(response.status).to eq(403)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'DELETE /projects/:id' do
|
||||
context 'when authenticated as user' do
|
||||
it 'should remove project' do
|
||||
|
|
Loading…
Reference in New Issue