Make subscription API more RESTful

This commit is contained in:
Robert Schilling 2016-04-12 14:46:59 +02:00
parent f875189b39
commit fa3009095f
7 changed files with 68 additions and 72 deletions

View file

@ -408,13 +408,14 @@ Example response:
## Subscribe to an issue ## Subscribe to an issue
Subscribes to an issue to receive notifications. If the operation is successful, Subscribes the authenticated user to an issue to receive notifications. If the
status code `201` together with the updated issue is returned. If the user is operation is successful, status code `201` together with the updated issue is
already subscribed to the issue, the status code `304` is returned. If the returned. If the user is already subscribed to the issue, the status code `304`
project or issue is not found, status code `404` is returned. is returned. If the project or issue is not found, status code `404` is
returned.
``` ```
POST /projects/:id/issues/:issue_id/subscribe POST /projects/:id/issues/:issue_id/subscription
``` ```
| Attribute | Type | Required | Description | | Attribute | Type | Required | Description |
@ -423,7 +424,7 @@ POST /projects/:id/issues/:issue_id/subscribe
| `issue_id` | integer | yes | The ID of a project's issue | | `issue_id` | integer | yes | The ID of a project's issue |
```bash ```bash
curl -X POST -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v3/projects/5/issues/93/subscribe curl -X POST -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v3/projects/5/issues/93/subscription
``` ```
Example response: Example response:
@ -461,14 +462,14 @@ Example response:
## Unsubscribe from an issue ## Unsubscribe from an issue
Unsubscribes from an issue to not receive notifications from that issue. If the Unsubscribes the authenticated user from the issue to not receive notifications
operation is successful, status code `201` together with the updated issue is from it. If the operation is successful, status code `200` together with the
returned. If the user is not subscribed to the issue, the status code `304` updated issue is returned. If the user is not subscribed to the issue, the
is returned. If the project or issue is not found, status code `404` is status code `304` is returned. If the project or issue is not found, status code
returned. `404` is returned.
``` ```
POST /projects/:id/issues/:issue_id/unsubscribe DELETE /projects/:id/issues/:issue_id/subscription
``` ```
| Attribute | Type | Required | Description | | Attribute | Type | Required | Description |
@ -477,7 +478,7 @@ POST /projects/:id/issues/:issue_id/unsubscribe
| `issue_id` | integer | yes | The ID of a project's issue | | `issue_id` | integer | yes | The ID of a project's issue |
```bash ```bash
curl -X POST -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v3/projects/5/issues/93/unsubscribe curl -X DELETE -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v3/projects/5/issues/93/subscription
``` ```
Example response: Example response:

View file

@ -609,14 +609,14 @@ Example response:
## Subscribe to a merge request ## Subscribe to a merge request
Subscribes to a merge request to receive notification. If the operation is Subscribes the authenticated user to a merge request to receive notification. If
successful, status code `201` together with the updated merge request is the operation is successful, status code `201` together with the updated merge
returned. If the user is already subscribed to the merge request, the status request is returned. If the user is already subscribed to the merge request, the
code `304` is returned. If the project or merge request is not found, status status code `304` is returned. If the project or merge request is not found,
code `404` is returned. status code `404` is returned.
``` ```
POST /projects/:id/merge_requests/:merge_request_id/subscribe POST /projects/:id/merge_requests/:merge_request_id/subscription
``` ```
| Attribute | Type | Required | Description | | Attribute | Type | Required | Description |
@ -625,7 +625,7 @@ POST /projects/:id/merge_requests/:merge_request_id/subscribe
| `merge_request_id` | integer | yes | The ID of the merge request | | `merge_request_id` | integer | yes | The ID of the merge request |
```bash ```bash
curl -X POST -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v3/projects/5/merge_requests/17/subscribe curl -X POST -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v3/projects/5/merge_requests/17/subscription
``` ```
Example response: Example response:
@ -682,14 +682,14 @@ Example response:
``` ```
## Unsubscribe from a merge request ## Unsubscribe from a merge request
Unsubscribes from a merge request to not receive notifications from that merge Unsubscribes the authenticated user from a merge request to not receive
request. If the operation is successful, status code `201` together with the notifications from that merge request. If the operation is successful, status
updated merge request is returned. If the user is not subscribed to the merge code `200` together with the updated merge request is returned. If the user is
request, the status code `304` is returned. If the project or merge request is not subscribed to the merge request, the status code `304` is returned. If the
not found, status code `404` is returned. project or merge request is not found, status code `404` is returned.
``` ```
POST /projects/:id/merge_requests/:merge_request_id/unsubscribe DELETE /projects/:id/merge_requests/:merge_request_id/subscription
``` ```
| Attribute | Type | Required | Description | | Attribute | Type | Required | Description |
@ -698,7 +698,7 @@ POST /projects/:id/merge_requests/:merge_request_id/unsubscribe
| `merge_request_id` | integer | yes | The ID of the merge request | | `merge_request_id` | integer | yes | The ID of the merge request |
```bash ```bash
curl -X POST -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v3/projects/5/merge_requests/17/subscribe curl -X DELETE -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v3/projects/5/merge_requests/17/subscription
``` ```
Example response: Example response:

View file

@ -242,7 +242,7 @@ module API
end end
def not_modified! def not_modified!
render_api_error!('304 Not modified', 304) render_api_error!('304 Not Modified', 304)
end end
def render_validation_error!(model) def render_validation_error!(model)

View file

@ -238,32 +238,15 @@ module API
# id (required) - The ID of a project # id (required) - The ID of a project
# issue_id (required) - The ID of a project issue # issue_id (required) - The ID of a project issue
# Example Request: # Example Request:
# POST /projects/:id/issues/:issue_id # POST /projects/:id/issues/:issue_id/subscription
post ":id/issues/:issue_idsubscribe" do post ":id/issues/:issue_id/subscription" do
issue = user_project.issues.find_by(id: params[:issue_id]) issue = user_project.issues.find_by(id: params[:issue_id])
if !issue.subscribed?(current_user) if issue.subscribed?(current_user)
present issue, with: Entities::Issue, current_user: current_user
else
not_modified! not_modified!
end else
end
# Subscribes to a project issue
#
# Parameters:
# id (required) - The ID of a project
# issue_id (required) - The ID of a project issue
# Example Request:
# POST /projects/:id/issues/:issue_id/subscribe
post ":id/issues/:issue_id/subscribe" do
issue = user_project.issues.find_by(id: params[:issue_id])
if !issue.subscribed?(current_user)
issue.toggle_subscription(current_user) issue.toggle_subscription(current_user)
present issue, with: Entities::Issue, current_user: current_user present issue, with: Entities::Issue, current_user: current_user
else
not_modified!
end end
end end
@ -273,8 +256,8 @@ module API
# id (required) - The ID of a project # id (required) - The ID of a project
# issue_id (required) - The ID of a project issue # issue_id (required) - The ID of a project issue
# Example Request: # Example Request:
# POST /projects/:id/issues/:issue_id/unsubscribe # DELETE /projects/:id/issues/:issue_id/subscription
post ":id/issues/:issue_id/unsubscribe" do delete ":id/issues/:issue_id/subscription" do
issue = user_project.issues.find_by(id: params[:issue_id]) issue = user_project.issues.find_by(id: params[:issue_id])
if issue.subscribed?(current_user) if issue.subscribed?(current_user)

View file

@ -334,15 +334,15 @@ module API
# id (required) - The ID of a project # id (required) - The ID of a project
# merge_request_id (required) - The ID of a merge request # merge_request_id (required) - The ID of a merge request
# Example Request: # Example Request:
# POST /projects/:id/issues/:merge_request_id/subscribe # POST /projects/:id/issues/:merge_request_id/subscription
post "#{path}/subscribe" do post "#{path}/subscription" do
merge_request = user_project.merge_requests.find(params[:merge_request_id]) merge_request = user_project.merge_requests.find(params[:merge_request_id])
if !merge_request.subscribed?(current_user) if merge_request.subscribed?(current_user)
not_modified!
else
merge_request.toggle_subscription(current_user) merge_request.toggle_subscription(current_user)
present merge_request, with: Entities::MergeRequest, current_user: current_user present merge_request, with: Entities::MergeRequest, current_user: current_user
else
not_modified!
end end
end end
@ -352,8 +352,8 @@ module API
# id (required) - The ID of a project # id (required) - The ID of a project
# merge_request_id (required) - The ID of a merge request # merge_request_id (required) - The ID of a merge request
# Example Request: # Example Request:
# POST /projects/:id/merge_requests/:merge_request_id/unsubscribe # DELETE /projects/:id/merge_requests/:merge_request_id/subscription
post "#{path}/unsubscribe" do delete "#{path}/subscription" do
merge_request = user_project.merge_requests.find(params[:merge_request_id]) merge_request = user_project.merge_requests.find(params[:merge_request_id])
if merge_request.subscribed?(current_user) if merge_request.subscribed?(current_user)

View file

@ -571,33 +571,45 @@ describe API::API, api: true do
end end
end end
describe 'POST :id/issues/:issue_id/subscribe' do describe 'POST :id/issues/:issue_id/subscription' do
it 'subscribes to an issue' do it 'subscribes to an issue' do
post api("/projects/#{project.id}/issues/#{issue.id}/subscribe", user2) post api("/projects/#{project.id}/issues/#{issue.id}/subscription", user2)
expect(response.status).to eq(201) expect(response.status).to eq(201)
expect(json_response['subscribed']).to eq(true) expect(json_response['subscribed']).to eq(true)
end end
it 'returns 304 if already subscribed' do it 'returns 304 if already subscribed' do
post api("/projects/#{project.id}/issues/#{issue.id}/subscribe", user) post api("/projects/#{project.id}/issues/#{issue.id}/subscription", user)
expect(response.status).to eq(304) expect(response.status).to eq(304)
end end
it 'returns 404 if the issue is not found' do
post api("/projects/#{project.id}/issues/123/subscription", user)
expect(response.status).to eq(404)
end
end end
describe 'POST :id/issues/:issue_id/unsubscribe' do describe 'DELETE :id/issues/:issue_id/subscription' do
it 'unsubscribes from an issue' do it 'unsubscribes from an issue' do
post api("/projects/#{project.id}/issues/#{issue.id}/unsubscribe", user) post api("/projects/#{project.id}/issues/#{issue.id}/subscription", user)
expect(response.status).to eq(201) expect(response.status).to eq(200)
expect(json_response['subscribed']).to eq(false) expect(json_response['subscribed']).to eq(false)
end end
it 'returns 304 if not subscribed' do it 'returns 304 if not subscribed' do
post api("/projects/#{project.id}/issues/#{issue.id}/unsubscribe", user2) post api("/projects/#{project.id}/issues/#{issue.id}/subscription", user2)
expect(response.status).to eq(304) expect(response.status).to eq(304)
end end
it 'returns 404 if the issue is not found' do
post api("/projects/#{project.id}/issues/123/subscription", user)
expect(response.status).to eq(404)
end
end end
end end

View file

@ -516,31 +516,31 @@ describe API::API, api: true do
end end
end end
describe 'POST :id/merge_requests/:merge_request_id/subscribe' do describe 'POST :id/merge_requests/:merge_request_id/subscription' do
it 'subscribes to a merge request' do it 'subscribes to a merge request' do
post api("/projects/#{project.id}/merge_requests/#{merge_request.id}/subscribe", admin) post api("/projects/#{project.id}/merge_requests/#{merge_request.id}/subscription", admin)
expect(response.status).to eq(201) expect(response.status).to eq(201)
expect(json_response['subscribed']).to eq(true) expect(json_response['subscribed']).to eq(true)
end end
it 'returns 304 if already subscribed' do it 'returns 304 if already subscribed' do
post api("/projects/#{project.id}/merge_requests/#{merge_request.id}/subscribe", user) post api("/projects/#{project.id}/merge_requests/#{merge_request.id}/subscription", user)
expect(response.status).to eq(304) expect(response.status).to eq(304)
end end
end end
describe 'POST :id/merge_requests/:merge_request_id/unsubscribe' do describe 'DELETE :id/merge_requests/:merge_request_id/subscription' do
it 'unsubscribes from a merge request' do it 'unsubscribes from a merge request' do
post api("/projects/#{project.id}/merge_requests/#{merge_request.id}/unsubscribe", user) delete api("/projects/#{project.id}/merge_requests/#{merge_request.id}/subscription", user)
expect(response.status).to eq(201) expect(response.status).to eq(200)
expect(json_response['subscribed']).to eq(false) expect(json_response['subscribed']).to eq(false)
end end
it 'returns 304 if not subscribed' do it 'returns 304 if not subscribed' do
post api("/projects/#{project.id}/merge_requests/#{merge_request.id}/unsubscribe", admin) delete api("/projects/#{project.id}/merge_requests/#{merge_request.id}/subscription", admin)
expect(response.status).to eq(304) expect(response.status).to eq(304)
end end