Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRémy Coutable <remy@rymai.me>2016-07-01 18:36:05 +0300
committerRémy Coutable <remy@rymai.me>2016-07-01 18:36:05 +0300
commit557ca2b31ff503b36a4b65af2641fcd0f5682d5b (patch)
treeb285eeba2b013e0c3b3046bc718e55efc38a2566 /lib
parentc368cb605bfb586cf93cff3879212906812f327b (diff)
parent87ac9c9850d602fd18654498ab3fa005d2b85ac7 (diff)
Merge branch 'todos-api' into 'master'
Add Todos API * Closes #14068 * Closes #14675 - [x] Implementation - [x] Tests - [x] Documentation - [x] Changelog See merge request !3188
Diffstat (limited to 'lib')
-rw-r--r--lib/api/api.rb1
-rw-r--r--lib/api/entities.rb25
-rw-r--r--lib/api/todos.rb82
3 files changed, 108 insertions, 0 deletions
diff --git a/lib/api/api.rb b/lib/api/api.rb
index c3fff8b2f8f..3d7d67510a8 100644
--- a/lib/api/api.rb
+++ b/lib/api/api.rb
@@ -58,6 +58,7 @@ module API
mount ::API::SystemHooks
mount ::API::Tags
mount ::API::Templates
+ mount ::API::Todos
mount ::API::Triggers
mount ::API::Users
mount ::API::Variables
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 4e2a43e45e2..8cc4368b5c2 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -272,6 +272,31 @@ module API
expose :id, :project_id, :group_id, :group_access
end
+ class Todo < Grape::Entity
+ expose :id
+ expose :project, using: Entities::BasicProjectDetails
+ expose :author, using: Entities::UserBasic
+ expose :action_name
+ expose :target_type
+
+ expose :target do |todo, options|
+ Entities.const_get(todo.target_type).represent(todo.target, options)
+ end
+
+ expose :target_url do |todo, options|
+ target_type = todo.target_type.underscore
+ target_url = "namespace_project_#{target_type}_url"
+ target_anchor = "note_#{todo.note_id}" if todo.note_id?
+
+ Gitlab::Application.routes.url_helpers.public_send(target_url,
+ todo.project.namespace, todo.project, todo.target, anchor: target_anchor)
+ end
+
+ expose :body
+ expose :state
+ expose :created_at
+ end
+
class Namespace < Grape::Entity
expose :id, :path, :kind
end
diff --git a/lib/api/todos.rb b/lib/api/todos.rb
new file mode 100644
index 00000000000..2a6bfa98ca4
--- /dev/null
+++ b/lib/api/todos.rb
@@ -0,0 +1,82 @@
+module API
+ # Todos API
+ class Todos < Grape::API
+ before { authenticate! }
+
+ ISSUABLE_TYPES = {
+ 'merge_requests' => ->(id) { user_project.merge_requests.find(id) },
+ 'issues' => ->(id) { find_project_issue(id) }
+ }
+
+ resource :projects do
+ ISSUABLE_TYPES.each do |type, finder|
+ type_id_str = "#{type.singularize}_id".to_sym
+
+ # Create a todo on an issuable
+ #
+ # Parameters:
+ # id (required) - The ID of a project
+ # issuable_id (required) - The ID of an issuable
+ # Example Request:
+ # POST /projects/:id/issues/:issuable_id/todo
+ # POST /projects/:id/merge_requests/:issuable_id/todo
+ post ":id/#{type}/:#{type_id_str}/todo" do
+ issuable = instance_exec(params[type_id_str], &finder)
+ todo = TodoService.new.mark_todo(issuable, current_user).first
+
+ if todo
+ present todo, with: Entities::Todo, current_user: current_user
+ else
+ not_modified!
+ end
+ end
+ end
+ end
+
+ resource :todos do
+ helpers do
+ def find_todos
+ TodosFinder.new(current_user, params).execute
+ end
+ end
+
+ # Get a todo list
+ #
+ # Example Request:
+ # GET /todos
+ #
+ get do
+ todos = find_todos
+
+ present paginate(todos), with: Entities::Todo, current_user: current_user
+ end
+
+ # Mark a todo as done
+ #
+ # Parameters:
+ # id: (required) - The ID of the todo being marked as done
+ #
+ # Example Request:
+ # DELETE /todos/:id
+ #
+ delete ':id' do
+ todo = current_user.todos.find(params[:id])
+ todo.done
+
+ present todo, with: Entities::Todo, current_user: current_user
+ end
+
+ # Mark all todos as done
+ #
+ # Example Request:
+ # DELETE /todos
+ #
+ delete do
+ todos = find_todos
+ todos.each(&:done)
+
+ present paginate(Kaminari.paginate_array(todos)), with: Entities::Todo, current_user: current_user
+ end
+ end
+ end
+end