Add subscription API for the group label API
This commit is contained in:
parent
f66fec1d41
commit
eed79986c9
|
@ -1019,12 +1019,12 @@ module API
|
||||||
label.open_merge_requests_count(options[:current_user])
|
label.open_merge_requests_count(options[:current_user])
|
||||||
end
|
end
|
||||||
|
|
||||||
expose :priority do |label, options|
|
expose :priority, if: lambda { |_, options| options[:project].is_a?(::Project) } do |label, options|
|
||||||
label.priority(options[:project])
|
label.priority(options[:project])
|
||||||
end
|
end
|
||||||
|
|
||||||
expose :subscribed do |label, options|
|
expose :subscribed do |label, options|
|
||||||
label.subscribed?(options[:current_user], options[:parent])
|
label.subscribed?(options[:current_user], options[:project])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -170,8 +170,8 @@ module API
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def find_project_label(id)
|
def find_label(parent, id)
|
||||||
labels = available_labels_for(user_project)
|
labels = available_labels_for(parent)
|
||||||
label = labels.find_by_id(id) || labels.find_by_title(id)
|
label = labels.find_by_id(id) || labels.find_by_title(id)
|
||||||
|
|
||||||
label || not_found!('Label')
|
label || not_found!('Label')
|
||||||
|
|
|
@ -4,11 +4,12 @@ module API
|
||||||
class Subscriptions < Grape::API
|
class Subscriptions < Grape::API
|
||||||
before { authenticate! }
|
before { authenticate! }
|
||||||
|
|
||||||
subscribable_types = {
|
subscribables = [
|
||||||
'merge_requests' => proc { |id| find_merge_request_with_access(id, :update_merge_request) },
|
['merge_requests', Project, proc { |id| find_merge_request_with_access(id, :update_merge_request) }, proc { user_project }],
|
||||||
'issues' => proc { |id| find_project_issue(id) },
|
['issues', Project, proc { |id| find_project_issue(id) }, proc { user_project }],
|
||||||
'labels' => proc { |id| find_project_label(id) }
|
['labels', Project, proc { |id| find_label(user_project, id) }, proc { user_project }],
|
||||||
}
|
['labels', Group, proc { |id| find_label(user_group, id) }, proc { nil }]
|
||||||
|
]
|
||||||
|
|
||||||
params do
|
params do
|
||||||
requires :id, type: String, desc: 'The ID of a project'
|
requires :id, type: String, desc: 'The ID of a project'
|
||||||
|
@ -19,17 +20,27 @@ module API
|
||||||
type_singularized = type.singularize
|
type_singularized = type.singularize
|
||||||
entity_class = Entities.const_get(type_singularized.camelcase)
|
entity_class = Entities.const_get(type_singularized.camelcase)
|
||||||
|
|
||||||
|
subscribables.each do |subscribable|
|
||||||
|
source_type = subscribable[:source].name.underscore
|
||||||
|
entity_class = Entities.const_get(subscribable[:type].singularize.camelcase)
|
||||||
|
|
||||||
|
params do
|
||||||
|
requires :id, type: String, desc: "The #{source_type} ID"
|
||||||
|
requires :subscribable_id, type: String, desc: 'The ID of a resource'
|
||||||
|
end
|
||||||
|
resource source_type.pluralize, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
|
||||||
desc 'Subscribe to a resource' do
|
desc 'Subscribe to a resource' do
|
||||||
success entity_class
|
success entity_class
|
||||||
end
|
end
|
||||||
post ":id/#{type}/:subscribable_id/subscribe" do
|
post ":id/#{type}/:subscribable_id/subscribe" do
|
||||||
|
parent = instance_exec(&parent_ressource)
|
||||||
resource = instance_exec(params[:subscribable_id], &finder)
|
resource = instance_exec(params[:subscribable_id], &finder)
|
||||||
|
|
||||||
if resource.subscribed?(current_user, user_project)
|
if resource.subscribed?(current_user, parent)
|
||||||
not_modified!
|
not_modified!
|
||||||
else
|
else
|
||||||
resource.subscribe(current_user, user_project)
|
resource.subscribe(current_user, parent)
|
||||||
present resource, with: entity_class, current_user: current_user, project: user_project
|
present resource, with: entity_class, current_user: current_user, project: parent
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -37,13 +48,15 @@ module API
|
||||||
success entity_class
|
success entity_class
|
||||||
end
|
end
|
||||||
post ":id/#{type}/:subscribable_id/unsubscribe" do
|
post ":id/#{type}/:subscribable_id/unsubscribe" do
|
||||||
|
parent = instance_exec(&parent_ressource)
|
||||||
resource = instance_exec(params[:subscribable_id], &finder)
|
resource = instance_exec(params[:subscribable_id], &finder)
|
||||||
|
|
||||||
if !resource.subscribed?(current_user, user_project)
|
|
||||||
|
if !resource.subscribed?(current_user, parent)
|
||||||
not_modified!
|
not_modified!
|
||||||
else
|
else
|
||||||
resource.unsubscribe(current_user, user_project)
|
resource.unsubscribe(current_user, parent)
|
||||||
present resource, with: entity_class, current_user: current_user, project: user_project
|
present resource, with: entity_class, current_user: current_user, project: parent
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -209,4 +209,92 @@ describe API::GroupLabels do
|
||||||
expect(json_response['message']['color']).to eq(['must be a valid color code'])
|
expect(json_response['message']['color']).to eq(['must be a valid color code'])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
describe 'POST /groups/:id/labels/:label_id/subscribe' do
|
||||||
|
context 'when label_id is a label title' do
|
||||||
|
it 'subscribes to the label' do
|
||||||
|
post api("/groups/#{group.id}/labels/#{label1.title}/subscribe", user)
|
||||||
|
|
||||||
|
expect(response).to have_gitlab_http_status(201)
|
||||||
|
expect(json_response['name']).to eq(label1.title)
|
||||||
|
expect(json_response['subscribed']).to be_truthy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when label_id is a label ID' do
|
||||||
|
it 'subscribes to the label' do
|
||||||
|
post api("/groups/#{group.id}/labels/#{label1.id}/subscribe", user)
|
||||||
|
|
||||||
|
expect(response).to have_gitlab_http_status(201)
|
||||||
|
expect(json_response['name']).to eq(label1.title)
|
||||||
|
expect(json_response['subscribed']).to be_truthy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when user is already subscribed to label' do
|
||||||
|
before do
|
||||||
|
label1.subscribe(user)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns 304' do
|
||||||
|
post api("/groups/#{group.id}/labels/#{label1.id}/subscribe", user)
|
||||||
|
|
||||||
|
expect(response).to have_gitlab_http_status(304)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when label ID is not found' do
|
||||||
|
it 'returns 404 error' do
|
||||||
|
post api("/groups/#{group.id}/labels/1234/subscribe", user)
|
||||||
|
|
||||||
|
expect(response).to have_gitlab_http_status(404)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'POST /groups/:id/labels/:label_id/unsubscribe' do
|
||||||
|
before do
|
||||||
|
label1.subscribe(user)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when label_id is a label title' do
|
||||||
|
it 'unsubscribes from the label' do
|
||||||
|
post api("/groups/#{group.id}/labels/#{label1.title}/unsubscribe", user)
|
||||||
|
|
||||||
|
expect(response).to have_gitlab_http_status(201)
|
||||||
|
expect(json_response['name']).to eq(label1.title)
|
||||||
|
expect(json_response['subscribed']).to be_falsey
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when label_id is a label ID' do
|
||||||
|
it 'unsubscribes from the label' do
|
||||||
|
post api("/groups/#{group.id}/labels/#{label1.id}/unsubscribe", user)
|
||||||
|
|
||||||
|
expect(response).to have_gitlab_http_status(201)
|
||||||
|
expect(json_response['name']).to eq(label1.title)
|
||||||
|
expect(json_response['subscribed']).to be_falsey
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when user is already unsubscribed from label' do
|
||||||
|
before do
|
||||||
|
label1.unsubscribe(user)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns 304' do
|
||||||
|
post api("/groups/#{group.id}/labels/#{label1.id}/unsubscribe", user)
|
||||||
|
|
||||||
|
expect(response).to have_gitlab_http_status(304)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when label ID is not found' do
|
||||||
|
it 'returns 404 error' do
|
||||||
|
post api("/groups/#{group.id}/labels/1234/unsubscribe", user)
|
||||||
|
|
||||||
|
expect(response).to have_gitlab_http_status(404)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in New Issue