diff options
| author | Ahmad Sherif <me@ahmadsherif.com> | 2016-05-12 22:48:09 +0200 |
|---|---|---|
| committer | Ahmad Sherif <me@ahmadsherif.com> | 2016-05-12 22:48:09 +0200 |
| commit | 0c22698bd4dbe7d0d3e4a6c8bc946ac6f5de1c12 (patch) | |
| tree | 775771cbe8f3c16dedebe1f27acadd464c96099e /lib/api/subscriptions.rb | |
| parent | 74c69709dc19dbaf56c226b5a7955f229af10f4f (diff) | |
| download | gitlab-ce-0c22698bd4dbe7d0d3e4a6c8bc946ac6f5de1c12.tar.gz | |
Add API endpoints for un/subscribing from/to a label
Closes #15638
Diffstat (limited to 'lib/api/subscriptions.rb')
| -rw-r--r-- | lib/api/subscriptions.rb | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/api/subscriptions.rb b/lib/api/subscriptions.rb new file mode 100644 index 00000000000..c49e2a21b82 --- /dev/null +++ b/lib/api/subscriptions.rb @@ -0,0 +1,60 @@ +module API + class Subscriptions < Grape::API + before { authenticate! } + + subscribable_types = { + 'merge_request' => proc { |id| user_project.merge_requests.find(id) }, + 'merge_requests' => proc { |id| user_project.merge_requests.find(id) }, + 'issues' => proc { |id| find_project_issue(id) }, + 'labels' => proc { |id| find_project_label(id) }, + } + + resource :projects do + subscribable_types.each do |type, finder| + type_singularized = type.singularize + type_id_str = :"#{type_singularized}_id" + entity_class = Entities.const_get(type_singularized.camelcase) + + # Subscribe to a resource + # + # Parameters: + # id (required) - The ID of a project + # subscribable_id (required) - The ID of a resource + # Example Request: + # POST /projects/:id/labels/:subscribable_id/subscription + # POST /projects/:id/issues/:subscribable_id/subscription + # POST /projects/:id/merge_requests/:subscribable_id/subscription + post ":id/#{type}/:#{type_id_str}/subscription" do + resource = instance_exec(params[type_id_str], &finder) + + if resource.subscribed?(current_user) + not_modified! + else + resource.subscribe(current_user) + present resource, with: entity_class, current_user: current_user + end + end + + # Unsubscribe from a resource + # + # Parameters: + # id (required) - The ID of a project + # subscribable_id (required) - The ID of a resource + # Example Request: + # DELETE /projects/:id/labels/:subscribable_id/subscription + # DELETE /projects/:id/issues/:subscribable_id/subscription + # DELETE /projects/:id/merge_requests/:subscribable_id/subscription + delete ":id/#{type}/:#{type_id_str}/subscription" do + resource = instance_exec(params[type_id_str], &finder) + + if !resource.subscribed?(current_user) + not_modified! + else + resource.unsubscribe(current_user) + present resource, with: entity_class, current_user: current_user + end + end + end + end + end +end |
