package otoggl

  1. Overview
  2. Docs

Source file api.ml

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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
open Types

module F (Client : module type of Piaf.Client) = struct
  let create_client ?config () =
    Client.create ?config @@ Uri.of_string "https://api.track.toggl.com"

  module TimeEntry = struct
    open Lwt_result

    let create t (client : Client.t) =
      let body =
        {time_entry= t} |> string_of_wrapped_time_entry |> Piaf.Body.of_string
      in
      Client.post client ~body "/api/v8/time_entries"
      >>= Util.status_200_or_error
      >|= data_time_entry_of_string
      >|= fun x -> x.data

    let start t (client : Client.t) =
      let body =
        {time_entry= t} |> string_of_wrapped_time_entry |> Piaf.Body.of_string
      in
      Client.post client ~body "/api/v8/time_entries/start"
      >>= Util.status_200_or_error
      >|= data_time_entry_of_string
      >|= fun x -> x.data

    let stop (tid : tid) (client : Client.t) =
      let body = Piaf.Body.empty in
      "/api/v8/time_entries/" ^ string_of_int tid ^ "/stop"
      |> Client.put client ~body
      >>= Util.status_200_or_error
      >|= data_time_entry_of_string
      >|= fun x -> x.data

    let current (client : Client.t) =
      Client.get client "/api/v8/time_entries/current"
      >>= Util.status_200_or_error
      >|= data_time_entry_of_string
      >|= fun x -> x.data

    let details (tid : tid) (client : Client.t) =
      "/api/v8/time_entries/" ^ string_of_int tid
      |> Client.get client
      >>= Util.status_200_or_error
      >|= data_time_entry_of_string
      >|= fun x -> x.data

    let delete (tid : tid) (client : Client.t) =
      "/api/v8/time_entries/" ^ string_of_int tid
      |> Client.delete client
      >>= Util.status_200_or_error
      >|= tid_list_of_string

    let list ?start_date ?end_date (client : Client.t) =
      (* We will use timestamps set on UTC *)
      let tz_offset_s = 0 in
      let query = [] in
      let query =
        match end_date with
        | None ->
          query
        | Some date ->
          ("end_date", [Ptime.to_rfc3339 ~tz_offset_s date]) :: query
      in
      let query =
        match start_date with
        | None ->
          query
        | Some date ->
          ("start_date", [Ptime.to_rfc3339 ~tz_offset_s date]) :: query
      in
      Uri.make ~path:"/api/v8/time_entries" ~query ()
      |> Uri.to_string
      |> Client.get client
      >>= Util.status_200_or_error
      >|= time_entry_list_of_string

    let update
        tid
        ?description
        ?start
        ?stop
        ?duration
        ?tags
        ?project
        ?workspace
        ?duronly
        ?billable
        (client : Client.t)
      =
      let time_entry =
        CCOption.(
          Types.create_time_entry_update_request ?description ?start ?stop
            ?duration ?tags
            ?pid:(project >|= function None -> None | Some p -> Some p.id)
            ?wid:(workspace >|= fun w -> w.id)
            ?duronly ?billable ())
      in
      let body =
        create_wrapped_time_entry_update_request ~time_entry ()
        |> string_of_wrapped_time_entry_update_request
        |> Piaf.Body.of_string
      in
      Client.put client ~body @@ "/api/v8/time_entries/" ^ string_of_int tid
      >>= Util.status_200_or_error
      >|= data_time_entry_of_string
      >|= fun x -> x.data
  end

  module Workspace = struct
    let list (client : Client.t) =
      let open Lwt_result in
      Client.get client "/api/v8/workspaces"
      >>= Util.status_200_or_error
      >|= workspace_list_of_string
  end

  module Project = struct
    open Lwt_result

    let list wid (client : Client.t) =
      let open Lwt_result in
      "/api/v8/workspaces/" ^ string_of_int wid ^ "/projects"
      |> Client.get client
      >>= Util.status_200_or_error
      >|= project_list_of_string

    let create t (client : Client.t) =
      let body =
        {project= t} |> string_of_wrapped_project_request |> Piaf.Body.of_string
      in
      Client.post client ~body "/api/v8/projects"
      >>= Util.status_200_or_error
      >|= data_project_of_string
      >|= fun x -> x.data

    let delete pid (client : Client.t) =
      "/api/v8/projects/" ^ string_of_int pid
      |> Client.delete client
      >>= Util.status_200_or_error
      >|= pid_list_of_string
  end
end
OCaml

Innovation. Community. Security.