Commit add5cd99 authored by Toon Claes's avatar Toon Claes

API: Make the /notes endpoint work with noteable iid instead of id

In API V4 all endpoints were changed so Merge Requests and Issues
should be referred by iid, instead of id. Except the /notes endpoint
was forgotten. So change the endpoints from:

- /projects/:id/issues/:issue_id/notes
- /projects/:id/merge_requests/:merge_request_id/notes

To:

- /projects/:id/issues/:issue_iid/notes
- /projects/:id/merge_requests/:merge_request_iid/notes

For Project Snippets nothing changes.
parent d536d959
---
title: 'API: Make the /notes endpoint work with noteable iid instead of id'
merge_request:
author:
...@@ -9,13 +9,13 @@ Notes are comments on snippets, issues or merge requests. ...@@ -9,13 +9,13 @@ Notes are comments on snippets, issues or merge requests.
Gets a list of all notes for a single issue. Gets a list of all notes for a single issue.
``` ```
GET /projects/:id/issues/:issue_id/notes GET /projects/:id/issues/:issue_iid/notes
``` ```
Parameters: Parameters:
- `id` (required) - The ID of a project - `id` (required) - The ID of a project
- `issue_id` (required) - The ID of an issue - `issue_iid` (required) - The IID of an issue
```json ```json
[ [
...@@ -63,13 +63,13 @@ Parameters: ...@@ -63,13 +63,13 @@ Parameters:
Returns a single note for a specific project issue Returns a single note for a specific project issue
``` ```
GET /projects/:id/issues/:issue_id/notes/:note_id GET /projects/:id/issues/:issue_iid/notes/:note_id
``` ```
Parameters: Parameters:
- `id` (required) - The ID of a project - `id` (required) - The ID of a project
- `issue_id` (required) - The ID of a project issue - `issue_iid` (required) - The IID of a project issue
- `note_id` (required) - The ID of an issue note - `note_id` (required) - The ID of an issue note
### Create new issue note ### Create new issue note
...@@ -78,13 +78,13 @@ Creates a new note to a single project issue. If you create a note where the bod ...@@ -78,13 +78,13 @@ Creates a new note to a single project issue. If you create a note where the bod
only contains an Award Emoji, you'll receive this object back. only contains an Award Emoji, you'll receive this object back.
``` ```
POST /projects/:id/issues/:issue_id/notes POST /projects/:id/issues/:issue_iid/notes
``` ```
Parameters: Parameters:
- `id` (required) - The ID of a project - `id` (required) - The ID of a project
- `issue_id` (required) - The ID of an issue - `issue_id` (required) - The IID of an issue
- `body` (required) - The content of a note - `body` (required) - The content of a note
- `created_at` (optional) - Date time string, ISO 8601 formatted, e.g. 2016-03-11T03:45:40Z - `created_at` (optional) - Date time string, ISO 8601 formatted, e.g. 2016-03-11T03:45:40Z
...@@ -93,13 +93,13 @@ Parameters: ...@@ -93,13 +93,13 @@ Parameters:
Modify existing note of an issue. Modify existing note of an issue.
``` ```
PUT /projects/:id/issues/:issue_id/notes/:note_id PUT /projects/:id/issues/:issue_iid/notes/:note_id
``` ```
Parameters: Parameters:
- `id` (required) - The ID of a project - `id` (required) - The ID of a project
- `issue_id` (required) - The ID of an issue - `issue_iid` (required) - The IID of an issue
- `note_id` (required) - The ID of a note - `note_id` (required) - The ID of a note
- `body` (required) - The content of a note - `body` (required) - The content of a note
...@@ -108,7 +108,7 @@ Parameters: ...@@ -108,7 +108,7 @@ Parameters:
Deletes an existing note of an issue. Deletes an existing note of an issue.
``` ```
DELETE /projects/:id/issues/:issue_id/notes/:note_id DELETE /projects/:id/issues/:issue_iid/notes/:note_id
``` ```
Parameters: Parameters:
...@@ -116,7 +116,7 @@ Parameters: ...@@ -116,7 +116,7 @@ Parameters:
| Attribute | Type | Required | Description | | Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- | | --------- | ---- | -------- | ----------- |
| `id` | integer | yes | The ID of a project | | `id` | integer | yes | The ID of a project |
| `issue_id` | integer | yes | The ID of an issue | | `issue_iid` | integer | yes | The IID of an issue |
| `note_id` | integer | yes | The ID of a note | | `note_id` | integer | yes | The ID of a note |
```bash ```bash
...@@ -228,26 +228,26 @@ curl --request DELETE --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://git ...@@ -228,26 +228,26 @@ curl --request DELETE --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://git
Gets a list of all notes for a single merge request. Gets a list of all notes for a single merge request.
``` ```
GET /projects/:id/merge_requests/:merge_request_id/notes GET /projects/:id/merge_requests/:merge_request_iid/notes
``` ```
Parameters: Parameters:
- `id` (required) - The ID of a project - `id` (required) - The ID of a project
- `merge_request_id` (required) - The ID of a project merge request - `merge_request_iid` (required) - The IID of a project merge request
### Get single merge request note ### Get single merge request note
Returns a single note for a given merge request. Returns a single note for a given merge request.
``` ```
GET /projects/:id/merge_requests/:merge_request_id/notes/:note_id GET /projects/:id/merge_requests/:merge_request_iid/notes/:note_id
``` ```
Parameters: Parameters:
- `id` (required) - The ID of a project - `id` (required) - The ID of a project
- `merge_request_id` (required) - The ID of a project merge request - `merge_request_iid` (required) - The IID of a project merge request
- `note_id` (required) - The ID of a merge request note - `note_id` (required) - The ID of a merge request note
```json ```json
...@@ -278,13 +278,13 @@ If you create a note where the body only contains an Award Emoji, you'll receive ...@@ -278,13 +278,13 @@ If you create a note where the body only contains an Award Emoji, you'll receive
this object back. this object back.
``` ```
POST /projects/:id/merge_requests/:merge_request_id/notes POST /projects/:id/merge_requests/:merge_request_iid/notes
``` ```
Parameters: Parameters:
- `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_iid` (required) - The IID of a merge request
- `body` (required) - The content of a note - `body` (required) - The content of a note
### Modify existing merge request note ### Modify existing merge request note
...@@ -292,13 +292,13 @@ Parameters: ...@@ -292,13 +292,13 @@ Parameters:
Modify existing note of a merge request. Modify existing note of a merge request.
``` ```
PUT /projects/:id/merge_requests/:merge_request_id/notes/:note_id PUT /projects/:id/merge_requests/:merge_request_iid/notes/:note_id
``` ```
Parameters: Parameters:
- `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_iid` (required) - The IID of a merge request
- `note_id` (required) - The ID of a note - `note_id` (required) - The ID of a note
- `body` (required) - The content of a note - `body` (required) - The content of a note
...@@ -307,7 +307,7 @@ Parameters: ...@@ -307,7 +307,7 @@ Parameters:
Deletes an existing note of a merge request. Deletes an existing note of a merge request.
``` ```
DELETE /projects/:id/merge_requests/:merge_request_id/notes/:note_id DELETE /projects/:id/merge_requests/:merge_request_iid/notes/:note_id
``` ```
Parameters: Parameters:
...@@ -315,7 +315,7 @@ Parameters: ...@@ -315,7 +315,7 @@ Parameters:
| Attribute | Type | Required | Description | | Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- | | --------- | ---- | -------- | ----------- |
| `id` | integer | yes | The ID of a project | | `id` | integer | yes | The ID of a project |
| `merge_request_id` | integer | yes | The ID of a merge request | | `merge_request_iid` | integer | yes | The IID of a merge request |
| `note_id` | integer | yes | The ID of a note | | `note_id` | integer | yes | The ID of a note |
```bash ```bash
......
...@@ -90,6 +90,11 @@ module API ...@@ -90,6 +90,11 @@ module API
MergeRequestsFinder.new(current_user, project_id: user_project.id).find_by!(iid: iid) MergeRequestsFinder.new(current_user, project_id: user_project.id).find_by!(iid: iid)
end end
def find_project_snippet(id)
finder_params = { filter: :by_project, project: user_project }
SnippetsFinder.new.execute(current_user, finder_params).find(id)
end
def find_merge_request_with_access(iid, access_level = :read_merge_request) def find_merge_request_with_access(iid, access_level = :read_merge_request)
merge_request = user_project.merge_requests.find_by!(iid: iid) merge_request = user_project.merge_requests.find_by!(iid: iid)
authorize! access_level, merge_request authorize! access_level, merge_request
......
...@@ -21,7 +21,7 @@ module API ...@@ -21,7 +21,7 @@ module API
use :pagination use :pagination
end end
get ":id/#{noteables_str}/:noteable_id/notes" do get ":id/#{noteables_str}/:noteable_id/notes" do
noteable = user_project.send(noteables_str.to_sym).find(params[:noteable_id]) noteable = find_project_noteable(noteables_str, params[:noteable_id])
if can?(current_user, noteable_read_ability_name(noteable), noteable) if can?(current_user, noteable_read_ability_name(noteable), noteable)
# We exclude notes that are cross-references and that cannot be viewed # We exclude notes that are cross-references and that cannot be viewed
...@@ -49,7 +49,7 @@ module API ...@@ -49,7 +49,7 @@ module API
requires :noteable_id, type: Integer, desc: 'The ID of the noteable' requires :noteable_id, type: Integer, desc: 'The ID of the noteable'
end end
get ":id/#{noteables_str}/:noteable_id/notes/:note_id" do get ":id/#{noteables_str}/:noteable_id/notes/:note_id" do
noteable = user_project.send(noteables_str.to_sym).find(params[:noteable_id]) noteable = find_project_noteable(noteables_str, params[:noteable_id])
note = noteable.notes.find(params[:note_id]) note = noteable.notes.find(params[:note_id])
can_read_note = can?(current_user, noteable_read_ability_name(noteable), noteable) && !note.cross_reference_not_visible_for?(current_user) can_read_note = can?(current_user, noteable_read_ability_name(noteable), noteable) && !note.cross_reference_not_visible_for?(current_user)
...@@ -69,14 +69,14 @@ module API ...@@ -69,14 +69,14 @@ module API
optional :created_at, type: String, desc: 'The creation date of the note' optional :created_at, type: String, desc: 'The creation date of the note'
end end
post ":id/#{noteables_str}/:noteable_id/notes" do post ":id/#{noteables_str}/:noteable_id/notes" do
noteable = find_project_noteable(noteables_str, params[:noteable_id])
opts = { opts = {
note: params[:body], note: params[:body],
noteable_type: noteables_str.classify, noteable_type: noteables_str.classify,
noteable_id: params[:noteable_id] noteable_id: noteable.id
} }
noteable = user_project.send(noteables_str.to_sym).find(params[:noteable_id])
if can?(current_user, noteable_read_ability_name(noteable), noteable) if can?(current_user, noteable_read_ability_name(noteable), noteable)
if params[:created_at] && (current_user.is_admin? || user_project.owner == current_user) if params[:created_at] && (current_user.is_admin? || user_project.owner == current_user)
opts[:created_at] = params[:created_at] opts[:created_at] = params[:created_at]
...@@ -137,6 +137,10 @@ module API ...@@ -137,6 +137,10 @@ module API
end end
helpers do helpers do
def find_project_noteable(noteables_str, noteable_id)
public_send("find_project_#{noteables_str.singularize}", noteable_id)
end
def noteable_read_ability_name(noteable) def noteable_read_ability_name(noteable)
"read_#{noteable.class.to_s.underscore}".to_sym "read_#{noteable.class.to_s.underscore}".to_sym
end end
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment