summaryrefslogtreecommitdiff
path: root/lib/api/todos.rb
blob: 2a6bfa98ca4c666c002dcf12fd2fecfbd4252f58 (plain)
1
2
3
4
5
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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