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) =
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