Commit 7bc04861 authored by sue445's avatar sue445 Committed by Rémy Coutable

Expose noteable_iid in Note

parent 6f555990
---
title: Expose noteable_iid in Note
merge_request: 13265
author: sue445
...@@ -338,6 +338,45 @@ Example response: ...@@ -338,6 +338,45 @@ Example response:
"web_url":"https://gitlab.example.com/ted" "web_url":"https://gitlab.example.com/ted"
}, },
"author_username":"ted" "author_username":"ted"
},
{
"title": null,
"project_id": 1,
"action_name": "commented on",
"target_id": 1312,
"target_iid": 1312,
"target_type": "Note",
"author_id": 1,
"data": null,
"target_title": null,
"created_at": "2015-12-04T10:33:58.089Z",
"note": {
"id": 1312,
"body": "What an awesome day!",
"attachment": null,
"author": {
"name": "Dmitriy Zaporozhets",
"username": "root",
"id": 1,
"state": "active",
"avatar_url": "http://localhost:3000/uploads/user/avatar/1/fox_avatar.png",
"web_url": "http://localhost:3000/root"
},
"created_at": "2015-12-04T10:33:56.698Z",
"system": false,
"noteable_id": 377,
"noteable_type": "Issue",
"noteable_iid": 377
},
"author": {
"name": "Dmitriy Zaporozhets",
"username": "root",
"id": 1,
"state": "active",
"avatar_url": "http://localhost:3000/uploads/user/avatar/1/fox_avatar.png",
"web_url": "http://localhost:3000/root"
},
"author_username": "root"
} }
] ]
``` ```
......
...@@ -35,7 +35,8 @@ Parameters: ...@@ -35,7 +35,8 @@ Parameters:
"updated_at": "2013-10-02T10:22:45Z", "updated_at": "2013-10-02T10:22:45Z",
"system": true, "system": true,
"noteable_id": 377, "noteable_id": 377,
"noteable_type": "Issue" "noteable_type": "Issue",
"noteable_iid": 377
}, },
{ {
"id": 305, "id": 305,
...@@ -53,7 +54,8 @@ Parameters: ...@@ -53,7 +54,8 @@ Parameters:
"updated_at": "2013-10-02T09:56:03Z", "updated_at": "2013-10-02T09:56:03Z",
"system": true, "system": true,
"noteable_id": 121, "noteable_id": 121,
"noteable_type": "Issue" "noteable_type": "Issue",
"noteable_iid": 121
} }
] ]
``` ```
...@@ -267,7 +269,8 @@ Parameters: ...@@ -267,7 +269,8 @@ Parameters:
"updated_at": "2013-10-02T08:57:14Z", "updated_at": "2013-10-02T08:57:14Z",
"system": false, "system": false,
"noteable_id": 2, "noteable_id": 2,
"noteable_type": "MergeRequest" "noteable_type": "MergeRequest",
"noteable_iid": 2
} }
``` ```
......
...@@ -454,6 +454,9 @@ module API ...@@ -454,6 +454,9 @@ module API
end end
class Note < Grape::Entity class Note < Grape::Entity
# Only Issue and MergeRequest have iid
NOTEABLE_TYPES_WITH_IID = %w(Issue MergeRequest).freeze
expose :id expose :id
expose :note, as: :body expose :note, as: :body
expose :attachment_identifier, as: :attachment expose :attachment_identifier, as: :attachment
...@@ -461,6 +464,9 @@ module API ...@@ -461,6 +464,9 @@ module API
expose :created_at, :updated_at expose :created_at, :updated_at
expose :system?, as: :system expose :system?, as: :system
expose :noteable_id, :noteable_type expose :noteable_id, :noteable_type
# Avoid N+1 queries as much as possible
expose(:noteable_iid) { |note| note.noteable.iid if NOTEABLE_TYPES_WITH_IID.include?(note.noteable_type) }
end end
class AwardEmoji < Grape::Entity class AwardEmoji < Grape::Entity
......
...@@ -138,5 +138,40 @@ describe API::Events do ...@@ -138,5 +138,40 @@ describe API::Events do
expect(response).to have_http_status(404) expect(response).to have_http_status(404)
end end
end end
context 'when exists some events' do
before do
create_event(note1)
create_event(note2)
create_event(merge_request1)
end
let(:note1) { create(:note_on_merge_request, project: private_project, author: user) }
let(:note2) { create(:note_on_issue, project: private_project, author: user) }
let(:merge_request1) { create(:merge_request, state: 'closed', author: user, assignee: user, source_project: private_project, title: 'Test') }
let(:merge_request2) { create(:merge_request, state: 'closed', author: user, assignee: user, source_project: private_project, title: 'Test') }
it 'avoids N+1 queries' do
control_count = ActiveRecord::QueryRecorder.new do
get api("/projects/#{private_project.id}/events", user)
end.count
create_event(merge_request2)
expect do
get api("/projects/#{private_project.id}/events", user)
end.not_to exceed_query_limit(control_count)
expect(response).to have_http_status(200)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
expect(json_response[0]).to include('target_type' => 'MergeRequest', 'target_id' => merge_request2.id)
expect(json_response[1]).to include('target_type' => 'MergeRequest', 'target_id' => merge_request1.id)
end
def create_event(target)
create(:event, project: private_project, author: user, target: target)
end
end
end end
end end
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