diff --git a/coverage/coverage.out b/coverage/coverage.out index 5dc7fb8..725f6b8 100644 --- a/coverage/coverage.out +++ b/coverage/coverage.out @@ -184,6 +184,94 @@ github.com/muety/wakapi/config/sentry.go:151.2,151.11 1 0 github.com/muety/wakapi/config/session.go:9.46,10.25 1 0 github.com/muety/wakapi/config/session.go:10.25,12.3 1 0 github.com/muety/wakapi/config/session.go:13.2,13.21 1 0 +github.com/muety/wakapi/helpers/date.go:17.73,18.58 1 0 +github.com/muety/wakapi/helpers/date.go:18.58,20.3 1 0 +github.com/muety/wakapi/helpers/date.go:21.2,21.87 1 0 +github.com/muety/wakapi/helpers/date.go:21.87,23.3 1 0 +github.com/muety/wakapi/helpers/date.go:24.2,24.64 1 0 +github.com/muety/wakapi/helpers/date.go:27.40,29.2 1 0 +github.com/muety/wakapi/helpers/date.go:31.44,33.2 1 0 +github.com/muety/wakapi/helpers/date.go:35.49,37.2 1 0 +github.com/muety/wakapi/helpers/date.go:39.45,41.2 1 0 +github.com/muety/wakapi/helpers/date.go:43.50,49.2 5 0 +github.com/muety/wakapi/helpers/http.go:11.94,13.16 2 0 +github.com/muety/wakapi/helpers/http.go:13.16,15.3 1 0 +github.com/muety/wakapi/helpers/http.go:17.2,17.107 1 0 +github.com/muety/wakapi/helpers/http.go:17.107,19.3 1 0 +github.com/muety/wakapi/helpers/http.go:21.2,21.22 1 0 +github.com/muety/wakapi/helpers/http.go:24.90,27.58 3 0 +github.com/muety/wakapi/helpers/http.go:27.58,29.3 1 0 +github.com/muety/wakapi/helpers/interval.go:10.66,11.40 1 0 +github.com/muety/wakapi/helpers/interval.go:11.40,12.27 1 0 +github.com/muety/wakapi/helpers/interval.go:12.27,14.4 1 0 +github.com/muety/wakapi/helpers/interval.go:16.2,16.48 1 0 +github.com/muety/wakapi/helpers/interval.go:19.61,22.2 2 0 +github.com/muety/wakapi/helpers/interval.go:24.88,27.2 2 0 +github.com/muety/wakapi/helpers/interval.go:29.95,31.16 2 0 +github.com/muety/wakapi/helpers/interval.go:31.16,33.3 1 0 +github.com/muety/wakapi/helpers/interval.go:34.2,34.38 1 0 +github.com/muety/wakapi/helpers/interval.go:37.105,41.18 3 1 +github.com/muety/wakapi/helpers/interval.go:42.28,43.32 1 0 +github.com/muety/wakapi/helpers/interval.go:44.32,46.30 2 0 +github.com/muety/wakapi/helpers/interval.go:47.30,48.34 1 1 +github.com/muety/wakapi/helpers/interval.go:49.31,50.35 1 0 +github.com/muety/wakapi/helpers/interval.go:51.31,53.33 2 0 +github.com/muety/wakapi/helpers/interval.go:54.32,55.36 1 0 +github.com/muety/wakapi/helpers/interval.go:56.32,58.34 2 0 +github.com/muety/wakapi/helpers/interval.go:59.31,60.35 1 0 +github.com/muety/wakapi/helpers/interval.go:61.32,62.31 1 1 +github.com/muety/wakapi/helpers/interval.go:63.41,65.48 2 0 +github.com/muety/wakapi/helpers/interval.go:66.33,67.32 1 1 +github.com/muety/wakapi/helpers/interval.go:68.33,69.32 1 1 +github.com/muety/wakapi/helpers/interval.go:70.34,71.31 1 1 +github.com/muety/wakapi/helpers/interval.go:72.35,73.32 1 1 +github.com/muety/wakapi/helpers/interval.go:74.26,75.21 1 0 +github.com/muety/wakapi/helpers/interval.go:76.10,77.39 1 0 +github.com/muety/wakapi/helpers/interval.go:80.2,80.22 1 1 +github.com/muety/wakapi/helpers/interval.go:84.65,85.15 1 1 +github.com/muety/wakapi/helpers/interval.go:85.15,87.3 1 1 +github.com/muety/wakapi/helpers/interval.go:88.2,88.14 1 1 +github.com/muety/wakapi/helpers/interval.go:88.14,90.3 1 1 +github.com/muety/wakapi/helpers/interval.go:91.2,91.14 1 1 +github.com/muety/wakapi/helpers/interval.go:91.14,93.3 1 1 +github.com/muety/wakapi/helpers/interval.go:94.2,94.15 1 1 +github.com/muety/wakapi/helpers/interval.go:94.15,96.3 1 1 +github.com/muety/wakapi/helpers/interval.go:97.2,97.15 1 1 +github.com/muety/wakapi/helpers/interval.go:97.15,99.3 1 1 +github.com/muety/wakapi/helpers/interval.go:100.2,100.16 1 1 +github.com/muety/wakapi/helpers/interval.go:100.16,102.3 1 1 +github.com/muety/wakapi/helpers/interval.go:103.2,103.16 1 1 +github.com/muety/wakapi/helpers/interval.go:103.16,105.3 1 1 +github.com/muety/wakapi/helpers/interval.go:106.2,106.41 1 1 +github.com/muety/wakapi/helpers/summary.go:10.73,17.56 5 0 +github.com/muety/wakapi/helpers/summary.go:17.56,19.3 1 0 +github.com/muety/wakapi/helpers/summary.go:19.8,19.54 1 0 +github.com/muety/wakapi/helpers/summary.go:19.54,21.3 1 0 +github.com/muety/wakapi/helpers/summary.go:21.8,23.17 2 0 +github.com/muety/wakapi/helpers/summary.go:23.17,25.4 1 0 +github.com/muety/wakapi/helpers/summary.go:27.3,28.17 2 0 +github.com/muety/wakapi/helpers/summary.go:28.17,30.4 1 0 +github.com/muety/wakapi/helpers/summary.go:33.2,43.8 3 0 +github.com/muety/wakapi/helpers/summary.go:46.59,48.48 2 0 +github.com/muety/wakapi/helpers/summary.go:48.48,50.3 1 0 +github.com/muety/wakapi/helpers/summary.go:51.2,51.49 1 0 +github.com/muety/wakapi/helpers/summary.go:51.49,53.3 1 0 +github.com/muety/wakapi/helpers/summary.go:54.2,54.47 1 0 +github.com/muety/wakapi/helpers/summary.go:54.47,56.3 1 0 +github.com/muety/wakapi/helpers/summary.go:57.2,57.48 1 0 +github.com/muety/wakapi/helpers/summary.go:57.48,59.3 1 0 +github.com/muety/wakapi/helpers/summary.go:60.2,60.57 1 0 +github.com/muety/wakapi/helpers/summary.go:60.57,62.3 1 0 +github.com/muety/wakapi/helpers/summary.go:63.2,63.46 1 0 +github.com/muety/wakapi/helpers/summary.go:63.46,65.3 1 0 +github.com/muety/wakapi/helpers/summary.go:66.2,66.47 1 0 +github.com/muety/wakapi/helpers/summary.go:66.47,68.3 1 0 +github.com/muety/wakapi/helpers/summary.go:69.2,69.47 1 0 +github.com/muety/wakapi/helpers/summary.go:69.47,71.3 1 0 +github.com/muety/wakapi/helpers/summary.go:72.2,72.16 1 0 +github.com/muety/wakapi/helpers/summary.go:75.48,79.51 2 0 +github.com/muety/wakapi/helpers/summary.go:79.51,81.3 1 0 +github.com/muety/wakapi/helpers/summary.go:82.2,82.12 1 0 github.com/muety/wakapi/middlewares/authenticate.go:32.91,38.2 1 1 github.com/muety/wakapi/middlewares/authenticate.go:40.90,43.2 2 0 github.com/muety/wakapi/middlewares/authenticate.go:45.90,48.2 2 0 @@ -280,76 +368,6 @@ github.com/muety/wakapi/middlewares/sentry.go:16.43,20.3 1 0 github.com/muety/wakapi/middlewares/sentry.go:23.78,26.54 3 0 github.com/muety/wakapi/middlewares/sentry.go:26.54,27.43 1 0 github.com/muety/wakapi/middlewares/sentry.go:27.43,29.4 1 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:21.13,24.2 2 1 -github.com/muety/wakapi/routes/utils/badge_utils.go:26.114,28.79 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:28.79,30.3 1 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:32.2,33.75 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:33.75,34.61 1 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:34.61,36.4 1 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:39.2,47.71 4 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:47.71,49.3 1 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:51.2,53.22 3 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:54.17,56.68 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:57.12,59.63 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:60.16,62.67 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:63.18,65.69 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:66.17,68.68 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:69.15,71.66 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:73.10,76.30 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:79.2,79.19 1 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:79.19,81.3 1 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:83.2,83.31 1 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:11.68,13.16 2 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:13.16,15.3 1 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:17.2,18.16 2 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:18.16,20.3 1 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:22.2,22.35 1 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:25.65,33.48 6 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:33.48,35.3 1 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:37.2,37.24 1 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:40.67,48.47 6 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:48.47,50.3 1 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:52.2,52.45 1 0 -github.com/muety/wakapi/routes/utils/messages.go:9.71,11.2 1 0 -github.com/muety/wakapi/routes/utils/messages.go:13.73,15.2 1 0 -github.com/muety/wakapi/routes/utils/messages.go:17.97,19.57 2 0 -github.com/muety/wakapi/routes/utils/messages.go:19.57,21.3 1 0 -github.com/muety/wakapi/routes/utils/messages.go:22.2,22.65 1 0 -github.com/muety/wakapi/routes/utils/messages.go:22.65,24.3 1 0 -github.com/muety/wakapi/routes/utils/messages.go:25.2,26.11 2 0 -github.com/muety/wakapi/routes/utils/messages.go:29.78,33.2 3 0 -github.com/muety/wakapi/routes/utils/project_utils.go:15.144,18.16 2 0 -github.com/muety/wakapi/routes/utils/project_utils.go:18.16,20.3 1 0 -github.com/muety/wakapi/routes/utils/project_utils.go:23.2,24.16 2 0 -github.com/muety/wakapi/routes/utils/project_utils.go:24.16,26.3 1 0 -github.com/muety/wakapi/routes/utils/project_utils.go:28.2,32.35 2 0 -github.com/muety/wakapi/routes/utils/project_utils.go:32.35,35.3 2 0 -github.com/muety/wakapi/routes/utils/project_utils.go:37.2,39.20 3 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:12.98,14.16 2 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:14.16,16.3 1 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:17.2,17.51 1 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:20.119,22.22 2 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:22.22,24.3 1 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:26.2,34.16 2 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:34.16,36.3 1 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:38.2,41.36 3 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:44.90,46.32 2 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:46.32,47.50 1 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:47.50,49.4 1 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:51.2,51.15 1 0 -github.com/muety/wakapi/routes/utils/user_utils.go:15.139,16.68 1 1 -github.com/muety/wakapi/routes/utils/user_utils.go:16.68,21.3 4 1 -github.com/muety/wakapi/routes/utils/user_utils.go:23.2,24.21 2 1 -github.com/muety/wakapi/routes/utils/user_utils.go:24.21,26.3 1 1 -github.com/muety/wakapi/routes/utils/user_utils.go:28.2,29.27 2 1 -github.com/muety/wakapi/routes/utils/user_utils.go:29.27,31.3 1 1 -github.com/muety/wakapi/routes/utils/user_utils.go:31.8,31.35 1 1 -github.com/muety/wakapi/routes/utils/user_utils.go:31.35,33.3 1 1 -github.com/muety/wakapi/routes/utils/user_utils.go:35.2,35.63 1 1 -github.com/muety/wakapi/routes/utils/user_utils.go:35.63,37.3 1 1 -github.com/muety/wakapi/routes/utils/user_utils.go:39.2,40.16 2 1 -github.com/muety/wakapi/routes/utils/user_utils.go:40.16,42.3 1 0 -github.com/muety/wakapi/routes/utils/user_utils.go:44.2,44.27 1 1 github.com/muety/wakapi/routes/api/avatar.go:18.40,20.16 2 0 github.com/muety/wakapi/routes/api/avatar.go:20.16,21.13 1 0 github.com/muety/wakapi/routes/api/avatar.go:24.2,27.3 1 0 @@ -481,121 +499,394 @@ github.com/muety/wakapi/routes/api/summary.go:28.63,34.2 4 0 github.com/muety/wakapi/routes/api/summary.go:53.73,55.16 2 0 github.com/muety/wakapi/routes/api/summary.go:55.16,59.3 3 0 github.com/muety/wakapi/routes/api/summary.go:61.2,61.51 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:23.116,29.2 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:31.60,32.34 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:32.34,35.3 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:47.70,49.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:49.16,51.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:53.2,54.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:54.16,58.3 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:60.2,61.46 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:64.116,73.29 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:73.29,75.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:77.2,85.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:85.16,87.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:89.2,89.36 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:29.124,34.2 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:36.62,37.34 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:37.34,40.3 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:52.72,54.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:54.16,56.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:58.2,61.16 4 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:61.16,65.3 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:67.2,71.16 4 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:71.16,76.3 4 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:78.2,84.47 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:23.123,29.2 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:31.61,32.34 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:32.34,35.3 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:48.71,50.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:50.16,52.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:54.2,55.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:55.16,60.3 4 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:62.2,65.28 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:65.28,66.30 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:66.30,68.4 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:71.2,72.46 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:22.112,28.2 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:30.58,31.34 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:31.34,41.3 5 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:62.68,68.53 5 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:68.53,70.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:72.2,73.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:73.16,77.3 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:79.2,79.22 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:79.22,81.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:83.2,84.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:84.16,88.3 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:90.2,92.69 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:92.69,96.3 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:98.2,99.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:99.16,103.3 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:105.2,108.33 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:108.33,110.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:111.2,111.35 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:111.35,113.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:114.2,114.34 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:114.34,116.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:117.2,117.29 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:117.29,119.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:120.2,120.34 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:120.34,122.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:124.2,124.49 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:127.136,136.16 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:136.16,138.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:140.2,140.36 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:29.120,35.2 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:37.62,38.34 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:38.34,43.3 4 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:55.72,57.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:57.16,59.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:61.2,62.22 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:62.22,64.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:66.2,67.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:67.16,71.3 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:73.2,74.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:74.16,78.3 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:79.2,83.4 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:86.115,95.29 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:95.29,97.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:99.2,100.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:100.16,102.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:104.2,104.36 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:27.120,33.2 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:35.62,36.34 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:36.34,39.3 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:65.72,67.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:67.16,69.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:71.2,72.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:72.16,76.3 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:78.2,79.46 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:82.114,87.19 4 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:87.19,88.56 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:88.56,90.4 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:93.2,94.22 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:94.22,96.98 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:96.98,98.4 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:98.9,100.4 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:101.8,101.130 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:101.130,104.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:104.8,109.17 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:109.17,111.4 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:113.3,114.17 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:114.17,116.4 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:123.2,137.37 6 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:137.37,139.17 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:139.17,141.4 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:143.3,145.25 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:148.2,148.38 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:21.116,27.2 1 1 -github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:29.58,30.34 1 1 -github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:30.34,33.3 2 1 -github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:45.68,47.16 2 1 -github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:47.16,49.3 1 1 -github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:51.2,52.72 2 1 -github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:52.72,54.3 1 1 -github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:54.8,56.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:58.2,58.72 1 1 +github.com/muety/wakapi/models/alias.go:18.32,20.2 1 0 +github.com/muety/wakapi/models/alias.go:22.37,23.35 1 0 +github.com/muety/wakapi/models/alias.go:23.35,24.18 1 0 +github.com/muety/wakapi/models/alias.go:24.18,26.4 1 0 +github.com/muety/wakapi/models/alias.go:28.2,28.14 1 0 +github.com/muety/wakapi/models/duration.go:27.75,28.23 1 0 +github.com/muety/wakapi/models/duration.go:28.23,30.3 1 0 +github.com/muety/wakapi/models/duration.go:31.2,35.35 1 0 +github.com/muety/wakapi/models/duration.go:35.35,37.3 1 0 +github.com/muety/wakapi/models/duration.go:38.2,38.18 1 0 +github.com/muety/wakapi/models/duration.go:41.55,56.2 2 0 +github.com/muety/wakapi/models/duration.go:58.50,61.2 2 0 +github.com/muety/wakapi/models/duration.go:63.39,65.16 2 0 +github.com/muety/wakapi/models/duration.go:65.16,67.3 1 0 +github.com/muety/wakapi/models/duration.go:68.2,69.10 2 0 +github.com/muety/wakapi/models/duration.go:72.49,73.11 1 0 +github.com/muety/wakapi/models/duration.go:74.22,75.18 1 0 +github.com/muety/wakapi/models/duration.go:76.21,77.17 1 0 +github.com/muety/wakapi/models/duration.go:78.23,79.19 1 0 +github.com/muety/wakapi/models/duration.go:80.17,81.26 1 0 +github.com/muety/wakapi/models/duration.go:82.22,83.18 1 0 +github.com/muety/wakapi/models/duration.go:84.21,85.17 1 0 +github.com/muety/wakapi/models/duration.go:86.21,87.17 1 0 +github.com/muety/wakapi/models/duration.go:90.2,90.15 1 0 +github.com/muety/wakapi/models/duration.go:90.15,92.3 1 0 +github.com/muety/wakapi/models/duration.go:94.2,94.12 1 0 +github.com/muety/wakapi/models/durations.go:7.30,9.2 1 0 +github.com/muety/wakapi/models/durations.go:11.40,13.2 1 0 +github.com/muety/wakapi/models/durations.go:15.35,17.2 1 0 +github.com/muety/wakapi/models/durations.go:19.45,21.22 2 0 +github.com/muety/wakapi/models/durations.go:21.22,23.3 1 0 +github.com/muety/wakapi/models/durations.go:24.2,24.14 1 0 +github.com/muety/wakapi/models/durations.go:27.39,30.2 2 0 +github.com/muety/wakapi/models/durations.go:32.39,34.18 1 0 +github.com/muety/wakapi/models/durations.go:34.18,36.3 1 0 +github.com/muety/wakapi/models/durations.go:37.2,37.16 1 0 +github.com/muety/wakapi/models/durations.go:40.38,42.18 1 0 +github.com/muety/wakapi/models/durations.go:42.18,44.3 1 0 +github.com/muety/wakapi/models/durations.go:45.2,45.24 1 0 +github.com/muety/wakapi/models/filters.go:22.33,24.2 1 1 +github.com/muety/wakapi/models/filters.go:26.48,27.22 1 1 +github.com/muety/wakapi/models/filters.go:27.22,28.48 1 1 +github.com/muety/wakapi/models/filters.go:28.48,30.4 1 1 +github.com/muety/wakapi/models/filters.go:32.2,32.14 1 1 +github.com/muety/wakapi/models/filters.go:40.56,42.2 1 1 +github.com/muety/wakapi/models/filters.go:44.66,47.2 2 1 +github.com/muety/wakapi/models/filters.go:49.59,51.2 1 1 +github.com/muety/wakapi/models/filters.go:53.70,54.16 1 1 +github.com/muety/wakapi/models/filters.go:55.22,56.41 1 1 +github.com/muety/wakapi/models/filters.go:57.17,58.31 1 0 +github.com/muety/wakapi/models/filters.go:59.23,60.43 1 1 +github.com/muety/wakapi/models/filters.go:61.21,62.39 1 0 +github.com/muety/wakapi/models/filters.go:63.22,64.41 1 0 +github.com/muety/wakapi/models/filters.go:65.20,66.37 1 1 +github.com/muety/wakapi/models/filters.go:67.21,68.39 1 0 +github.com/muety/wakapi/models/filters.go:69.21,70.39 1 0 +github.com/muety/wakapi/models/filters.go:72.2,72.10 1 1 +github.com/muety/wakapi/models/filters.go:75.49,76.44 1 1 +github.com/muety/wakapi/models/filters.go:76.44,78.3 1 1 +github.com/muety/wakapi/models/filters.go:78.8,78.41 1 1 +github.com/muety/wakapi/models/filters.go:78.41,80.3 1 0 +github.com/muety/wakapi/models/filters.go:80.8,80.53 1 1 +github.com/muety/wakapi/models/filters.go:80.53,82.3 1 1 +github.com/muety/wakapi/models/filters.go:82.8,82.49 1 1 +github.com/muety/wakapi/models/filters.go:82.49,84.3 1 0 +github.com/muety/wakapi/models/filters.go:84.8,84.51 1 1 +github.com/muety/wakapi/models/filters.go:84.51,86.3 1 0 +github.com/muety/wakapi/models/filters.go:86.8,86.47 1 1 +github.com/muety/wakapi/models/filters.go:86.47,88.3 1 0 +github.com/muety/wakapi/models/filters.go:88.8,88.49 1 1 +github.com/muety/wakapi/models/filters.go:88.49,90.3 1 0 +github.com/muety/wakapi/models/filters.go:90.8,90.49 1 1 +github.com/muety/wakapi/models/filters.go:90.49,92.3 1 0 +github.com/muety/wakapi/models/filters.go:93.2,93.29 1 1 +github.com/muety/wakapi/models/filters.go:96.46,97.30 1 1 +github.com/muety/wakapi/models/filters.go:97.30,99.3 1 1 +github.com/muety/wakapi/models/filters.go:100.2,100.66 1 0 +github.com/muety/wakapi/models/filters.go:103.34,106.2 2 1 +github.com/muety/wakapi/models/filters.go:108.31,110.51 2 0 +github.com/muety/wakapi/models/filters.go:110.51,112.3 1 0 +github.com/muety/wakapi/models/filters.go:113.2,113.14 1 0 +github.com/muety/wakapi/models/filters.go:116.51,118.2 1 0 +github.com/muety/wakapi/models/filters.go:120.37,122.51 2 0 +github.com/muety/wakapi/models/filters.go:122.51,123.37 1 0 +github.com/muety/wakapi/models/filters.go:123.37,125.4 1 0 +github.com/muety/wakapi/models/filters.go:127.2,127.14 1 0 +github.com/muety/wakapi/models/filters.go:130.59,131.18 1 0 +github.com/muety/wakapi/models/filters.go:132.22,133.20 1 0 +github.com/muety/wakapi/models/filters.go:134.23,135.21 1 0 +github.com/muety/wakapi/models/filters.go:136.21,137.19 1 0 +github.com/muety/wakapi/models/filters.go:138.17,139.15 1 0 +github.com/muety/wakapi/models/filters.go:140.22,141.20 1 0 +github.com/muety/wakapi/models/filters.go:142.20,143.18 1 0 +github.com/muety/wakapi/models/filters.go:144.21,145.19 1 0 +github.com/muety/wakapi/models/filters.go:146.21,147.19 1 0 +github.com/muety/wakapi/models/filters.go:148.10,149.21 1 0 +github.com/muety/wakapi/models/filters.go:153.33,155.16 2 0 +github.com/muety/wakapi/models/filters.go:155.16,157.3 1 0 +github.com/muety/wakapi/models/filters.go:158.2,158.32 1 0 +github.com/muety/wakapi/models/filters.go:161.44,167.2 1 1 +github.com/muety/wakapi/models/filters.go:170.70,171.22 1 1 +github.com/muety/wakapi/models/filters.go:171.22,173.31 2 1 +github.com/muety/wakapi/models/filters.go:173.31,176.4 2 1 +github.com/muety/wakapi/models/filters.go:177.3,177.22 1 1 +github.com/muety/wakapi/models/filters.go:179.2,179.17 1 1 +github.com/muety/wakapi/models/filters.go:179.17,181.26 2 0 +github.com/muety/wakapi/models/filters.go:181.26,184.4 2 0 +github.com/muety/wakapi/models/filters.go:185.3,185.17 1 0 +github.com/muety/wakapi/models/filters.go:187.2,187.23 1 1 +github.com/muety/wakapi/models/filters.go:187.23,189.32 2 1 +github.com/muety/wakapi/models/filters.go:189.32,192.4 2 1 +github.com/muety/wakapi/models/filters.go:193.3,193.23 1 1 +github.com/muety/wakapi/models/filters.go:195.2,195.21 1 1 +github.com/muety/wakapi/models/filters.go:195.21,197.30 2 0 +github.com/muety/wakapi/models/filters.go:197.30,200.4 2 0 +github.com/muety/wakapi/models/filters.go:201.3,201.21 1 0 +github.com/muety/wakapi/models/filters.go:203.2,203.22 1 1 +github.com/muety/wakapi/models/filters.go:203.22,205.31 2 0 +github.com/muety/wakapi/models/filters.go:205.31,208.4 2 0 +github.com/muety/wakapi/models/filters.go:209.3,209.22 1 0 +github.com/muety/wakapi/models/filters.go:211.2,211.21 1 1 +github.com/muety/wakapi/models/filters.go:211.21,213.30 2 0 +github.com/muety/wakapi/models/filters.go:213.30,216.4 2 0 +github.com/muety/wakapi/models/filters.go:217.3,217.21 1 0 +github.com/muety/wakapi/models/filters.go:220.2,220.10 1 1 +github.com/muety/wakapi/models/filters.go:223.83,224.41 1 1 +github.com/muety/wakapi/models/filters.go:224.41,226.3 1 0 +github.com/muety/wakapi/models/filters.go:227.2,227.28 1 1 +github.com/muety/wakapi/models/filters.go:227.28,229.3 1 1 +github.com/muety/wakapi/models/filters.go:230.2,230.10 1 1 +github.com/muety/wakapi/models/filters.go:233.43,235.2 1 0 +github.com/muety/wakapi/models/heartbeat.go:34.34,36.2 1 1 +github.com/muety/wakapi/models/heartbeat.go:38.55,41.2 2 0 +github.com/muety/wakapi/models/heartbeat.go:43.43,49.80 1 0 +github.com/muety/wakapi/models/heartbeat.go:49.80,51.3 1 0 +github.com/muety/wakapi/models/heartbeat.go:53.2,56.10 3 0 +github.com/muety/wakapi/models/heartbeat.go:59.65,61.46 2 1 +github.com/muety/wakapi/models/heartbeat.go:61.46,62.108 1 1 +github.com/muety/wakapi/models/heartbeat.go:62.108,65.4 2 1 +github.com/muety/wakapi/models/heartbeat.go:69.50,70.11 1 1 +github.com/muety/wakapi/models/heartbeat.go:71.22,72.18 1 1 +github.com/muety/wakapi/models/heartbeat.go:73.21,74.17 1 1 +github.com/muety/wakapi/models/heartbeat.go:75.23,76.19 1 1 +github.com/muety/wakapi/models/heartbeat.go:77.17,78.26 1 1 +github.com/muety/wakapi/models/heartbeat.go:79.22,80.18 1 1 +github.com/muety/wakapi/models/heartbeat.go:81.21,82.17 1 0 +github.com/muety/wakapi/models/heartbeat.go:83.21,84.17 1 0 +github.com/muety/wakapi/models/heartbeat.go:87.2,87.15 1 1 +github.com/muety/wakapi/models/heartbeat.go:87.15,89.3 1 1 +github.com/muety/wakapi/models/heartbeat.go:91.2,91.12 1 1 +github.com/muety/wakapi/models/heartbeat.go:94.37,110.2 1 0 +github.com/muety/wakapi/models/heartbeat.go:118.41,120.16 2 1 +github.com/muety/wakapi/models/heartbeat.go:120.16,122.3 1 0 +github.com/muety/wakapi/models/heartbeat.go:123.2,124.10 2 1 +github.com/muety/wakapi/models/heartbeat.go:127.38,137.2 1 0 +github.com/muety/wakapi/models/heartbeats.go:7.31,9.2 1 0 +github.com/muety/wakapi/models/heartbeats.go:11.41,13.2 1 0 +github.com/muety/wakapi/models/heartbeats.go:15.36,17.2 1 0 +github.com/muety/wakapi/models/heartbeats.go:19.43,22.2 2 0 +github.com/muety/wakapi/models/heartbeats.go:24.41,26.18 1 0 +github.com/muety/wakapi/models/heartbeats.go:26.18,28.3 1 0 +github.com/muety/wakapi/models/heartbeats.go:29.2,29.16 1 0 +github.com/muety/wakapi/models/heartbeats.go:32.40,34.18 1 0 +github.com/muety/wakapi/models/heartbeats.go:34.18,36.3 1 0 +github.com/muety/wakapi/models/heartbeats.go:37.2,37.24 1 0 +github.com/muety/wakapi/models/interval.go:47.47,48.23 1 0 +github.com/muety/wakapi/models/interval.go:48.23,49.13 1 0 +github.com/muety/wakapi/models/interval.go:49.13,51.4 1 0 +github.com/muety/wakapi/models/interval.go:53.2,53.14 1 0 +github.com/muety/wakapi/models/interval.go:56.49,57.23 1 0 +github.com/muety/wakapi/models/interval.go:57.23,58.34 1 0 +github.com/muety/wakapi/models/interval.go:58.34,60.4 1 0 +github.com/muety/wakapi/models/interval.go:62.2,62.11 1 0 +github.com/muety/wakapi/models/language_mapping.go:11.42,13.2 1 0 +github.com/muety/wakapi/models/language_mapping.go:15.51,17.2 1 0 +github.com/muety/wakapi/models/language_mapping.go:19.52,21.2 1 0 +github.com/muety/wakapi/models/leaderboard.go:28.73,30.2 1 0 +github.com/muety/wakapi/models/leaderboard.go:34.56,35.103 1 0 +github.com/muety/wakapi/models/leaderboard.go:35.103,37.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:37.13,39.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:42.63,43.29 1 0 +github.com/muety/wakapi/models/leaderboard.go:43.29,45.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:48.41,49.123 1 0 +github.com/muety/wakapi/models/leaderboard.go:49.123,51.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:54.50,56.2 1 0 +github.com/muety/wakapi/models/leaderboard.go:58.65,59.95 1 0 +github.com/muety/wakapi/models/leaderboard.go:59.95,61.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:64.49,72.25 3 0 +github.com/muety/wakapi/models/leaderboard.go:72.25,73.58 1 0 +github.com/muety/wakapi/models/leaderboard.go:73.58,74.12 1 0 +github.com/muety/wakapi/models/leaderboard.go:76.3,77.38 2 0 +github.com/muety/wakapi/models/leaderboard.go:77.38,79.4 1 0 +github.com/muety/wakapi/models/leaderboard.go:80.3,80.40 1 0 +github.com/muety/wakapi/models/leaderboard.go:83.2,83.129 1 0 +github.com/muety/wakapi/models/leaderboard.go:83.129,85.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:86.2,86.67 1 0 +github.com/muety/wakapi/models/leaderboard.go:86.67,88.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:90.2,90.79 1 0 +github.com/muety/wakapi/models/leaderboard.go:90.79,92.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:95.70,96.107 1 0 +github.com/muety/wakapi/models/leaderboard.go:96.107,98.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:101.45,103.25 2 0 +github.com/muety/wakapi/models/leaderboard.go:103.25,104.43 1 0 +github.com/muety/wakapi/models/leaderboard.go:104.43,106.4 1 0 +github.com/muety/wakapi/models/leaderboard.go:108.2,108.19 1 0 +github.com/muety/wakapi/models/mail.go:23.44,27.2 3 0 +github.com/muety/wakapi/models/mail.go:29.44,33.2 3 0 +github.com/muety/wakapi/models/mail.go:35.34,36.18 1 0 +github.com/muety/wakapi/models/mail.go:36.18,38.3 1 0 +github.com/muety/wakapi/models/mail.go:39.2,39.21 1 0 +github.com/muety/wakapi/models/mail.go:39.21,41.3 1 0 +github.com/muety/wakapi/models/mail.go:42.2,42.23 1 0 +github.com/muety/wakapi/models/mail.go:42.23,44.3 1 0 +github.com/muety/wakapi/models/mail.go:45.2,45.10 1 0 +github.com/muety/wakapi/models/mail.go:48.32,67.2 1 0 +github.com/muety/wakapi/models/mail.go:69.41,71.2 1 0 +github.com/muety/wakapi/models/mail_address.go:18.13,21.2 2 1 +github.com/muety/wakapi/models/mail_address.go:27.38,29.2 1 0 +github.com/muety/wakapi/models/mail_address.go:31.35,33.21 2 1 +github.com/muety/wakapi/models/mail_address.go:33.21,34.21 1 1 +github.com/muety/wakapi/models/mail_address.go:34.21,36.4 1 1 +github.com/muety/wakapi/models/mail_address.go:37.3,37.18 1 1 +github.com/muety/wakapi/models/mail_address.go:39.2,39.11 1 1 +github.com/muety/wakapi/models/mail_address.go:42.38,44.21 2 0 +github.com/muety/wakapi/models/mail_address.go:44.21,46.3 1 0 +github.com/muety/wakapi/models/mail_address.go:47.2,47.17 1 0 +github.com/muety/wakapi/models/mail_address.go:50.35,52.2 1 1 +github.com/muety/wakapi/models/mail_address.go:54.43,56.22 2 0 +github.com/muety/wakapi/models/mail_address.go:56.22,58.3 1 0 +github.com/muety/wakapi/models/mail_address.go:59.2,59.12 1 0 +github.com/muety/wakapi/models/mail_address.go:62.46,64.22 2 1 +github.com/muety/wakapi/models/mail_address.go:64.22,66.3 1 1 +github.com/muety/wakapi/models/mail_address.go:67.2,67.12 1 1 +github.com/muety/wakapi/models/mail_address.go:70.40,71.22 1 1 +github.com/muety/wakapi/models/mail_address.go:71.22,72.17 1 1 +github.com/muety/wakapi/models/mail_address.go:72.17,74.4 1 1 +github.com/muety/wakapi/models/mail_address.go:76.2,76.13 1 1 +github.com/muety/wakapi/models/models.go:3.14,5.2 0 1 +github.com/muety/wakapi/models/project_label.go:14.39,16.2 1 0 +github.com/muety/wakapi/models/shared.go:38.52,40.2 1 0 +github.com/muety/wakapi/models/shared.go:42.52,45.16 3 0 +github.com/muety/wakapi/models/shared.go:45.16,47.3 1 0 +github.com/muety/wakapi/models/shared.go:48.2,50.12 3 0 +github.com/muety/wakapi/models/shared.go:53.52,59.22 2 0 +github.com/muety/wakapi/models/shared.go:60.14,64.17 2 0 +github.com/muety/wakapi/models/shared.go:64.17,66.4 1 0 +github.com/muety/wakapi/models/shared.go:67.17,69.8 2 0 +github.com/muety/wakapi/models/shared.go:70.10,71.64 1 0 +github.com/muety/wakapi/models/shared.go:74.2,77.12 3 0 +github.com/muety/wakapi/models/shared.go:80.51,83.2 2 0 +github.com/muety/wakapi/models/shared.go:85.45,87.2 1 1 +github.com/muety/wakapi/models/shared.go:89.37,91.2 1 0 +github.com/muety/wakapi/models/shared.go:93.35,95.2 1 1 +github.com/muety/wakapi/models/shared.go:97.34,99.2 1 0 +github.com/muety/wakapi/models/summary.go:66.29,68.2 1 1 +github.com/muety/wakapi/models/summary.go:70.35,72.2 1 0 +github.com/muety/wakapi/models/summary.go:74.38,76.2 1 0 +github.com/muety/wakapi/models/summary.go:78.37,88.2 9 1 +github.com/muety/wakapi/models/summary.go:90.35,92.2 1 1 +github.com/muety/wakapi/models/summary.go:94.57,105.2 1 1 +github.com/muety/wakapi/models/summary.go:107.64,108.21 1 1 +github.com/muety/wakapi/models/summary.go:109.22,110.21 1 1 +github.com/muety/wakapi/models/summary.go:111.23,112.22 1 1 +github.com/muety/wakapi/models/summary.go:113.21,114.20 1 1 +github.com/muety/wakapi/models/summary.go:115.17,116.29 1 1 +github.com/muety/wakapi/models/summary.go:117.22,118.21 1 1 +github.com/muety/wakapi/models/summary.go:119.20,120.19 1 1 +github.com/muety/wakapi/models/summary.go:121.21,122.21 1 1 +github.com/muety/wakapi/models/summary.go:123.21,124.21 1 1 +github.com/muety/wakapi/models/summary.go:126.2,126.12 1 0 +github.com/muety/wakapi/models/summary.go:129.59,130.21 1 1 +github.com/muety/wakapi/models/summary.go:130.21,132.3 1 1 +github.com/muety/wakapi/models/summary.go:134.2,134.35 1 1 +github.com/muety/wakapi/models/summary.go:134.35,135.41 1 1 +github.com/muety/wakapi/models/summary.go:135.41,137.4 1 1 +github.com/muety/wakapi/models/summary.go:140.2,140.10 1 1 +github.com/muety/wakapi/models/summary.go:156.33,161.26 4 1 +github.com/muety/wakapi/models/summary.go:161.26,162.30 1 1 +github.com/muety/wakapi/models/summary.go:162.30,164.4 1 1 +github.com/muety/wakapi/models/summary.go:168.2,168.37 1 1 +github.com/muety/wakapi/models/summary.go:168.37,170.3 1 0 +github.com/muety/wakapi/models/summary.go:173.2,174.16 2 1 +github.com/muety/wakapi/models/summary.go:174.16,176.3 1 0 +github.com/muety/wakapi/models/summary.go:177.2,177.33 1 1 +github.com/muety/wakapi/models/summary.go:177.33,179.3 1 1 +github.com/muety/wakapi/models/summary.go:183.56,189.28 5 1 +github.com/muety/wakapi/models/summary.go:189.28,191.3 1 1 +github.com/muety/wakapi/models/summary.go:193.2,194.42 2 1 +github.com/muety/wakapi/models/summary.go:194.42,195.22 1 0 +github.com/muety/wakapi/models/summary.go:195.22,197.9 2 0 +github.com/muety/wakapi/models/summary.go:201.2,202.15 2 1 +github.com/muety/wakapi/models/summary.go:202.15,203.28 1 1 +github.com/muety/wakapi/models/summary.go:203.28,205.4 1 0 +github.com/muety/wakapi/models/summary.go:205.9,211.4 1 1 +github.com/muety/wakapi/models/summary.go:215.45,220.16 4 1 +github.com/muety/wakapi/models/summary.go:220.16,222.3 1 0 +github.com/muety/wakapi/models/summary.go:223.2,223.39 1 1 +github.com/muety/wakapi/models/summary.go:223.39,225.3 1 1 +github.com/muety/wakapi/models/summary.go:227.2,227.30 1 1 +github.com/muety/wakapi/models/summary.go:230.73,232.55 2 1 +github.com/muety/wakapi/models/summary.go:232.55,233.31 1 1 +github.com/muety/wakapi/models/summary.go:233.31,235.4 1 1 +github.com/muety/wakapi/models/summary.go:237.2,237.16 1 1 +github.com/muety/wakapi/models/summary.go:240.88,242.55 2 1 +github.com/muety/wakapi/models/summary.go:242.55,243.31 1 1 +github.com/muety/wakapi/models/summary.go:243.31,244.23 1 1 +github.com/muety/wakapi/models/summary.go:244.23,245.13 1 1 +github.com/muety/wakapi/models/summary.go:247.4,247.46 1 1 +github.com/muety/wakapi/models/summary.go:250.2,250.16 1 1 +github.com/muety/wakapi/models/summary.go:253.73,255.34 2 1 +github.com/muety/wakapi/models/summary.go:255.34,257.3 1 1 +github.com/muety/wakapi/models/summary.go:258.2,258.14 1 1 +github.com/muety/wakapi/models/summary.go:261.56,264.55 3 0 +github.com/muety/wakapi/models/summary.go:264.55,265.31 1 0 +github.com/muety/wakapi/models/summary.go:265.31,266.44 1 0 +github.com/muety/wakapi/models/summary.go:266.44,268.5 1 0 +github.com/muety/wakapi/models/summary.go:271.2,271.12 1 0 +github.com/muety/wakapi/models/summary.go:274.58,276.16 2 0 +github.com/muety/wakapi/models/summary.go:276.16,278.3 1 0 +github.com/muety/wakapi/models/summary.go:279.2,279.16 1 0 +github.com/muety/wakapi/models/summary.go:282.71,283.63 1 1 +github.com/muety/wakapi/models/summary.go:283.63,284.20 1 1 +github.com/muety/wakapi/models/summary.go:284.20,286.4 1 1 +github.com/muety/wakapi/models/summary.go:288.3,290.45 2 1 +github.com/muety/wakapi/models/summary.go:290.45,291.32 1 1 +github.com/muety/wakapi/models/summary.go:291.32,292.24 1 1 +github.com/muety/wakapi/models/summary.go:292.24,294.6 1 1 +github.com/muety/wakapi/models/summary.go:296.4,296.14 1 1 +github.com/muety/wakapi/models/summary.go:299.3,299.31 1 1 +github.com/muety/wakapi/models/summary.go:299.31,301.60 1 1 +github.com/muety/wakapi/models/summary.go:301.60,303.5 1 1 +github.com/muety/wakapi/models/summary.go:306.3,306.31 1 1 +github.com/muety/wakapi/models/summary.go:306.31,308.60 1 1 +github.com/muety/wakapi/models/summary.go:308.60,309.55 1 1 +github.com/muety/wakapi/models/summary.go:309.55,311.6 1 1 +github.com/muety/wakapi/models/summary.go:311.11,319.6 1 1 +github.com/muety/wakapi/models/summary.go:323.3,323.16 1 1 +github.com/muety/wakapi/models/summary.go:327.2,336.10 8 1 +github.com/muety/wakapi/models/summary.go:339.57,340.30 1 1 +github.com/muety/wakapi/models/summary.go:340.30,341.28 1 1 +github.com/muety/wakapi/models/summary.go:341.28,343.4 1 1 +github.com/muety/wakapi/models/summary.go:345.2,345.43 1 0 +github.com/muety/wakapi/models/summary.go:348.43,350.2 1 0 +github.com/muety/wakapi/models/summary.go:352.49,353.21 1 0 +github.com/muety/wakapi/models/summary.go:353.21,355.3 1 0 +github.com/muety/wakapi/models/summary.go:356.2,357.54 2 0 +github.com/muety/wakapi/models/summary.go:360.51,361.27 1 0 +github.com/muety/wakapi/models/summary.go:361.27,363.3 1 0 +github.com/muety/wakapi/models/summary.go:364.2,365.19 2 0 +github.com/muety/wakapi/models/summary.go:368.50,372.2 1 1 +github.com/muety/wakapi/models/summary.go:374.33,376.2 1 1 +github.com/muety/wakapi/models/summary.go:378.43,380.2 1 1 +github.com/muety/wakapi/models/summary.go:382.38,384.2 1 1 +github.com/muety/wakapi/models/user.go:13.13,15.2 1 1 +github.com/muety/wakapi/models/user.go:90.34,92.2 1 0 +github.com/muety/wakapi/models/user.go:94.36,95.22 1 1 +github.com/muety/wakapi/models/user.go:95.22,97.3 1 1 +github.com/muety/wakapi/models/user.go:98.2,99.16 2 1 +github.com/muety/wakapi/models/user.go:99.16,101.3 1 0 +github.com/muety/wakapi/models/user.go:102.2,102.11 1 1 +github.com/muety/wakapi/models/user.go:107.41,110.2 2 1 +github.com/muety/wakapi/models/user.go:112.53,115.54 3 0 +github.com/muety/wakapi/models/user.go:115.54,117.3 1 0 +github.com/muety/wakapi/models/user.go:118.2,118.51 1 0 +github.com/muety/wakapi/models/user.go:118.51,120.3 1 0 +github.com/muety/wakapi/models/user.go:121.2,121.20 1 0 +github.com/muety/wakapi/models/user.go:125.52,126.28 1 0 +github.com/muety/wakapi/models/user.go:126.28,128.3 1 0 +github.com/muety/wakapi/models/user.go:129.2,129.17 1 0 +github.com/muety/wakapi/models/user.go:133.45,135.2 1 1 +github.com/muety/wakapi/models/user.go:137.51,139.2 1 1 +github.com/muety/wakapi/models/user.go:145.65,147.32 2 0 +github.com/muety/wakapi/models/user.go:147.32,149.3 1 0 +github.com/muety/wakapi/models/user.go:150.2,150.30 1 0 +github.com/muety/wakapi/models/user.go:150.30,152.3 1 0 +github.com/muety/wakapi/models/user.go:153.2,154.24 2 0 +github.com/muety/wakapi/models/user.go:157.39,159.55 2 1 +github.com/muety/wakapi/models/user.go:159.55,161.3 1 1 +github.com/muety/wakapi/models/user.go:163.2,163.51 1 1 +github.com/muety/wakapi/models/user.go:166.37,168.2 1 0 +github.com/muety/wakapi/models/user.go:170.43,173.2 1 0 +github.com/muety/wakapi/models/user.go:175.45,178.2 1 0 +github.com/muety/wakapi/models/user.go:180.33,185.2 1 0 +github.com/muety/wakapi/models/user.go:187.41,189.2 1 0 +github.com/muety/wakapi/models/user.go:191.45,193.2 1 0 +github.com/muety/wakapi/models/user.go:195.45,197.2 1 0 +github.com/muety/wakapi/models/user.go:200.39,202.2 1 0 +github.com/muety/wakapi/models/user.go:204.39,207.2 2 0 github.com/muety/wakapi/utils/auth.go:15.79,17.54 2 0 github.com/muety/wakapi/utils/auth.go:17.54,19.3 1 0 github.com/muety/wakapi/utils/auth.go:21.2,23.16 3 0 @@ -672,37 +963,39 @@ github.com/muety/wakapi/utils/db.go:50.2,50.14 1 0 github.com/muety/wakapi/utils/dns.go:9.38,11.21 2 0 github.com/muety/wakapi/utils/dns.go:11.21,13.3 1 0 github.com/muety/wakapi/utils/dns.go:14.2,15.39 2 0 -github.com/muety/wakapi/utils/http.go:21.13,23.2 1 1 -github.com/muety/wakapi/utils/http.go:30.34,31.20 1 0 -github.com/muety/wakapi/utils/http.go:31.20,33.3 1 0 -github.com/muety/wakapi/utils/http.go:34.2,34.19 1 0 -github.com/muety/wakapi/utils/http.go:37.35,38.21 1 0 -github.com/muety/wakapi/utils/http.go:38.21,40.3 1 0 -github.com/muety/wakapi/utils/http.go:41.2,41.34 1 0 -github.com/muety/wakapi/utils/http.go:44.62,46.48 2 0 -github.com/muety/wakapi/utils/http.go:46.48,48.3 1 0 -github.com/muety/wakapi/utils/http.go:49.2,49.93 1 0 -github.com/muety/wakapi/utils/http.go:49.93,50.89 1 0 -github.com/muety/wakapi/utils/http.go:50.89,52.4 1 0 -github.com/muety/wakapi/utils/http.go:54.2,54.14 1 0 -github.com/muety/wakapi/utils/http.go:57.51,61.46 4 0 -github.com/muety/wakapi/utils/http.go:61.46,63.3 1 0 -github.com/muety/wakapi/utils/http.go:64.2,64.73 1 0 -github.com/muety/wakapi/utils/http.go:64.73,66.3 1 0 -github.com/muety/wakapi/utils/http.go:67.2,67.19 1 0 -github.com/muety/wakapi/utils/http.go:70.78,72.26 2 0 -github.com/muety/wakapi/utils/http.go:72.26,74.3 1 0 -github.com/muety/wakapi/utils/http.go:75.2,75.30 1 0 -github.com/muety/wakapi/utils/http.go:75.30,77.3 1 0 -github.com/muety/wakapi/utils/http.go:78.2,78.19 1 0 -github.com/muety/wakapi/utils/http.go:81.56,84.45 3 1 -github.com/muety/wakapi/utils/http.go:84.45,86.3 1 1 -github.com/muety/wakapi/utils/http.go:87.2,87.40 1 1 -github.com/muety/wakapi/utils/http.go:90.76,91.16 1 0 -github.com/muety/wakapi/utils/http.go:91.16,93.3 1 0 -github.com/muety/wakapi/utils/http.go:94.2,94.27 1 0 -github.com/muety/wakapi/utils/http.go:94.27,96.3 1 0 -github.com/muety/wakapi/utils/http.go:97.2,97.17 1 0 +github.com/muety/wakapi/utils/http.go:23.13,25.2 1 1 +github.com/muety/wakapi/utils/http.go:32.34,33.20 1 0 +github.com/muety/wakapi/utils/http.go:33.20,35.3 1 0 +github.com/muety/wakapi/utils/http.go:36.2,36.19 1 0 +github.com/muety/wakapi/utils/http.go:39.35,40.21 1 0 +github.com/muety/wakapi/utils/http.go:40.21,42.3 1 0 +github.com/muety/wakapi/utils/http.go:43.2,43.34 1 0 +github.com/muety/wakapi/utils/http.go:46.62,48.48 2 0 +github.com/muety/wakapi/utils/http.go:48.48,50.3 1 0 +github.com/muety/wakapi/utils/http.go:51.2,51.93 1 0 +github.com/muety/wakapi/utils/http.go:51.93,52.89 1 0 +github.com/muety/wakapi/utils/http.go:52.89,54.4 1 0 +github.com/muety/wakapi/utils/http.go:56.2,56.14 1 0 +github.com/muety/wakapi/utils/http.go:59.51,63.46 4 0 +github.com/muety/wakapi/utils/http.go:63.46,65.3 1 0 +github.com/muety/wakapi/utils/http.go:66.2,66.73 1 0 +github.com/muety/wakapi/utils/http.go:66.73,68.3 1 0 +github.com/muety/wakapi/utils/http.go:69.2,69.19 1 0 +github.com/muety/wakapi/utils/http.go:72.78,74.26 2 0 +github.com/muety/wakapi/utils/http.go:74.26,76.3 1 0 +github.com/muety/wakapi/utils/http.go:77.2,77.30 1 0 +github.com/muety/wakapi/utils/http.go:77.30,79.3 1 0 +github.com/muety/wakapi/utils/http.go:80.2,80.19 1 0 +github.com/muety/wakapi/utils/http.go:83.56,86.45 3 1 +github.com/muety/wakapi/utils/http.go:86.45,88.3 1 1 +github.com/muety/wakapi/utils/http.go:89.2,89.40 1 1 +github.com/muety/wakapi/utils/http.go:92.76,93.16 1 0 +github.com/muety/wakapi/utils/http.go:93.16,95.3 1 0 +github.com/muety/wakapi/utils/http.go:96.2,96.27 1 0 +github.com/muety/wakapi/utils/http.go:96.27,99.100 3 0 +github.com/muety/wakapi/utils/http.go:99.100,104.4 4 0 +github.com/muety/wakapi/utils/http.go:105.3,105.139 1 0 +github.com/muety/wakapi/utils/http.go:107.2,107.17 1 0 github.com/muety/wakapi/utils/json.go:12.75,18.62 2 0 github.com/muety/wakapi/utils/json.go:18.62,20.3 1 0 github.com/muety/wakapi/utils/json.go:22.2,22.29 1 0 @@ -745,6 +1038,76 @@ github.com/muety/wakapi/utils/template.go:52.3,55.17 3 0 github.com/muety/wakapi/utils/template.go:55.17,57.4 1 0 github.com/muety/wakapi/utils/template.go:59.3,59.27 1 0 github.com/muety/wakapi/utils/template.go:62.2,62.23 1 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:21.13,24.2 2 1 +github.com/muety/wakapi/routes/utils/badge_utils.go:26.114,28.79 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:28.79,30.3 1 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:32.2,33.75 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:33.75,34.61 1 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:34.61,36.4 1 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:39.2,47.71 4 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:47.71,49.3 1 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:51.2,53.22 3 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:54.17,56.68 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:57.12,59.63 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:60.16,62.67 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:63.18,65.69 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:66.17,68.68 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:69.15,71.66 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:73.10,76.30 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:79.2,79.19 1 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:79.19,81.3 1 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:83.2,83.31 1 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:11.68,13.16 2 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:13.16,15.3 1 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:17.2,18.16 2 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:18.16,20.3 1 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:22.2,22.35 1 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:25.65,33.48 6 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:33.48,35.3 1 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:37.2,37.24 1 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:40.67,48.47 6 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:48.47,50.3 1 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:52.2,52.45 1 0 +github.com/muety/wakapi/routes/utils/messages.go:9.71,11.2 1 0 +github.com/muety/wakapi/routes/utils/messages.go:13.73,15.2 1 0 +github.com/muety/wakapi/routes/utils/messages.go:17.97,19.57 2 0 +github.com/muety/wakapi/routes/utils/messages.go:19.57,21.3 1 0 +github.com/muety/wakapi/routes/utils/messages.go:22.2,22.65 1 0 +github.com/muety/wakapi/routes/utils/messages.go:22.65,24.3 1 0 +github.com/muety/wakapi/routes/utils/messages.go:25.2,26.11 2 0 +github.com/muety/wakapi/routes/utils/messages.go:29.78,33.2 3 0 +github.com/muety/wakapi/routes/utils/project_utils.go:15.144,18.16 2 0 +github.com/muety/wakapi/routes/utils/project_utils.go:18.16,20.3 1 0 +github.com/muety/wakapi/routes/utils/project_utils.go:23.2,24.16 2 0 +github.com/muety/wakapi/routes/utils/project_utils.go:24.16,26.3 1 0 +github.com/muety/wakapi/routes/utils/project_utils.go:28.2,32.35 2 0 +github.com/muety/wakapi/routes/utils/project_utils.go:32.35,35.3 2 0 +github.com/muety/wakapi/routes/utils/project_utils.go:37.2,39.20 3 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:12.98,14.16 2 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:14.16,16.3 1 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:17.2,17.51 1 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:20.119,22.22 2 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:22.22,24.3 1 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:26.2,34.16 2 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:34.16,36.3 1 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:38.2,41.36 3 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:44.90,46.32 2 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:46.32,47.50 1 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:47.50,49.4 1 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:51.2,51.15 1 0 +github.com/muety/wakapi/routes/utils/user_utils.go:15.139,16.68 1 1 +github.com/muety/wakapi/routes/utils/user_utils.go:16.68,21.3 4 1 +github.com/muety/wakapi/routes/utils/user_utils.go:23.2,24.21 2 1 +github.com/muety/wakapi/routes/utils/user_utils.go:24.21,26.3 1 1 +github.com/muety/wakapi/routes/utils/user_utils.go:28.2,29.27 2 1 +github.com/muety/wakapi/routes/utils/user_utils.go:29.27,31.3 1 1 +github.com/muety/wakapi/routes/utils/user_utils.go:31.8,31.35 1 1 +github.com/muety/wakapi/routes/utils/user_utils.go:31.35,33.3 1 1 +github.com/muety/wakapi/routes/utils/user_utils.go:35.2,35.63 1 1 +github.com/muety/wakapi/routes/utils/user_utils.go:35.63,37.3 1 1 +github.com/muety/wakapi/routes/utils/user_utils.go:39.2,40.16 2 1 +github.com/muety/wakapi/routes/utils/user_utils.go:40.16,42.3 1 0 +github.com/muety/wakapi/routes/utils/user_utils.go:44.2,44.27 1 1 github.com/muety/wakapi/services/aggregation.go:31.142,41.2 1 0 github.com/muety/wakapi/services/aggregation.go:50.43,53.52 2 0 github.com/muety/wakapi/services/aggregation.go:53.52,54.80 1 0 @@ -1397,386 +1760,120 @@ github.com/muety/wakapi/services/user.go:211.38,213.2 1 0 github.com/muety/wakapi/services/user.go:215.55,217.2 1 0 github.com/muety/wakapi/services/user.go:219.57,224.2 1 0 github.com/muety/wakapi/services/user.go:226.57,231.2 1 0 -github.com/muety/wakapi/models/alias.go:18.32,20.2 1 0 -github.com/muety/wakapi/models/alias.go:22.37,23.35 1 0 -github.com/muety/wakapi/models/alias.go:23.35,24.18 1 0 -github.com/muety/wakapi/models/alias.go:24.18,26.4 1 0 -github.com/muety/wakapi/models/alias.go:28.2,28.14 1 0 -github.com/muety/wakapi/models/duration.go:27.75,28.23 1 0 -github.com/muety/wakapi/models/duration.go:28.23,30.3 1 0 -github.com/muety/wakapi/models/duration.go:31.2,35.35 1 0 -github.com/muety/wakapi/models/duration.go:35.35,37.3 1 0 -github.com/muety/wakapi/models/duration.go:38.2,38.18 1 0 -github.com/muety/wakapi/models/duration.go:41.55,56.2 2 0 -github.com/muety/wakapi/models/duration.go:58.50,61.2 2 0 -github.com/muety/wakapi/models/duration.go:63.39,65.16 2 0 -github.com/muety/wakapi/models/duration.go:65.16,67.3 1 0 -github.com/muety/wakapi/models/duration.go:68.2,69.10 2 0 -github.com/muety/wakapi/models/duration.go:72.49,73.11 1 0 -github.com/muety/wakapi/models/duration.go:74.22,75.18 1 0 -github.com/muety/wakapi/models/duration.go:76.21,77.17 1 0 -github.com/muety/wakapi/models/duration.go:78.23,79.19 1 0 -github.com/muety/wakapi/models/duration.go:80.17,81.26 1 0 -github.com/muety/wakapi/models/duration.go:82.22,83.18 1 0 -github.com/muety/wakapi/models/duration.go:84.21,85.17 1 0 -github.com/muety/wakapi/models/duration.go:86.21,87.17 1 0 -github.com/muety/wakapi/models/duration.go:90.2,90.15 1 0 -github.com/muety/wakapi/models/duration.go:90.15,92.3 1 0 -github.com/muety/wakapi/models/duration.go:94.2,94.12 1 0 -github.com/muety/wakapi/models/durations.go:7.30,9.2 1 0 -github.com/muety/wakapi/models/durations.go:11.40,13.2 1 0 -github.com/muety/wakapi/models/durations.go:15.35,17.2 1 0 -github.com/muety/wakapi/models/durations.go:19.45,21.22 2 0 -github.com/muety/wakapi/models/durations.go:21.22,23.3 1 0 -github.com/muety/wakapi/models/durations.go:24.2,24.14 1 0 -github.com/muety/wakapi/models/durations.go:27.39,30.2 2 0 -github.com/muety/wakapi/models/durations.go:32.39,34.18 1 0 -github.com/muety/wakapi/models/durations.go:34.18,36.3 1 0 -github.com/muety/wakapi/models/durations.go:37.2,37.16 1 0 -github.com/muety/wakapi/models/durations.go:40.38,42.18 1 0 -github.com/muety/wakapi/models/durations.go:42.18,44.3 1 0 -github.com/muety/wakapi/models/durations.go:45.2,45.24 1 0 -github.com/muety/wakapi/models/filters.go:22.33,24.2 1 1 -github.com/muety/wakapi/models/filters.go:26.48,27.22 1 1 -github.com/muety/wakapi/models/filters.go:27.22,28.48 1 1 -github.com/muety/wakapi/models/filters.go:28.48,30.4 1 1 -github.com/muety/wakapi/models/filters.go:32.2,32.14 1 1 -github.com/muety/wakapi/models/filters.go:40.56,42.2 1 1 -github.com/muety/wakapi/models/filters.go:44.66,47.2 2 1 -github.com/muety/wakapi/models/filters.go:49.59,51.2 1 1 -github.com/muety/wakapi/models/filters.go:53.70,54.16 1 1 -github.com/muety/wakapi/models/filters.go:55.22,56.41 1 1 -github.com/muety/wakapi/models/filters.go:57.17,58.31 1 0 -github.com/muety/wakapi/models/filters.go:59.23,60.43 1 1 -github.com/muety/wakapi/models/filters.go:61.21,62.39 1 0 -github.com/muety/wakapi/models/filters.go:63.22,64.41 1 0 -github.com/muety/wakapi/models/filters.go:65.20,66.37 1 1 -github.com/muety/wakapi/models/filters.go:67.21,68.39 1 0 -github.com/muety/wakapi/models/filters.go:69.21,70.39 1 0 -github.com/muety/wakapi/models/filters.go:72.2,72.10 1 1 -github.com/muety/wakapi/models/filters.go:75.49,76.44 1 1 -github.com/muety/wakapi/models/filters.go:76.44,78.3 1 1 -github.com/muety/wakapi/models/filters.go:78.8,78.41 1 1 -github.com/muety/wakapi/models/filters.go:78.41,80.3 1 0 -github.com/muety/wakapi/models/filters.go:80.8,80.53 1 1 -github.com/muety/wakapi/models/filters.go:80.53,82.3 1 1 -github.com/muety/wakapi/models/filters.go:82.8,82.49 1 1 -github.com/muety/wakapi/models/filters.go:82.49,84.3 1 0 -github.com/muety/wakapi/models/filters.go:84.8,84.51 1 1 -github.com/muety/wakapi/models/filters.go:84.51,86.3 1 0 -github.com/muety/wakapi/models/filters.go:86.8,86.47 1 1 -github.com/muety/wakapi/models/filters.go:86.47,88.3 1 0 -github.com/muety/wakapi/models/filters.go:88.8,88.49 1 1 -github.com/muety/wakapi/models/filters.go:88.49,90.3 1 0 -github.com/muety/wakapi/models/filters.go:90.8,90.49 1 1 -github.com/muety/wakapi/models/filters.go:90.49,92.3 1 0 -github.com/muety/wakapi/models/filters.go:93.2,93.29 1 1 -github.com/muety/wakapi/models/filters.go:96.46,97.30 1 1 -github.com/muety/wakapi/models/filters.go:97.30,99.3 1 1 -github.com/muety/wakapi/models/filters.go:100.2,100.66 1 0 -github.com/muety/wakapi/models/filters.go:103.34,106.2 2 1 -github.com/muety/wakapi/models/filters.go:108.31,110.51 2 0 -github.com/muety/wakapi/models/filters.go:110.51,112.3 1 0 -github.com/muety/wakapi/models/filters.go:113.2,113.14 1 0 -github.com/muety/wakapi/models/filters.go:116.51,118.2 1 0 -github.com/muety/wakapi/models/filters.go:120.37,122.51 2 0 -github.com/muety/wakapi/models/filters.go:122.51,123.37 1 0 -github.com/muety/wakapi/models/filters.go:123.37,125.4 1 0 -github.com/muety/wakapi/models/filters.go:127.2,127.14 1 0 -github.com/muety/wakapi/models/filters.go:130.59,131.18 1 0 -github.com/muety/wakapi/models/filters.go:132.22,133.20 1 0 -github.com/muety/wakapi/models/filters.go:134.23,135.21 1 0 -github.com/muety/wakapi/models/filters.go:136.21,137.19 1 0 -github.com/muety/wakapi/models/filters.go:138.17,139.15 1 0 -github.com/muety/wakapi/models/filters.go:140.22,141.20 1 0 -github.com/muety/wakapi/models/filters.go:142.20,143.18 1 0 -github.com/muety/wakapi/models/filters.go:144.21,145.19 1 0 -github.com/muety/wakapi/models/filters.go:146.21,147.19 1 0 -github.com/muety/wakapi/models/filters.go:148.10,149.21 1 0 -github.com/muety/wakapi/models/filters.go:153.33,155.16 2 0 -github.com/muety/wakapi/models/filters.go:155.16,157.3 1 0 -github.com/muety/wakapi/models/filters.go:158.2,158.32 1 0 -github.com/muety/wakapi/models/filters.go:161.44,167.2 1 1 -github.com/muety/wakapi/models/filters.go:170.70,171.22 1 1 -github.com/muety/wakapi/models/filters.go:171.22,173.31 2 1 -github.com/muety/wakapi/models/filters.go:173.31,176.4 2 1 -github.com/muety/wakapi/models/filters.go:177.3,177.22 1 1 -github.com/muety/wakapi/models/filters.go:179.2,179.17 1 1 -github.com/muety/wakapi/models/filters.go:179.17,181.26 2 0 -github.com/muety/wakapi/models/filters.go:181.26,184.4 2 0 -github.com/muety/wakapi/models/filters.go:185.3,185.17 1 0 -github.com/muety/wakapi/models/filters.go:187.2,187.23 1 1 -github.com/muety/wakapi/models/filters.go:187.23,189.32 2 1 -github.com/muety/wakapi/models/filters.go:189.32,192.4 2 1 -github.com/muety/wakapi/models/filters.go:193.3,193.23 1 1 -github.com/muety/wakapi/models/filters.go:195.2,195.21 1 1 -github.com/muety/wakapi/models/filters.go:195.21,197.30 2 0 -github.com/muety/wakapi/models/filters.go:197.30,200.4 2 0 -github.com/muety/wakapi/models/filters.go:201.3,201.21 1 0 -github.com/muety/wakapi/models/filters.go:203.2,203.22 1 1 -github.com/muety/wakapi/models/filters.go:203.22,205.31 2 0 -github.com/muety/wakapi/models/filters.go:205.31,208.4 2 0 -github.com/muety/wakapi/models/filters.go:209.3,209.22 1 0 -github.com/muety/wakapi/models/filters.go:211.2,211.21 1 1 -github.com/muety/wakapi/models/filters.go:211.21,213.30 2 0 -github.com/muety/wakapi/models/filters.go:213.30,216.4 2 0 -github.com/muety/wakapi/models/filters.go:217.3,217.21 1 0 -github.com/muety/wakapi/models/filters.go:220.2,220.10 1 1 -github.com/muety/wakapi/models/filters.go:223.83,224.41 1 1 -github.com/muety/wakapi/models/filters.go:224.41,226.3 1 0 -github.com/muety/wakapi/models/filters.go:227.2,227.28 1 1 -github.com/muety/wakapi/models/filters.go:227.28,229.3 1 1 -github.com/muety/wakapi/models/filters.go:230.2,230.10 1 1 -github.com/muety/wakapi/models/filters.go:233.43,235.2 1 0 -github.com/muety/wakapi/models/heartbeat.go:34.34,36.2 1 1 -github.com/muety/wakapi/models/heartbeat.go:38.55,41.2 2 0 -github.com/muety/wakapi/models/heartbeat.go:43.43,49.80 1 0 -github.com/muety/wakapi/models/heartbeat.go:49.80,51.3 1 0 -github.com/muety/wakapi/models/heartbeat.go:53.2,56.10 3 0 -github.com/muety/wakapi/models/heartbeat.go:59.65,61.46 2 1 -github.com/muety/wakapi/models/heartbeat.go:61.46,62.108 1 1 -github.com/muety/wakapi/models/heartbeat.go:62.108,65.4 2 1 -github.com/muety/wakapi/models/heartbeat.go:69.50,70.11 1 1 -github.com/muety/wakapi/models/heartbeat.go:71.22,72.18 1 1 -github.com/muety/wakapi/models/heartbeat.go:73.21,74.17 1 1 -github.com/muety/wakapi/models/heartbeat.go:75.23,76.19 1 1 -github.com/muety/wakapi/models/heartbeat.go:77.17,78.26 1 1 -github.com/muety/wakapi/models/heartbeat.go:79.22,80.18 1 1 -github.com/muety/wakapi/models/heartbeat.go:81.21,82.17 1 0 -github.com/muety/wakapi/models/heartbeat.go:83.21,84.17 1 0 -github.com/muety/wakapi/models/heartbeat.go:87.2,87.15 1 1 -github.com/muety/wakapi/models/heartbeat.go:87.15,89.3 1 1 -github.com/muety/wakapi/models/heartbeat.go:91.2,91.12 1 1 -github.com/muety/wakapi/models/heartbeat.go:94.37,110.2 1 0 -github.com/muety/wakapi/models/heartbeat.go:118.41,120.16 2 1 -github.com/muety/wakapi/models/heartbeat.go:120.16,122.3 1 0 -github.com/muety/wakapi/models/heartbeat.go:123.2,124.10 2 1 -github.com/muety/wakapi/models/heartbeat.go:127.38,137.2 1 0 -github.com/muety/wakapi/models/heartbeats.go:7.31,9.2 1 0 -github.com/muety/wakapi/models/heartbeats.go:11.41,13.2 1 0 -github.com/muety/wakapi/models/heartbeats.go:15.36,17.2 1 0 -github.com/muety/wakapi/models/heartbeats.go:19.43,22.2 2 0 -github.com/muety/wakapi/models/heartbeats.go:24.41,26.18 1 0 -github.com/muety/wakapi/models/heartbeats.go:26.18,28.3 1 0 -github.com/muety/wakapi/models/heartbeats.go:29.2,29.16 1 0 -github.com/muety/wakapi/models/heartbeats.go:32.40,34.18 1 0 -github.com/muety/wakapi/models/heartbeats.go:34.18,36.3 1 0 -github.com/muety/wakapi/models/heartbeats.go:37.2,37.24 1 0 -github.com/muety/wakapi/models/interval.go:41.47,42.23 1 0 -github.com/muety/wakapi/models/interval.go:42.23,43.13 1 0 -github.com/muety/wakapi/models/interval.go:43.13,45.4 1 0 -github.com/muety/wakapi/models/interval.go:47.2,47.14 1 0 -github.com/muety/wakapi/models/language_mapping.go:11.42,13.2 1 0 -github.com/muety/wakapi/models/language_mapping.go:15.51,17.2 1 0 -github.com/muety/wakapi/models/language_mapping.go:19.52,21.2 1 0 -github.com/muety/wakapi/models/leaderboard.go:28.73,30.2 1 0 -github.com/muety/wakapi/models/leaderboard.go:34.56,35.103 1 0 -github.com/muety/wakapi/models/leaderboard.go:35.103,37.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:37.13,39.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:42.63,43.29 1 0 -github.com/muety/wakapi/models/leaderboard.go:43.29,45.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:48.41,49.123 1 0 -github.com/muety/wakapi/models/leaderboard.go:49.123,51.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:54.50,56.2 1 0 -github.com/muety/wakapi/models/leaderboard.go:58.65,59.95 1 0 -github.com/muety/wakapi/models/leaderboard.go:59.95,61.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:64.49,72.25 3 0 -github.com/muety/wakapi/models/leaderboard.go:72.25,73.58 1 0 -github.com/muety/wakapi/models/leaderboard.go:73.58,74.12 1 0 -github.com/muety/wakapi/models/leaderboard.go:76.3,77.38 2 0 -github.com/muety/wakapi/models/leaderboard.go:77.38,79.4 1 0 -github.com/muety/wakapi/models/leaderboard.go:80.3,80.40 1 0 -github.com/muety/wakapi/models/leaderboard.go:83.2,83.129 1 0 -github.com/muety/wakapi/models/leaderboard.go:83.129,85.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:86.2,86.67 1 0 -github.com/muety/wakapi/models/leaderboard.go:86.67,88.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:90.2,90.79 1 0 -github.com/muety/wakapi/models/leaderboard.go:90.79,92.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:95.70,96.107 1 0 -github.com/muety/wakapi/models/leaderboard.go:96.107,98.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:101.45,103.25 2 0 -github.com/muety/wakapi/models/leaderboard.go:103.25,104.43 1 0 -github.com/muety/wakapi/models/leaderboard.go:104.43,106.4 1 0 -github.com/muety/wakapi/models/leaderboard.go:108.2,108.19 1 0 -github.com/muety/wakapi/models/mail.go:23.44,27.2 3 0 -github.com/muety/wakapi/models/mail.go:29.44,33.2 3 0 -github.com/muety/wakapi/models/mail.go:35.34,36.18 1 0 -github.com/muety/wakapi/models/mail.go:36.18,38.3 1 0 -github.com/muety/wakapi/models/mail.go:39.2,39.21 1 0 -github.com/muety/wakapi/models/mail.go:39.21,41.3 1 0 -github.com/muety/wakapi/models/mail.go:42.2,42.23 1 0 -github.com/muety/wakapi/models/mail.go:42.23,44.3 1 0 -github.com/muety/wakapi/models/mail.go:45.2,45.10 1 0 -github.com/muety/wakapi/models/mail.go:48.32,67.2 1 0 -github.com/muety/wakapi/models/mail.go:69.41,71.2 1 0 -github.com/muety/wakapi/models/mail_address.go:18.13,21.2 2 1 -github.com/muety/wakapi/models/mail_address.go:27.38,29.2 1 0 -github.com/muety/wakapi/models/mail_address.go:31.35,33.21 2 1 -github.com/muety/wakapi/models/mail_address.go:33.21,34.21 1 1 -github.com/muety/wakapi/models/mail_address.go:34.21,36.4 1 1 -github.com/muety/wakapi/models/mail_address.go:37.3,37.18 1 1 -github.com/muety/wakapi/models/mail_address.go:39.2,39.11 1 1 -github.com/muety/wakapi/models/mail_address.go:42.38,44.21 2 0 -github.com/muety/wakapi/models/mail_address.go:44.21,46.3 1 0 -github.com/muety/wakapi/models/mail_address.go:47.2,47.17 1 0 -github.com/muety/wakapi/models/mail_address.go:50.35,52.2 1 1 -github.com/muety/wakapi/models/mail_address.go:54.43,56.22 2 0 -github.com/muety/wakapi/models/mail_address.go:56.22,58.3 1 0 -github.com/muety/wakapi/models/mail_address.go:59.2,59.12 1 0 -github.com/muety/wakapi/models/mail_address.go:62.46,64.22 2 1 -github.com/muety/wakapi/models/mail_address.go:64.22,66.3 1 1 -github.com/muety/wakapi/models/mail_address.go:67.2,67.12 1 1 -github.com/muety/wakapi/models/mail_address.go:70.40,71.22 1 1 -github.com/muety/wakapi/models/mail_address.go:71.22,72.17 1 1 -github.com/muety/wakapi/models/mail_address.go:72.17,74.4 1 1 -github.com/muety/wakapi/models/mail_address.go:76.2,76.13 1 1 -github.com/muety/wakapi/models/models.go:3.14,5.2 0 1 -github.com/muety/wakapi/models/project_label.go:14.39,16.2 1 0 -github.com/muety/wakapi/models/shared.go:38.52,40.2 1 0 -github.com/muety/wakapi/models/shared.go:42.52,45.16 3 0 -github.com/muety/wakapi/models/shared.go:45.16,47.3 1 0 -github.com/muety/wakapi/models/shared.go:48.2,50.12 3 0 -github.com/muety/wakapi/models/shared.go:53.52,59.22 2 0 -github.com/muety/wakapi/models/shared.go:60.14,64.17 2 0 -github.com/muety/wakapi/models/shared.go:64.17,66.4 1 0 -github.com/muety/wakapi/models/shared.go:67.17,69.8 2 0 -github.com/muety/wakapi/models/shared.go:70.10,71.64 1 0 -github.com/muety/wakapi/models/shared.go:74.2,77.12 3 0 -github.com/muety/wakapi/models/shared.go:80.51,83.2 2 0 -github.com/muety/wakapi/models/shared.go:85.45,87.2 1 1 -github.com/muety/wakapi/models/shared.go:89.37,91.2 1 0 -github.com/muety/wakapi/models/shared.go:93.35,95.2 1 1 -github.com/muety/wakapi/models/shared.go:97.34,99.2 1 0 -github.com/muety/wakapi/models/summary.go:66.29,68.2 1 1 -github.com/muety/wakapi/models/summary.go:70.35,72.2 1 0 -github.com/muety/wakapi/models/summary.go:74.38,76.2 1 0 -github.com/muety/wakapi/models/summary.go:78.37,88.2 9 1 -github.com/muety/wakapi/models/summary.go:90.35,92.2 1 1 -github.com/muety/wakapi/models/summary.go:94.57,105.2 1 1 -github.com/muety/wakapi/models/summary.go:107.64,108.21 1 1 -github.com/muety/wakapi/models/summary.go:109.22,110.21 1 1 -github.com/muety/wakapi/models/summary.go:111.23,112.22 1 1 -github.com/muety/wakapi/models/summary.go:113.21,114.20 1 1 -github.com/muety/wakapi/models/summary.go:115.17,116.29 1 1 -github.com/muety/wakapi/models/summary.go:117.22,118.21 1 1 -github.com/muety/wakapi/models/summary.go:119.20,120.19 1 1 -github.com/muety/wakapi/models/summary.go:121.21,122.21 1 1 -github.com/muety/wakapi/models/summary.go:123.21,124.21 1 1 -github.com/muety/wakapi/models/summary.go:126.2,126.12 1 0 -github.com/muety/wakapi/models/summary.go:129.59,130.21 1 1 -github.com/muety/wakapi/models/summary.go:130.21,132.3 1 1 -github.com/muety/wakapi/models/summary.go:134.2,134.35 1 1 -github.com/muety/wakapi/models/summary.go:134.35,135.41 1 1 -github.com/muety/wakapi/models/summary.go:135.41,137.4 1 1 -github.com/muety/wakapi/models/summary.go:140.2,140.10 1 1 -github.com/muety/wakapi/models/summary.go:156.33,161.26 4 1 -github.com/muety/wakapi/models/summary.go:161.26,162.30 1 1 -github.com/muety/wakapi/models/summary.go:162.30,164.4 1 1 -github.com/muety/wakapi/models/summary.go:168.2,168.37 1 1 -github.com/muety/wakapi/models/summary.go:168.37,170.3 1 0 -github.com/muety/wakapi/models/summary.go:173.2,174.16 2 1 -github.com/muety/wakapi/models/summary.go:174.16,176.3 1 0 -github.com/muety/wakapi/models/summary.go:177.2,177.33 1 1 -github.com/muety/wakapi/models/summary.go:177.33,179.3 1 1 -github.com/muety/wakapi/models/summary.go:183.56,189.28 5 1 -github.com/muety/wakapi/models/summary.go:189.28,191.3 1 1 -github.com/muety/wakapi/models/summary.go:193.2,194.42 2 1 -github.com/muety/wakapi/models/summary.go:194.42,195.22 1 0 -github.com/muety/wakapi/models/summary.go:195.22,197.9 2 0 -github.com/muety/wakapi/models/summary.go:201.2,202.15 2 1 -github.com/muety/wakapi/models/summary.go:202.15,203.28 1 1 -github.com/muety/wakapi/models/summary.go:203.28,205.4 1 0 -github.com/muety/wakapi/models/summary.go:205.9,211.4 1 1 -github.com/muety/wakapi/models/summary.go:215.45,220.16 4 1 -github.com/muety/wakapi/models/summary.go:220.16,222.3 1 0 -github.com/muety/wakapi/models/summary.go:223.2,223.39 1 1 -github.com/muety/wakapi/models/summary.go:223.39,225.3 1 1 -github.com/muety/wakapi/models/summary.go:227.2,227.30 1 1 -github.com/muety/wakapi/models/summary.go:230.73,232.55 2 1 -github.com/muety/wakapi/models/summary.go:232.55,233.31 1 1 -github.com/muety/wakapi/models/summary.go:233.31,235.4 1 1 -github.com/muety/wakapi/models/summary.go:237.2,237.16 1 1 -github.com/muety/wakapi/models/summary.go:240.88,242.55 2 1 -github.com/muety/wakapi/models/summary.go:242.55,243.31 1 1 -github.com/muety/wakapi/models/summary.go:243.31,244.23 1 1 -github.com/muety/wakapi/models/summary.go:244.23,245.13 1 1 -github.com/muety/wakapi/models/summary.go:247.4,247.46 1 1 -github.com/muety/wakapi/models/summary.go:250.2,250.16 1 1 -github.com/muety/wakapi/models/summary.go:253.73,255.34 2 1 -github.com/muety/wakapi/models/summary.go:255.34,257.3 1 1 -github.com/muety/wakapi/models/summary.go:258.2,258.14 1 1 -github.com/muety/wakapi/models/summary.go:261.56,264.55 3 0 -github.com/muety/wakapi/models/summary.go:264.55,265.31 1 0 -github.com/muety/wakapi/models/summary.go:265.31,266.44 1 0 -github.com/muety/wakapi/models/summary.go:266.44,268.5 1 0 -github.com/muety/wakapi/models/summary.go:271.2,271.12 1 0 -github.com/muety/wakapi/models/summary.go:274.58,276.16 2 0 -github.com/muety/wakapi/models/summary.go:276.16,278.3 1 0 -github.com/muety/wakapi/models/summary.go:279.2,279.16 1 0 -github.com/muety/wakapi/models/summary.go:282.71,283.63 1 1 -github.com/muety/wakapi/models/summary.go:283.63,284.20 1 1 -github.com/muety/wakapi/models/summary.go:284.20,286.4 1 1 -github.com/muety/wakapi/models/summary.go:288.3,290.45 2 1 -github.com/muety/wakapi/models/summary.go:290.45,291.32 1 1 -github.com/muety/wakapi/models/summary.go:291.32,292.24 1 1 -github.com/muety/wakapi/models/summary.go:292.24,294.6 1 1 -github.com/muety/wakapi/models/summary.go:296.4,296.14 1 1 -github.com/muety/wakapi/models/summary.go:299.3,299.31 1 1 -github.com/muety/wakapi/models/summary.go:299.31,301.60 1 1 -github.com/muety/wakapi/models/summary.go:301.60,303.5 1 1 -github.com/muety/wakapi/models/summary.go:306.3,306.31 1 1 -github.com/muety/wakapi/models/summary.go:306.31,308.60 1 1 -github.com/muety/wakapi/models/summary.go:308.60,309.55 1 1 -github.com/muety/wakapi/models/summary.go:309.55,311.6 1 1 -github.com/muety/wakapi/models/summary.go:311.11,319.6 1 1 -github.com/muety/wakapi/models/summary.go:323.3,323.16 1 1 -github.com/muety/wakapi/models/summary.go:327.2,336.10 8 1 -github.com/muety/wakapi/models/summary.go:339.57,340.30 1 1 -github.com/muety/wakapi/models/summary.go:340.30,341.28 1 1 -github.com/muety/wakapi/models/summary.go:341.28,343.4 1 1 -github.com/muety/wakapi/models/summary.go:345.2,345.43 1 0 -github.com/muety/wakapi/models/summary.go:348.43,350.2 1 0 -github.com/muety/wakapi/models/summary.go:352.49,353.21 1 0 -github.com/muety/wakapi/models/summary.go:353.21,355.3 1 0 -github.com/muety/wakapi/models/summary.go:356.2,357.54 2 0 -github.com/muety/wakapi/models/summary.go:360.51,361.27 1 0 -github.com/muety/wakapi/models/summary.go:361.27,363.3 1 0 -github.com/muety/wakapi/models/summary.go:364.2,365.19 2 0 -github.com/muety/wakapi/models/summary.go:368.50,372.2 1 1 -github.com/muety/wakapi/models/summary.go:374.33,376.2 1 1 -github.com/muety/wakapi/models/summary.go:378.43,380.2 1 1 -github.com/muety/wakapi/models/summary.go:382.38,384.2 1 1 -github.com/muety/wakapi/models/user.go:13.13,15.2 1 1 -github.com/muety/wakapi/models/user.go:90.34,92.2 1 0 -github.com/muety/wakapi/models/user.go:94.36,95.22 1 1 -github.com/muety/wakapi/models/user.go:95.22,97.3 1 1 -github.com/muety/wakapi/models/user.go:98.2,99.16 2 1 -github.com/muety/wakapi/models/user.go:99.16,101.3 1 0 -github.com/muety/wakapi/models/user.go:102.2,102.11 1 1 -github.com/muety/wakapi/models/user.go:107.41,110.2 2 1 -github.com/muety/wakapi/models/user.go:112.53,115.54 3 0 -github.com/muety/wakapi/models/user.go:115.54,117.3 1 0 -github.com/muety/wakapi/models/user.go:118.2,118.51 1 0 -github.com/muety/wakapi/models/user.go:118.51,120.3 1 0 -github.com/muety/wakapi/models/user.go:121.2,121.20 1 0 -github.com/muety/wakapi/models/user.go:125.52,126.28 1 0 -github.com/muety/wakapi/models/user.go:126.28,128.3 1 0 -github.com/muety/wakapi/models/user.go:129.2,129.17 1 0 -github.com/muety/wakapi/models/user.go:133.45,135.2 1 1 -github.com/muety/wakapi/models/user.go:137.51,139.2 1 1 -github.com/muety/wakapi/models/user.go:145.65,147.32 2 0 -github.com/muety/wakapi/models/user.go:147.32,149.3 1 0 -github.com/muety/wakapi/models/user.go:150.2,150.30 1 0 -github.com/muety/wakapi/models/user.go:150.30,152.3 1 0 -github.com/muety/wakapi/models/user.go:153.2,154.24 2 0 -github.com/muety/wakapi/models/user.go:157.39,159.55 2 1 -github.com/muety/wakapi/models/user.go:159.55,161.3 1 1 -github.com/muety/wakapi/models/user.go:163.2,163.51 1 1 -github.com/muety/wakapi/models/user.go:166.43,169.2 1 0 -github.com/muety/wakapi/models/user.go:171.45,174.2 1 0 -github.com/muety/wakapi/models/user.go:176.33,181.2 1 0 -github.com/muety/wakapi/models/user.go:183.41,185.2 1 0 -github.com/muety/wakapi/models/user.go:187.45,189.2 1 0 -github.com/muety/wakapi/models/user.go:191.45,193.2 1 0 -github.com/muety/wakapi/models/user.go:196.39,198.2 1 0 -github.com/muety/wakapi/models/user.go:200.39,203.2 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:23.116,29.2 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:31.60,32.34 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:32.34,35.3 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:47.70,49.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:49.16,51.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:53.2,54.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:54.16,58.3 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:60.2,61.46 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:64.116,73.29 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:73.29,75.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:77.2,85.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:85.16,87.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:89.2,89.36 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:29.124,34.2 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:36.62,37.34 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:37.34,40.3 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:52.72,54.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:54.16,56.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:58.2,61.16 4 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:61.16,65.3 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:67.2,71.16 4 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:71.16,76.3 4 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:78.2,84.47 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:23.123,29.2 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:31.61,32.34 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:32.34,35.3 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:48.71,50.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:50.16,52.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:54.2,55.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:55.16,60.3 4 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:62.2,65.28 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:65.28,66.30 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:66.30,68.4 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:71.2,72.46 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:22.112,28.2 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:30.58,31.34 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:31.34,41.3 5 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:62.68,68.53 5 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:68.53,70.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:72.2,73.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:73.16,77.3 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:81.2,81.22 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:81.22,82.100 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:82.100,84.4 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:84.9,86.4 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:89.2,90.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:90.16,94.3 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:96.2,98.69 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:98.69,102.3 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:104.2,105.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:105.16,109.3 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:111.2,118.33 6 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:118.33,120.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:121.2,121.35 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:121.35,123.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:124.2,124.34 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:124.34,126.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:127.2,127.29 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:127.29,129.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:130.2,130.34 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:130.34,132.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:134.2,134.49 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:137.136,146.16 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:146.16,148.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:150.2,150.36 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:29.120,35.2 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:37.62,38.34 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:38.34,43.3 4 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:55.72,57.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:57.16,59.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:61.2,62.22 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:62.22,64.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:66.2,67.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:67.16,71.3 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:73.2,74.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:74.16,78.3 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:79.2,83.4 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:86.115,95.29 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:95.29,97.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:99.2,100.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:100.16,102.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:104.2,104.36 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:27.120,33.2 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:35.62,36.34 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:36.34,39.3 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:65.72,67.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:67.16,69.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:71.2,72.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:72.16,76.3 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:78.2,79.46 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:82.114,87.19 4 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:87.19,88.56 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:88.56,90.4 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:93.2,94.22 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:94.22,96.98 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:96.98,98.4 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:98.9,100.4 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:101.8,101.130 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:101.130,104.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:104.8,109.17 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:109.17,111.4 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:113.3,114.17 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:114.17,116.4 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:123.2,137.37 6 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:137.37,139.17 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:139.17,141.4 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:143.3,145.25 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/summaries.go:148.2,148.38 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:21.116,27.2 1 1 +github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:29.58,30.34 1 1 +github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:30.34,33.3 2 1 +github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:45.68,47.16 2 1 +github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:47.16,49.3 1 1 +github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:51.2,52.72 2 1 +github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:52.72,54.3 1 1 +github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:54.8,56.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/users.go:58.2,58.72 1 1 diff --git a/helpers/interval.go b/helpers/interval.go new file mode 100644 index 0000000..e5e3530 --- /dev/null +++ b/helpers/interval.go @@ -0,0 +1,107 @@ +package helpers + +import ( + "errors" + "github.com/muety/wakapi/models" + "github.com/muety/wakapi/utils" + "time" +) + +func ParseInterval(interval string) (*models.IntervalKey, error) { + for _, i := range models.AllIntervals { + if i.HasAlias(interval) { + return i, nil + } + } + return nil, errors.New("not a valid interval") +} + +func MustParseInterval(interval string) *models.IntervalKey { + key, _ := ParseInterval(interval) + return key +} + +func MustResolveIntervalRawTZ(interval string, tz *time.Location) (from, to time.Time) { + _, from, to = ResolveIntervalRawTZ(interval, tz) + return from, to +} + +func ResolveIntervalRawTZ(interval string, tz *time.Location) (err error, from, to time.Time) { + parsed, err := ParseInterval(interval) + if err != nil { + return err, time.Time{}, time.Time{} + } + return ResolveIntervalTZ(parsed, tz) +} + +func ResolveIntervalTZ(interval *models.IntervalKey, tz *time.Location) (err error, from, to time.Time) { + now := time.Now().In(tz) + to = now + + switch interval { + case models.IntervalToday: + from = utils.BeginOfToday(tz) + case models.IntervalYesterday: + from = utils.BeginOfToday(tz).Add(-24 * time.Hour) + to = utils.BeginOfToday(tz) + case models.IntervalPastDay: + from = now.Add(-24 * time.Hour) + case models.IntervalThisWeek: + from = utils.BeginOfThisWeek(tz) + case models.IntervalLastWeek: + from = utils.BeginOfThisWeek(tz).AddDate(0, 0, -7) + to = utils.BeginOfThisWeek(tz) + case models.IntervalThisMonth: + from = utils.BeginOfThisMonth(tz) + case models.IntervalLastMonth: + from = utils.BeginOfThisMonth(tz).AddDate(0, -1, 0) + to = utils.BeginOfThisMonth(tz) + case models.IntervalThisYear: + from = utils.BeginOfThisYear(tz) + case models.IntervalPast7Days: + from = now.AddDate(0, 0, -7) + case models.IntervalPast7DaysYesterday: + from = utils.BeginOfToday(tz).AddDate(0, 0, -1).AddDate(0, 0, -7) + to = utils.BeginOfToday(tz).AddDate(0, 0, -1) + case models.IntervalPast14Days: + from = now.AddDate(0, 0, -14) + case models.IntervalPast30Days: + from = now.AddDate(0, 0, -30) + case models.IntervalPast6Months: + from = now.AddDate(0, -6, 0) + case models.IntervalPast12Months: + from = now.AddDate(0, -12, 0) + case models.IntervalAny: + from = time.Time{} + default: + err = errors.New("invalid interval") + } + + return err, from, to +} + +// ResolveClosestRange returns the interval label (e.g. "last_7_days") of the maximum allowed range when having opted to share this many days or an error for days == 0. +func ResolveMaximumRange(days int) (error, *models.IntervalKey) { + if days == 0 { + return errors.New("no matching interval"), nil + } + if days < 0 { + return nil, models.IntervalAny + } + if days < 7 { + return nil, models.IntervalPastDay + } + if days < 14 { + return nil, models.IntervalPast7Days + } + if days < 30 { + return nil, models.IntervalPast14Days + } + if days < 181 { // 3*31 + 2*30 + 1*28 + return nil, models.IntervalPast30Days + } + if days < 365 { // 7*31 + 4*30 + 1*28 + return nil, models.IntervalPast6Months + } + return nil, models.IntervalPast12Months +} diff --git a/helpers/interval_test.go b/helpers/interval_test.go new file mode 100644 index 0000000..d2b0100 --- /dev/null +++ b/helpers/interval_test.go @@ -0,0 +1,27 @@ +package helpers + +import ( + "github.com/muety/wakapi/models" + "github.com/stretchr/testify/assert" + "testing" + "time" +) + +func TestResolveMaximumRange_Default(t *testing.T) { + for i := 1; i <= 366; i++ { + err1, maximumInterval := ResolveMaximumRange(i) + err2, from, to := ResolveIntervalTZ(maximumInterval, time.UTC) + + assert.Nil(t, err1) + assert.Nil(t, err2) + assert.LessOrEqual(t, to.Sub(from), time.Duration(i*24)*time.Hour) + } +} + +func TestResolveMaximumRange_EdgeCases(t *testing.T) { + err, _ := ResolveMaximumRange(0) + assert.NotNil(t, err) + + _, maximumInterval := ResolveMaximumRange(-1) + assert.Equal(t, models.IntervalAny, maximumInterval) +} diff --git a/helpers/summary.go b/helpers/summary.go index 8fe07aa..00305c2 100644 --- a/helpers/summary.go +++ b/helpers/summary.go @@ -3,7 +3,6 @@ package helpers import ( "errors" "github.com/muety/wakapi/models" - "github.com/muety/wakapi/utils" "net/http" "time" ) @@ -82,69 +81,3 @@ func extractUser(r *http.Request) *models.User { } return nil } - -func ParseInterval(interval string) (*models.IntervalKey, error) { - for _, i := range models.AllIntervals { - if i.HasAlias(interval) { - return i, nil - } - } - return nil, errors.New("not a valid interval") -} - -func MustResolveIntervalRawTZ(interval string, tz *time.Location) (from, to time.Time) { - _, from, to = ResolveIntervalRawTZ(interval, tz) - return from, to -} - -func ResolveIntervalRawTZ(interval string, tz *time.Location) (err error, from, to time.Time) { - parsed, err := ParseInterval(interval) - if err != nil { - return err, time.Time{}, time.Time{} - } - return ResolveIntervalTZ(parsed, tz) -} - -func ResolveIntervalTZ(interval *models.IntervalKey, tz *time.Location) (err error, from, to time.Time) { - now := time.Now().In(tz) - to = now - - switch interval { - case models.IntervalToday: - from = utils.BeginOfToday(tz) - case models.IntervalYesterday: - from = utils.BeginOfToday(tz).Add(-24 * time.Hour) - to = utils.BeginOfToday(tz) - case models.IntervalThisWeek: - from = utils.BeginOfThisWeek(tz) - case models.IntervalLastWeek: - from = utils.BeginOfThisWeek(tz).AddDate(0, 0, -7) - to = utils.BeginOfThisWeek(tz) - case models.IntervalThisMonth: - from = utils.BeginOfThisMonth(tz) - case models.IntervalLastMonth: - from = utils.BeginOfThisMonth(tz).AddDate(0, -1, 0) - to = utils.BeginOfThisMonth(tz) - case models.IntervalThisYear: - from = utils.BeginOfThisYear(tz) - case models.IntervalPast7Days: - from = now.AddDate(0, 0, -7) - case models.IntervalPast7DaysYesterday: - from = utils.BeginOfToday(tz).AddDate(0, 0, -1).AddDate(0, 0, -7) - to = utils.BeginOfToday(tz).AddDate(0, 0, -1) - case models.IntervalPast14Days: - from = now.AddDate(0, 0, -14) - case models.IntervalPast30Days: - from = now.AddDate(0, 0, -30) - case models.IntervalPast6Months: - from = now.AddDate(0, -6, 0) - case models.IntervalPast12Months: - from = now.AddDate(0, -12, 0) - case models.IntervalAny: - from = time.Time{} - default: - err = errors.New("invalid interval") - } - - return err, from, to -} diff --git a/models/compat/wakatime/v1/stats.go b/models/compat/wakatime/v1/stats.go index 67a5f86..e584da3 100644 --- a/models/compat/wakatime/v1/stats.go +++ b/models/compat/wakatime/v1/stats.go @@ -1,6 +1,7 @@ package v1 import ( + "github.com/muety/wakapi/helpers" "github.com/muety/wakapi/models" "math" "time" @@ -14,19 +15,26 @@ type StatsViewModel struct { } type StatsData struct { - Username string `json:"username"` - UserId string `json:"user_id"` - Start time.Time `json:"start"` - End time.Time `json:"end"` - TotalSeconds float64 `json:"total_seconds"` - DailyAverage float64 `json:"daily_average"` - DaysIncludingHolidays int `json:"days_including_holidays"` - Editors []*SummariesEntry `json:"editors"` - Languages []*SummariesEntry `json:"languages"` - Machines []*SummariesEntry `json:"machines"` - Projects []*SummariesEntry `json:"projects"` - OperatingSystems []*SummariesEntry `json:"operating_systems"` - Branches []*SummariesEntry `json:"branches,omitempty"` + Username string `json:"username"` + UserId string `json:"user_id"` + Start time.Time `json:"start"` + End time.Time `json:"end"` + Status string `json:"status"` + TotalSeconds float64 `json:"total_seconds"` + DailyAverage float64 `json:"daily_average"` + DaysIncludingHolidays int `json:"days_including_holidays"` + Range string `json:"range"` + HumanReadableRange string `json:"human_readable_range"` + HumanReadableTotal string `json:"human_readable_total"` + HumanReadableDailyAverage string `json:"human_readable_daily_average"` + IsCodingActivityVisible bool `json:"is_coding_activity_visible"` + IsOtherUsageVisible bool `json:"is_other_usage_visible"` + Editors []*SummariesEntry `json:"editors"` + Languages []*SummariesEntry `json:"languages"` + Machines []*SummariesEntry `json:"machines"` + Projects []*SummariesEntry `json:"projects"` + OperatingSystems []*SummariesEntry `json:"operating_systems"` + Branches []*SummariesEntry `json:"branches,omitempty"` } func NewStatsFrom(summary *models.Summary, filters *models.Filters) *StatsViewModel { @@ -38,11 +46,16 @@ func NewStatsFrom(summary *models.Summary, filters *models.Filters) *StatsViewMo UserId: summary.UserID, Start: summary.FromTime.T(), End: summary.ToTime.T(), + Status: "ok", TotalSeconds: totalTime.Seconds(), - DailyAverage: totalTime.Seconds() / float64(numDays), DaysIncludingHolidays: numDays, + HumanReadableTotal: helpers.FmtWakatimeDuration(totalTime), } + if numDays > 0 { + data.DailyAverage = totalTime.Seconds() / float64(numDays) + data.HumanReadableDailyAverage = helpers.FmtWakatimeDuration(totalTime / time.Duration(numDays)) + } if math.IsInf(data.DailyAverage, 0) || math.IsNaN(data.DailyAverage) { data.DailyAverage = 0 } diff --git a/models/interval.go b/models/interval.go index 0067244..6e4f721 100644 --- a/models/interval.go +++ b/models/interval.go @@ -1,27 +1,33 @@ package models +import ( + "unicode" +) + // Support Wakapi and WakaTime range / interval identifiers // See https://wakatime.com/developers/#summaries var ( IntervalToday = &IntervalKey{"today", "Today"} IntervalYesterday = &IntervalKey{"day", "yesterday", "Yesterday"} + IntervalPastDay = &IntervalKey{"24_hours", "last_24_hours", "last_day", "Last 24 Hours"} // non-official one IntervalThisWeek = &IntervalKey{"week", "This Week"} - IntervalLastWeek = &IntervalKey{"Last Week"} + IntervalLastWeek = &IntervalKey{"last_week", "Last Week"} IntervalThisMonth = &IntervalKey{"month", "This Month"} - IntervalLastMonth = &IntervalKey{"Last Month"} - IntervalThisYear = &IntervalKey{"year"} + IntervalLastMonth = &IntervalKey{"last_month", "Last Month"} + IntervalThisYear = &IntervalKey{"year", "This Year"} IntervalPast7Days = &IntervalKey{"7_days", "last_7_days", "Last 7 Days"} IntervalPast7DaysYesterday = &IntervalKey{"Last 7 Days from Yesterday"} - IntervalPast14Days = &IntervalKey{"Last 14 Days"} + IntervalPast14Days = &IntervalKey{"14_days", "last_14_days", "Last 14 Days"} IntervalPast30Days = &IntervalKey{"30_days", "last_30_days", "Last 30 Days"} - IntervalPast6Months = &IntervalKey{"6_months", "last_6_months"} - IntervalPast12Months = &IntervalKey{"12_months", "last_12_months", "last_year"} - IntervalAny = &IntervalKey{"any", "all_time"} + IntervalPast6Months = &IntervalKey{"6_months", "last_6_months", "Last 6 Months"} + IntervalPast12Months = &IntervalKey{"12_months", "last_12_months", "last_year", "Last 12 Months"} + IntervalAny = &IntervalKey{"any", "all_time", "All Time"} ) var AllIntervals = []*IntervalKey{ IntervalToday, IntervalYesterday, + IntervalPastDay, IntervalThisWeek, IntervalLastWeek, IntervalThisMonth, @@ -46,3 +52,12 @@ func (k *IntervalKey) HasAlias(s string) bool { } return false } + +func (k *IntervalKey) GetHumanReadable() string { + for _, s := range *k { + if unicode.IsUpper(rune(s[0])) { + return s + } + } + return "" +} diff --git a/models/user.go b/models/user.go index e1929e0..ae88c97 100644 --- a/models/user.go +++ b/models/user.go @@ -163,6 +163,10 @@ func (u *User) MinDataAge() time.Time { return time.Now().AddDate(0, -retentionMonths, 0) } +func (u *User) AnyDataShared() bool { + return u.ShareDataMaxDays != 0 && (u.ShareEditors || u.ShareLanguages || u.ShareProjects || u.ShareOSs || u.ShareMachines || u.ShareLabels) +} + func (c *CredentialsReset) IsValid() bool { return ValidatePassword(c.PasswordNew) && c.PasswordNew == c.PasswordRepeat diff --git a/routes/compat/wakatime/v1/stats.go b/routes/compat/wakatime/v1/stats.go index 1e62817..26434a1 100644 --- a/routes/compat/wakatime/v1/stats.go +++ b/routes/compat/wakatime/v1/stats.go @@ -76,8 +76,14 @@ func (h *StatsHandler) Get(w http.ResponseWriter, r *http.Request) { return } + // if no range was requested, get the maximum allowed range given the users max shared days, otherwise default to past 7 days (which will fail in the next step, because user didn't allow any sharing) + // this "floors" the user's maximum shared date to the supported range buckets (e.g. if user opted to share 12 days, we'll still fallback to "last_7_days") for consistency with wakatime if rangeParam == "" { - rangeParam = (*models.IntervalPast7Days)[0] + if _, userRange := helpers.ResolveMaximumRange(requestedUser.ShareDataMaxDays); userRange != nil { + rangeParam = (*userRange)[1] + } else { + rangeParam = (*models.IntervalPast7Days)[1] + } } err, rangeFrom, rangeTo := helpers.ResolveIntervalRawTZ(rangeParam, requestedUser.TZ()) @@ -103,6 +109,10 @@ func (h *StatsHandler) Get(w http.ResponseWriter, r *http.Request) { } stats := v1.NewStatsFrom(summary, &models.Filters{}) + stats.Data.Range = rangeParam + stats.Data.HumanReadableRange = helpers.MustParseInterval(rangeParam).GetHumanReadable() + stats.Data.IsCodingActivityVisible = requestedUser.ShareDataMaxDays != 0 + stats.Data.IsOtherUsageVisible = requestedUser.AnyDataShared() // post filter stats according to user's given sharing permissions if !requestedUser.ShareEditors {