Commit f5240f97 authored by Rémy Coutable's avatar Rémy Coutable

Expose MergeRequest#user_notes_count in the API and use the method in issues list

Signed-off-by: default avatarRémy Coutable <remy@rymai.me>
parent 53644007
...@@ -25,6 +25,7 @@ v 8.8.0 (unreleased) ...@@ -25,6 +25,7 @@ v 8.8.0 (unreleased)
- Added button to toggle whitespaces changes on diff view - Added button to toggle whitespaces changes on diff view
- Backport GitHub Enterprise import support from EE - Backport GitHub Enterprise import support from EE
- Create tags using Rugged for performance reasons. !3745 - Create tags using Rugged for performance reasons. !3745
- API: Expose Issue#user_notes_count. !3126 (Anton Popov)
- Files over 5MB can only be viewed in their raw form, files over 1MB without highlighting !3718 - Files over 5MB can only be viewed in their raw form, files over 1MB without highlighting !3718
- Add support for supressing text diffs using .gitattributes on the default branch (Matt Oakes) - Add support for supressing text diffs using .gitattributes on the default branch (Matt Oakes)
- Added multiple colors for labels in dropdowns when dups happen. - Added multiple colors for labels in dropdowns when dups happen.
...@@ -51,9 +52,6 @@ v 8.7.2 ...@@ -51,9 +52,6 @@ v 8.7.2
- Label titles in filters are now escaped properly - Label titles in filters are now escaped properly
v 8.7.1 v 8.7.1
- API: Expose Issue#user_notes_count (Anton Popov)
v 8.7.1 (unreleased)
- Throttle the update of `project.last_activity_at` to 1 minute. !3848 - Throttle the update of `project.last_activity_at` to 1 minute. !3848
- Fix .gitlab-ci.yml parsing issue when hidde job is a template without script definition. !3849 - Fix .gitlab-ci.yml parsing issue when hidde job is a template without script definition. !3849
- Fix license detection to detect all license files, not only known licenses. !3878 - Fix license detection to detect all license files, not only known licenses. !3878
......
...@@ -28,16 +28,10 @@ ...@@ -28,16 +28,10 @@
= downvotes = downvotes
- note_count = issue.notes.user.nonawards.count - note_count = issue.notes.user.nonawards.count
- if note_count > 0 %li
%li = link_to issue_path(issue, anchor: 'notes'), class: ('issue-no-comments' if note_count.zero?) do
= link_to issue_path(issue) + "#notes" do = icon('comments')
= icon('comments') = note_count
= note_count
- else
%li
= link_to issue_path(issue) + "#notes", class: "issue-no-comments" do
= icon('comments')
= note_count
.issue-info .issue-info
#{issue.to_reference} &middot; #{issue.to_reference} &middot;
......
...@@ -36,16 +36,10 @@ ...@@ -36,16 +36,10 @@
= downvotes = downvotes
- note_count = merge_request.mr_and_commit_notes.user.nonawards.count - note_count = merge_request.mr_and_commit_notes.user.nonawards.count
- if note_count > 0 %li
%li = link_to merge_request_path(merge_request, anchor: 'notes'), class: ('merge-request-no-comments' if note_count.zero?) do
= link_to merge_request_path(merge_request) + "#notes" do = icon('comments')
= icon('comments') = note_count
= note_count
- else
%li
= link_to merge_request_path(merge_request) + "#notes", class: "merge-request-no-comments" do
= icon('comments')
= note_count
.merge-request-info .merge-request-info
#{merge_request.to_reference} &middot; #{merge_request.to_reference} &middot;
......
...@@ -67,7 +67,8 @@ Parameters: ...@@ -67,7 +67,8 @@ Parameters:
}, },
"merge_when_build_succeeds": true, "merge_when_build_succeeds": true,
"merge_status": "can_be_merged", "merge_status": "can_be_merged",
"subscribed" : false "subscribed" : false,
"user_notes_count": 1
} }
] ]
``` ```
...@@ -130,7 +131,8 @@ Parameters: ...@@ -130,7 +131,8 @@ Parameters:
}, },
"merge_when_build_succeeds": true, "merge_when_build_succeeds": true,
"merge_status": "can_be_merged", "merge_status": "can_be_merged",
"subscribed" : true "subscribed" : true,
"user_notes_count": 1
} }
``` ```
...@@ -230,6 +232,7 @@ Parameters: ...@@ -230,6 +232,7 @@ Parameters:
"merge_when_build_succeeds": true, "merge_when_build_succeeds": true,
"merge_status": "can_be_merged", "merge_status": "can_be_merged",
"subscribed" : true, "subscribed" : true,
"user_notes_count": 1,
"changes": [ "changes": [
{ {
"old_path": "VERSION", "old_path": "VERSION",
...@@ -308,7 +311,8 @@ Parameters: ...@@ -308,7 +311,8 @@ Parameters:
}, },
"merge_when_build_succeeds": true, "merge_when_build_succeeds": true,
"merge_status": "can_be_merged", "merge_status": "can_be_merged",
"subscribed" : true "subscribed" : true,
"user_notes_count": 0
} }
``` ```
...@@ -378,7 +382,8 @@ Parameters: ...@@ -378,7 +382,8 @@ Parameters:
}, },
"merge_when_build_succeeds": true, "merge_when_build_succeeds": true,
"merge_status": "can_be_merged", "merge_status": "can_be_merged",
"subscribed" : true "subscribed" : true,
"user_notes_count": 1
} }
``` ```
...@@ -472,7 +477,8 @@ Parameters: ...@@ -472,7 +477,8 @@ Parameters:
}, },
"merge_when_build_succeeds": true, "merge_when_build_succeeds": true,
"merge_status": "can_be_merged", "merge_status": "can_be_merged",
"subscribed" : true "subscribed" : true,
"user_notes_count": 1
} }
``` ```
...@@ -537,7 +543,8 @@ Parameters: ...@@ -537,7 +543,8 @@ Parameters:
}, },
"merge_when_build_succeeds": true, "merge_when_build_succeeds": true,
"merge_status": "can_be_merged", "merge_status": "can_be_merged",
"subscribed" : true "subscribed" : true,
"user_notes_count": 1
} }
``` ```
...@@ -602,7 +609,8 @@ Example response: ...@@ -602,7 +609,8 @@ Example response:
"title" : "Consequatur vero maxime deserunt laboriosam est voluptas dolorem.", "title" : "Consequatur vero maxime deserunt laboriosam est voluptas dolorem.",
"created_at" : "2016-01-04T15:31:51.081Z", "created_at" : "2016-01-04T15:31:51.081Z",
"iid" : 6, "iid" : 6,
"labels" : [] "labels" : [],
"user_notes_count": 1
}, },
] ]
``` ```
......
...@@ -187,10 +187,10 @@ module API ...@@ -187,10 +187,10 @@ module API
expose :milestone, using: Entities::Milestone expose :milestone, using: Entities::Milestone
expose :merge_when_build_succeeds expose :merge_when_build_succeeds
expose :merge_status expose :merge_status
expose :subscribed do |merge_request, options| expose :subscribed do |merge_request, options|
merge_request.subscribed?(options[:current_user]) merge_request.subscribed?(options[:current_user])
end end
expose :user_notes_count
end end
class MergeRequestChanges < MergeRequest class MergeRequestChanges < MergeRequest
......
...@@ -39,7 +39,7 @@ describe API::API, api: true do ...@@ -39,7 +39,7 @@ describe API::API, api: true do
let!(:empty_milestone) do let!(:empty_milestone) do
create(:milestone, title: '2.0.0', project: project) create(:milestone, title: '2.0.0', project: project)
end end
let!(:issue_note) { create(:note, noteable: issue, project: project, author: user) } let!(:note) { create(:note_on_issue, author: user, project: project, noteable: issue) }
before { project.team << [user, :reporter] } before { project.team << [user, :reporter] }
...@@ -129,13 +129,6 @@ describe API::API, api: true do ...@@ -129,13 +129,6 @@ describe API::API, api: true do
expect(json_response).to be_an Array expect(json_response).to be_an Array
expect(json_response.length).to eq(0) expect(json_response.length).to eq(0)
end end
it 'should return an count notes in issue' do
get api("/issues", user)
expect(response.status).to eq(200)
expect(json_response).to be_an Array
expect(json_response.first['user_notes_count']).to eq(1)
end
end end
end end
...@@ -237,18 +230,31 @@ describe API::API, api: true do ...@@ -237,18 +230,31 @@ describe API::API, api: true do
expect(json_response.length).to eq(1) expect(json_response.length).to eq(1)
expect(json_response.first['id']).to eq(closed_issue.id) expect(json_response.first['id']).to eq(closed_issue.id)
end end
end
describe "GET /projects/:id/issues/:issue_id" do
it 'exposes known attributes' do
get api("/projects/#{project.id}/issues/#{issue.id}", user)
it 'should return an count notes in issue' do
get api("#{base_url}/issues", user)
expect(response.status).to eq(200) expect(response.status).to eq(200)
expect(json_response).to be_an Array expect(json_response['id']).to eq(issue.id)
expect(json_response.first['user_notes_count']).to eq(1) expect(json_response['iid']).to eq(issue.iid)
expect(json_response['project_id']).to eq(issue.project.id)
expect(json_response['title']).to eq(issue.title)
expect(json_response['description']).to eq(issue.description)
expect(json_response['state']).to eq(issue.state)
expect(json_response['created_at']).to be_present
expect(json_response['updated_at']).to be_present
expect(json_response['labels']).to eq(issue.label_names)
expect(json_response['milestone']).to be_a Hash
expect(json_response['assignee']).to be_a Hash
expect(json_response['author']).to be_a Hash
expect(json_response['user_notes_count']).to be(1)
end end
end
describe "GET /projects/:id/issues/:issue_id" do
it "should return a project issue by id" do it "should return a project issue by id" do
get api("/projects/#{project.id}/issues/#{issue.id}", user) get api("/projects/#{project.id}/issues/#{issue.id}", user)
expect(response.status).to eq(200) expect(response.status).to eq(200)
expect(json_response['title']).to eq(issue.title) expect(json_response['title']).to eq(issue.title)
expect(json_response['iid']).to eq(issue.iid) expect(json_response['iid']).to eq(issue.iid)
......
...@@ -113,6 +113,34 @@ describe API::API, api: true do ...@@ -113,6 +113,34 @@ describe API::API, api: true do
end end
describe "GET /projects/:id/merge_requests/:merge_request_id" do describe "GET /projects/:id/merge_requests/:merge_request_id" do
it 'exposes known attributes' do
get api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user)
expect(response.status).to eq(200)
expect(json_response['id']).to eq(merge_request.id)
expect(json_response['iid']).to eq(merge_request.iid)
expect(json_response['project_id']).to eq(merge_request.project.id)
expect(json_response['title']).to eq(merge_request.title)
expect(json_response['description']).to eq(merge_request.description)
expect(json_response['state']).to eq(merge_request.state)
expect(json_response['created_at']).to be_present
expect(json_response['updated_at']).to be_present
expect(json_response['labels']).to eq(merge_request.label_names)
expect(json_response['milestone']).to be_nil
expect(json_response['assignee']).to be_a Hash
expect(json_response['author']).to be_a Hash
expect(json_response['target_branch']).to eq(merge_request.target_branch)
expect(json_response['source_branch']).to eq(merge_request.source_branch)
expect(json_response['upvotes']).to eq(0)
expect(json_response['downvotes']).to eq(0)
expect(json_response['source_project_id']).to eq(merge_request.source_project.id)
expect(json_response['target_project_id']).to eq(merge_request.target_project.id)
expect(json_response['work_in_progress']).to be_falsy
expect(json_response['merge_when_build_succeeds']).to be_falsy
expect(json_response['merge_status']).to eq('can_be_merged')
expect(json_response['user_notes_count']).to be(2)
end
it "should return merge_request" do it "should return merge_request" do
get api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user) get api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user)
expect(response.status).to eq(200) expect(response.status).to eq(200)
......
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