todos.rb 2.0 KB
Newer Older
D
Douglas Barbosa Alexandre 已提交
1 2 3 4 5
module API
  # Todos API
  class Todos < Grape::API
    before { authenticate! }

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
    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

D
Douglas Barbosa Alexandre 已提交
36 37 38 39 40 41 42 43 44 45 46
    resource :todos do
      helpers do
        def find_todos
          TodosFinder.new(current_user, params).execute
        end
      end

      # Get a todo list
      #
      # Example Request:
      #  GET /todos
47
      #
D
Douglas Barbosa Alexandre 已提交
48
      get do
49
        todos = find_todos
D
Douglas Barbosa Alexandre 已提交
50

51
        present paginate(todos), with: Entities::Todo, current_user: current_user
D
Douglas Barbosa Alexandre 已提交
52 53
      end

54
      # Mark a todo as done
D
Douglas Barbosa Alexandre 已提交
55 56 57 58 59 60 61 62
      #
      # Parameters:
      #   id: (required) - The ID of the todo being marked as done
      #
      # Example Request:
      #  DELETE /todos/:id
      #
      delete ':id' do
63 64
        todo = current_user.todos.find(params[:id])
        todo.done
D
Douglas Barbosa Alexandre 已提交
65

66
        present todo, with: Entities::Todo, current_user: current_user
D
Douglas Barbosa Alexandre 已提交
67 68 69 70 71 72 73 74
      end

      # Mark all todos as done
      #
      # Example Request:
      #  DELETE /todos
      #
      delete do
75 76
        todos = find_todos
        todos.each(&:done)
D
Douglas Barbosa Alexandre 已提交
77

78
        todos.length
D
Douglas Barbosa Alexandre 已提交
79 80 81 82
      end
    end
  end
end