Skip to content

Commit

Permalink
Expose noteable_iid in Note
Browse files Browse the repository at this point in the history
  • Loading branch information
sue445 authored and rymai committed Aug 8, 2017
1 parent 6f55599 commit 7bc0486
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 3 deletions.
4 changes: 4 additions & 0 deletions changelogs/unreleased/13265-project_events_noteable_iid.yml
@@ -0,0 +1,4 @@
---
title: Expose noteable_iid in Note
merge_request: 13265
author: sue445
39 changes: 39 additions & 0 deletions doc/api/events.md
Expand Up @@ -338,6 +338,45 @@ Example response:
"web_url":"https://gitlab.example.com/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"
}
]
```
Expand Down
9 changes: 6 additions & 3 deletions doc/api/notes.md
Expand Up @@ -35,7 +35,8 @@ Parameters:
"updated_at": "2013-10-02T10:22:45Z",
"system": true,
"noteable_id": 377,
"noteable_type": "Issue"
"noteable_type": "Issue",
"noteable_iid": 377
},
{
"id": 305,
Expand All @@ -53,7 +54,8 @@ Parameters:
"updated_at": "2013-10-02T09:56:03Z",
"system": true,
"noteable_id": 121,
"noteable_type": "Issue"
"noteable_type": "Issue",
"noteable_iid": 121
}
]
```
Expand Down Expand Up @@ -267,7 +269,8 @@ Parameters:
"updated_at": "2013-10-02T08:57:14Z",
"system": false,
"noteable_id": 2,
"noteable_type": "MergeRequest"
"noteable_type": "MergeRequest",
"noteable_iid": 2
}
```

Expand Down
6 changes: 6 additions & 0 deletions lib/api/entities.rb
Expand Up @@ -454,13 +454,19 @@ class SSHKeyWithUser < SSHKey
end

class Note < Grape::Entity
# Only Issue and MergeRequest have iid
NOTEABLE_TYPES_WITH_IID = %w(Issue MergeRequest).freeze

expose :id
expose :note, as: :body
expose :attachment_identifier, as: :attachment
expose :author, using: Entities::UserBasic
expose :created_at, :updated_at
expose :system?, as: :system
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

class AwardEmoji < Grape::Entity
Expand Down
35 changes: 35 additions & 0 deletions spec/requests/api/events_spec.rb
Expand Up @@ -138,5 +138,40 @@
expect(response).to have_http_status(404)
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

0 comments on commit 7bc0486

Please sign in to comment.