diff --git a/coverage/coverage.out b/coverage/coverage.out index 3b0cc50..c2fc402 100644 --- a/coverage/coverage.out +++ b/coverage/coverage.out @@ -1,58 +1,12 @@ mode: set -github.com/muety/wakapi/models/filters.go:16.56,17.16 1 0 -github.com/muety/wakapi/models/filters.go:29.2,29.19 1 0 -github.com/muety/wakapi/models/filters.go:18.22,19.32 1 0 -github.com/muety/wakapi/models/filters.go:20.17,21.27 1 0 -github.com/muety/wakapi/models/filters.go:22.23,23.33 1 0 -github.com/muety/wakapi/models/filters.go:24.21,25.31 1 0 -github.com/muety/wakapi/models/filters.go:26.22,27.32 1 0 -github.com/muety/wakapi/models/filters.go:32.47,33.21 1 1 -github.com/muety/wakapi/models/filters.go:44.2,44.21 1 1 -github.com/muety/wakapi/models/filters.go:33.21,35.3 1 1 -github.com/muety/wakapi/models/filters.go:35.8,35.23 1 1 -github.com/muety/wakapi/models/filters.go:35.23,37.3 1 0 -github.com/muety/wakapi/models/filters.go:37.8,37.29 1 1 -github.com/muety/wakapi/models/filters.go:37.29,39.3 1 1 -github.com/muety/wakapi/models/filters.go:39.8,39.27 1 1 -github.com/muety/wakapi/models/filters.go:39.27,41.3 1 0 -github.com/muety/wakapi/models/filters.go:41.8,41.28 1 1 -github.com/muety/wakapi/models/filters.go:41.28,43.3 1 0 -github.com/muety/wakapi/models/heartbeat.go:32.34,34.2 1 1 -github.com/muety/wakapi/models/heartbeat.go:36.65,38.46 2 1 -github.com/muety/wakapi/models/heartbeat.go:38.46,39.108 1 1 -github.com/muety/wakapi/models/heartbeat.go:39.108,42.4 2 1 -github.com/muety/wakapi/models/heartbeat.go:46.50,47.11 1 1 -github.com/muety/wakapi/models/heartbeat.go:60.2,60.15 1 1 -github.com/muety/wakapi/models/heartbeat.go:64.2,64.12 1 1 -github.com/muety/wakapi/models/heartbeat.go:48.22,49.18 1 1 -github.com/muety/wakapi/models/heartbeat.go:50.21,51.17 1 1 -github.com/muety/wakapi/models/heartbeat.go:52.23,53.19 1 1 -github.com/muety/wakapi/models/heartbeat.go:54.17,55.26 1 1 -github.com/muety/wakapi/models/heartbeat.go:56.22,57.18 1 1 -github.com/muety/wakapi/models/heartbeat.go:60.15,62.3 1 1 -github.com/muety/wakapi/models/heartbeat.go:67.37,83.2 1 0 -github.com/muety/wakapi/models/heartbeat.go:91.41,93.16 2 0 -github.com/muety/wakapi/models/heartbeat.go:96.2,97.10 2 0 -github.com/muety/wakapi/models/heartbeat.go:93.16,95.3 1 0 -github.com/muety/wakapi/models/mail_address.go:15.13,18.2 2 1 -github.com/muety/wakapi/models/mail_address.go:24.38,26.2 1 0 -github.com/muety/wakapi/models/mail_address.go:28.35,30.21 2 1 -github.com/muety/wakapi/models/mail_address.go:36.2,36.11 1 1 -github.com/muety/wakapi/models/mail_address.go:30.21,31.21 1 1 -github.com/muety/wakapi/models/mail_address.go:34.3,34.18 1 1 -github.com/muety/wakapi/models/mail_address.go:31.21,33.4 1 1 -github.com/muety/wakapi/models/mail_address.go:39.35,41.2 1 1 -github.com/muety/wakapi/models/mail_address.go:43.43,45.22 2 0 -github.com/muety/wakapi/models/mail_address.go:48.2,48.12 1 0 -github.com/muety/wakapi/models/mail_address.go:45.22,47.3 1 0 -github.com/muety/wakapi/models/mail_address.go:51.46,53.22 2 1 -github.com/muety/wakapi/models/mail_address.go:56.2,56.12 1 1 -github.com/muety/wakapi/models/mail_address.go:53.22,55.3 1 1 -github.com/muety/wakapi/models/mail_address.go:59.40,60.22 1 1 -github.com/muety/wakapi/models/mail_address.go:65.2,65.13 1 1 -github.com/muety/wakapi/models/mail_address.go:60.22,61.17 1 1 -github.com/muety/wakapi/models/mail_address.go:61.17,63.4 1 1 -github.com/muety/wakapi/models/models.go:3.14,5.2 0 1 +github.com/muety/wakapi/models/interval.go:39.47,40.23 1 0 +github.com/muety/wakapi/models/interval.go:45.2,45.14 1 0 +github.com/muety/wakapi/models/interval.go:40.23,41.13 1 0 +github.com/muety/wakapi/models/interval.go:41.13,43.4 1 0 +github.com/muety/wakapi/models/mail.go:19.44,23.2 3 0 +github.com/muety/wakapi/models/mail.go:25.44,29.2 3 0 +github.com/muety/wakapi/models/mail.go:31.32,44.2 1 0 +github.com/muety/wakapi/models/mail.go:46.41,48.2 1 0 github.com/muety/wakapi/models/summary.go:70.29,72.2 1 1 github.com/muety/wakapi/models/summary.go:74.37,81.2 6 1 github.com/muety/wakapi/models/summary.go:83.35,85.2 1 1 @@ -104,6 +58,70 @@ github.com/muety/wakapi/models/summary.go:238.50,242.2 1 0 github.com/muety/wakapi/models/summary.go:244.33,246.2 1 1 github.com/muety/wakapi/models/summary.go:248.43,250.2 1 1 github.com/muety/wakapi/models/summary.go:252.38,254.2 1 1 +github.com/muety/wakapi/models/heartbeat.go:32.34,34.2 1 1 +github.com/muety/wakapi/models/heartbeat.go:36.65,38.46 2 1 +github.com/muety/wakapi/models/heartbeat.go:38.46,39.108 1 1 +github.com/muety/wakapi/models/heartbeat.go:39.108,42.4 2 1 +github.com/muety/wakapi/models/heartbeat.go:46.50,47.11 1 1 +github.com/muety/wakapi/models/heartbeat.go:60.2,60.15 1 1 +github.com/muety/wakapi/models/heartbeat.go:64.2,64.12 1 1 +github.com/muety/wakapi/models/heartbeat.go:48.22,49.18 1 1 +github.com/muety/wakapi/models/heartbeat.go:50.21,51.17 1 1 +github.com/muety/wakapi/models/heartbeat.go:52.23,53.19 1 1 +github.com/muety/wakapi/models/heartbeat.go:54.17,55.26 1 1 +github.com/muety/wakapi/models/heartbeat.go:56.22,57.18 1 1 +github.com/muety/wakapi/models/heartbeat.go:60.15,62.3 1 1 +github.com/muety/wakapi/models/heartbeat.go:67.37,83.2 1 0 +github.com/muety/wakapi/models/heartbeat.go:91.41,93.16 2 0 +github.com/muety/wakapi/models/heartbeat.go:96.2,97.10 2 0 +github.com/muety/wakapi/models/heartbeat.go:93.16,95.3 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:29.2,29.16 1 0 +github.com/muety/wakapi/models/heartbeats.go:26.18,28.3 1 0 +github.com/muety/wakapi/models/heartbeats.go:32.40,34.18 1 0 +github.com/muety/wakapi/models/heartbeats.go:37.2,37.24 1 0 +github.com/muety/wakapi/models/heartbeats.go:34.18,36.3 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/mail_address.go:15.13,18.2 2 1 +github.com/muety/wakapi/models/mail_address.go:24.38,26.2 1 0 +github.com/muety/wakapi/models/mail_address.go:28.35,30.21 2 1 +github.com/muety/wakapi/models/mail_address.go:36.2,36.11 1 1 +github.com/muety/wakapi/models/mail_address.go:30.21,31.21 1 1 +github.com/muety/wakapi/models/mail_address.go:34.3,34.18 1 1 +github.com/muety/wakapi/models/mail_address.go:31.21,33.4 1 1 +github.com/muety/wakapi/models/mail_address.go:39.35,41.2 1 1 +github.com/muety/wakapi/models/mail_address.go:43.43,45.22 2 0 +github.com/muety/wakapi/models/mail_address.go:48.2,48.12 1 0 +github.com/muety/wakapi/models/mail_address.go:45.22,47.3 1 0 +github.com/muety/wakapi/models/mail_address.go:51.46,53.22 2 1 +github.com/muety/wakapi/models/mail_address.go:56.2,56.12 1 1 +github.com/muety/wakapi/models/mail_address.go:53.22,55.3 1 1 +github.com/muety/wakapi/models/mail_address.go:59.40,60.22 1 1 +github.com/muety/wakapi/models/mail_address.go:65.2,65.13 1 1 +github.com/muety/wakapi/models/mail_address.go:60.22,61.17 1 1 +github.com/muety/wakapi/models/mail_address.go:61.17,63.4 1 1 +github.com/muety/wakapi/models/models.go:3.14,5.2 0 1 +github.com/muety/wakapi/models/shared.go:35.52,37.2 1 0 +github.com/muety/wakapi/models/shared.go:39.52,42.16 3 0 +github.com/muety/wakapi/models/shared.go:45.2,47.12 3 0 +github.com/muety/wakapi/models/shared.go:42.16,44.3 1 0 +github.com/muety/wakapi/models/shared.go:50.52,56.22 2 0 +github.com/muety/wakapi/models/shared.go:71.2,74.12 3 0 +github.com/muety/wakapi/models/shared.go:57.14,61.17 2 0 +github.com/muety/wakapi/models/shared.go:64.17,66.8 2 0 +github.com/muety/wakapi/models/shared.go:67.10,68.64 1 0 +github.com/muety/wakapi/models/shared.go:61.17,63.4 1 0 +github.com/muety/wakapi/models/shared.go:77.51,80.2 2 0 +github.com/muety/wakapi/models/shared.go:82.45,84.2 1 0 +github.com/muety/wakapi/models/shared.go:86.37,88.2 1 0 +github.com/muety/wakapi/models/shared.go:90.35,92.2 1 0 +github.com/muety/wakapi/models/shared.go:94.34,96.2 1 0 github.com/muety/wakapi/models/user.go:8.13,10.2 1 1 github.com/muety/wakapi/models/user.go:78.36,79.22 1 1 github.com/muety/wakapi/models/user.go:82.2,83.16 2 1 @@ -124,178 +142,24 @@ github.com/muety/wakapi/models/alias.go:16.37,17.35 1 0 github.com/muety/wakapi/models/alias.go:22.2,22.14 1 0 github.com/muety/wakapi/models/alias.go:17.35,18.18 1 0 github.com/muety/wakapi/models/alias.go:18.18,20.4 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:29.2,29.16 1 0 -github.com/muety/wakapi/models/heartbeats.go:26.18,28.3 1 0 -github.com/muety/wakapi/models/heartbeats.go:32.40,34.18 1 0 -github.com/muety/wakapi/models/heartbeats.go:37.2,37.24 1 0 -github.com/muety/wakapi/models/heartbeats.go:34.18,36.3 1 0 -github.com/muety/wakapi/models/interval.go:39.47,40.23 1 0 -github.com/muety/wakapi/models/interval.go:45.2,45.14 1 0 -github.com/muety/wakapi/models/interval.go:40.23,41.13 1 0 -github.com/muety/wakapi/models/interval.go:41.13,43.4 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/mail.go:19.44,23.2 3 0 -github.com/muety/wakapi/models/mail.go:25.44,29.2 3 0 -github.com/muety/wakapi/models/mail.go:31.32,44.2 1 0 -github.com/muety/wakapi/models/mail.go:46.41,48.2 1 0 -github.com/muety/wakapi/models/shared.go:35.52,37.2 1 0 -github.com/muety/wakapi/models/shared.go:39.52,42.16 3 0 -github.com/muety/wakapi/models/shared.go:45.2,47.12 3 0 -github.com/muety/wakapi/models/shared.go:42.16,44.3 1 0 -github.com/muety/wakapi/models/shared.go:50.52,56.22 2 0 -github.com/muety/wakapi/models/shared.go:71.2,74.12 3 0 -github.com/muety/wakapi/models/shared.go:57.14,61.17 2 0 -github.com/muety/wakapi/models/shared.go:64.17,66.8 2 0 -github.com/muety/wakapi/models/shared.go:67.10,68.64 1 0 -github.com/muety/wakapi/models/shared.go:61.17,63.4 1 0 -github.com/muety/wakapi/models/shared.go:77.51,80.2 2 0 -github.com/muety/wakapi/models/shared.go:82.45,84.2 1 0 -github.com/muety/wakapi/models/shared.go:86.37,88.2 1 0 -github.com/muety/wakapi/models/shared.go:90.35,92.2 1 0 -github.com/muety/wakapi/models/shared.go:94.34,96.2 1 0 -github.com/muety/wakapi/utils/auth.go:16.79,18.54 2 0 -github.com/muety/wakapi/utils/auth.go:22.2,24.16 3 0 -github.com/muety/wakapi/utils/auth.go:28.2,30.45 3 0 -github.com/muety/wakapi/utils/auth.go:33.2,34.32 2 0 -github.com/muety/wakapi/utils/auth.go:18.54,20.3 1 0 -github.com/muety/wakapi/utils/auth.go:24.16,26.3 1 0 -github.com/muety/wakapi/utils/auth.go:30.45,32.3 1 0 -github.com/muety/wakapi/utils/auth.go:37.65,39.85 2 0 -github.com/muety/wakapi/utils/auth.go:43.2,44.30 2 0 -github.com/muety/wakapi/utils/auth.go:39.85,41.3 1 0 -github.com/muety/wakapi/utils/auth.go:47.94,49.16 2 0 -github.com/muety/wakapi/utils/auth.go:53.2,53.107 1 0 -github.com/muety/wakapi/utils/auth.go:57.2,57.22 1 0 -github.com/muety/wakapi/utils/auth.go:49.16,51.3 1 0 -github.com/muety/wakapi/utils/auth.go:53.107,55.3 1 0 -github.com/muety/wakapi/utils/auth.go:60.56,64.2 3 0 -github.com/muety/wakapi/utils/auth.go:66.55,69.16 3 0 -github.com/muety/wakapi/utils/auth.go:72.2,72.16 1 0 -github.com/muety/wakapi/utils/auth.go:69.16,71.3 1 0 -github.com/muety/wakapi/utils/color.go:8.90,10.32 2 0 -github.com/muety/wakapi/utils/color.go:15.2,15.15 1 0 -github.com/muety/wakapi/utils/color.go:10.32,11.50 1 0 -github.com/muety/wakapi/utils/color.go:11.50,13.4 1 0 -github.com/muety/wakapi/utils/common.go:18.73,19.58 1 0 -github.com/muety/wakapi/utils/common.go:22.2,22.87 1 0 -github.com/muety/wakapi/utils/common.go:25.2,25.64 1 0 -github.com/muety/wakapi/utils/common.go:19.58,21.3 1 0 -github.com/muety/wakapi/utils/common.go:22.87,24.3 1 0 -github.com/muety/wakapi/utils/common.go:28.40,30.2 1 0 -github.com/muety/wakapi/utils/common.go:32.44,34.2 1 0 -github.com/muety/wakapi/utils/common.go:36.49,38.2 1 0 -github.com/muety/wakapi/utils/common.go:40.45,42.2 1 0 -github.com/muety/wakapi/utils/common.go:44.24,46.2 1 0 -github.com/muety/wakapi/utils/common.go:48.56,51.45 3 1 -github.com/muety/wakapi/utils/common.go:54.2,54.40 1 1 -github.com/muety/wakapi/utils/common.go:51.45,53.3 1 1 -github.com/muety/wakapi/utils/filesystem.go:14.68,16.16 2 0 -github.com/muety/wakapi/utils/filesystem.go:20.2,21.15 2 0 -github.com/muety/wakapi/utils/filesystem.go:33.2,33.15 1 0 -github.com/muety/wakapi/utils/filesystem.go:16.16,18.3 1 0 -github.com/muety/wakapi/utils/filesystem.go:21.15,23.47 2 0 -github.com/muety/wakapi/utils/filesystem.go:23.47,25.23 2 0 -github.com/muety/wakapi/utils/filesystem.go:29.4,29.19 1 0 -github.com/muety/wakapi/utils/filesystem.go:25.23,27.5 1 0 -github.com/muety/wakapi/utils/http.go:9.90,12.58 3 0 -github.com/muety/wakapi/utils/http.go:12.58,14.3 1 0 -github.com/muety/wakapi/utils/strings.go:8.34,10.2 1 0 -github.com/muety/wakapi/utils/strings.go:12.77,13.29 1 0 -github.com/muety/wakapi/utils/strings.go:18.2,18.19 1 0 -github.com/muety/wakapi/utils/strings.go:13.29,14.18 1 0 -github.com/muety/wakapi/utils/strings.go:14.18,16.4 1 0 -github.com/muety/wakapi/utils/template.go:8.41,10.16 2 0 -github.com/muety/wakapi/utils/template.go:13.2,13.23 1 0 -github.com/muety/wakapi/utils/template.go:10.16,12.3 1 0 -github.com/muety/wakapi/utils/template.go:16.37,17.30 1 0 -github.com/muety/wakapi/utils/template.go:20.2,20.10 1 0 -github.com/muety/wakapi/utils/template.go:17.30,19.3 1 0 -github.com/muety/wakapi/utils/date.go:8.43,10.2 1 1 -github.com/muety/wakapi/utils/date.go:12.48,14.2 1 0 -github.com/muety/wakapi/utils/date.go:16.41,18.21 2 1 -github.com/muety/wakapi/utils/date.go:21.2,21.23 1 1 -github.com/muety/wakapi/utils/date.go:18.21,20.3 1 0 -github.com/muety/wakapi/utils/date.go:24.46,26.2 1 0 -github.com/muety/wakapi/utils/date.go:28.51,30.2 1 0 -github.com/muety/wakapi/utils/date.go:32.44,35.2 2 1 -github.com/muety/wakapi/utils/date.go:37.52,39.2 1 0 -github.com/muety/wakapi/utils/date.go:41.45,43.2 1 0 -github.com/muety/wakapi/utils/date.go:45.51,47.2 1 0 -github.com/muety/wakapi/utils/date.go:49.44,51.2 1 0 -github.com/muety/wakapi/utils/date.go:54.42,56.2 1 1 -github.com/muety/wakapi/utils/date.go:59.41,61.21 2 1 -github.com/muety/wakapi/utils/date.go:64.2,64.36 1 1 -github.com/muety/wakapi/utils/date.go:61.21,63.3 1 1 -github.com/muety/wakapi/utils/date.go:68.63,70.2 1 0 -github.com/muety/wakapi/utils/date.go:73.62,79.2 5 0 -github.com/muety/wakapi/utils/date.go:82.67,85.33 2 1 -github.com/muety/wakapi/utils/date.go:94.2,94.18 1 1 -github.com/muety/wakapi/utils/date.go:85.33,87.19 2 1 -github.com/muety/wakapi/utils/date.go:90.3,91.10 2 1 -github.com/muety/wakapi/utils/date.go:87.19,89.4 1 1 -github.com/muety/wakapi/utils/date.go:97.50,103.2 5 0 -github.com/muety/wakapi/utils/date.go:106.79,109.36 3 1 -github.com/muety/wakapi/utils/date.go:113.2,113.21 1 1 -github.com/muety/wakapi/utils/date.go:117.2,117.21 1 1 -github.com/muety/wakapi/utils/date.go:121.2,121.13 1 1 -github.com/muety/wakapi/utils/date.go:109.36,112.3 2 0 -github.com/muety/wakapi/utils/date.go:113.21,116.3 2 1 -github.com/muety/wakapi/utils/date.go:117.21,120.3 2 1 -github.com/muety/wakapi/utils/summary.go:10.66,11.40 1 0 -github.com/muety/wakapi/utils/summary.go:16.2,16.48 1 0 -github.com/muety/wakapi/utils/summary.go:11.40,12.27 1 0 -github.com/muety/wakapi/utils/summary.go:12.27,14.4 1 0 -github.com/muety/wakapi/utils/summary.go:19.88,22.2 2 0 -github.com/muety/wakapi/utils/summary.go:24.95,26.16 2 0 -github.com/muety/wakapi/utils/summary.go:29.2,29.38 1 0 -github.com/muety/wakapi/utils/summary.go:26.16,28.3 1 0 -github.com/muety/wakapi/utils/summary.go:32.105,35.18 2 0 -github.com/muety/wakapi/utils/summary.go:70.2,70.22 1 0 -github.com/muety/wakapi/utils/summary.go:36.28,37.26 1 0 -github.com/muety/wakapi/utils/summary.go:38.32,40.24 2 0 -github.com/muety/wakapi/utils/summary.go:41.31,42.29 1 0 -github.com/muety/wakapi/utils/summary.go:43.31,45.27 2 0 -github.com/muety/wakapi/utils/summary.go:46.32,47.30 1 0 -github.com/muety/wakapi/utils/summary.go:48.32,50.28 2 0 -github.com/muety/wakapi/utils/summary.go:51.31,52.29 1 0 -github.com/muety/wakapi/utils/summary.go:53.32,54.44 1 0 -github.com/muety/wakapi/utils/summary.go:55.41,57.42 2 0 -github.com/muety/wakapi/utils/summary.go:58.33,59.45 1 0 -github.com/muety/wakapi/utils/summary.go:60.33,61.45 1 0 -github.com/muety/wakapi/utils/summary.go:62.35,63.45 1 0 -github.com/muety/wakapi/utils/summary.go:64.26,65.21 1 0 -github.com/muety/wakapi/utils/summary.go:66.10,67.39 1 0 -github.com/muety/wakapi/utils/summary.go:73.73,80.56 5 0 -github.com/muety/wakapi/utils/summary.go:96.2,103.8 2 0 -github.com/muety/wakapi/utils/summary.go:80.56,82.3 1 0 -github.com/muety/wakapi/utils/summary.go:82.8,82.54 1 0 -github.com/muety/wakapi/utils/summary.go:82.54,84.3 1 0 -github.com/muety/wakapi/utils/summary.go:84.8,86.17 2 0 -github.com/muety/wakapi/utils/summary.go:90.3,91.17 2 0 -github.com/muety/wakapi/utils/summary.go:86.17,88.4 1 0 -github.com/muety/wakapi/utils/summary.go:91.17,93.4 1 0 -github.com/muety/wakapi/utils/summary.go:106.48,110.51 2 0 -github.com/muety/wakapi/utils/summary.go:113.2,113.12 1 0 -github.com/muety/wakapi/utils/summary.go:110.51,112.3 1 0 -github.com/muety/wakapi/config/db.go:39.50,40.19 1 0 -github.com/muety/wakapi/config/db.go:53.2,53.12 1 0 -github.com/muety/wakapi/config/db.go:41.23,45.5 1 0 -github.com/muety/wakapi/config/db.go:46.26,49.5 1 0 -github.com/muety/wakapi/config/db.go:50.24,51.48 1 0 -github.com/muety/wakapi/config/db.go:56.53,66.2 1 1 -github.com/muety/wakapi/config/db.go:68.56,70.16 2 1 -github.com/muety/wakapi/config/db.go:74.2,81.3 1 1 -github.com/muety/wakapi/config/db.go:70.16,72.3 1 0 -github.com/muety/wakapi/config/db.go:84.54,86.2 1 1 -github.com/muety/wakapi/config/eventbus.go:18.13,20.2 1 1 -github.com/muety/wakapi/config/eventbus.go:22.26,24.2 1 0 +github.com/muety/wakapi/models/filters.go:16.56,17.16 1 0 +github.com/muety/wakapi/models/filters.go:29.2,29.19 1 0 +github.com/muety/wakapi/models/filters.go:18.22,19.32 1 0 +github.com/muety/wakapi/models/filters.go:20.17,21.27 1 0 +github.com/muety/wakapi/models/filters.go:22.23,23.33 1 0 +github.com/muety/wakapi/models/filters.go:24.21,25.31 1 0 +github.com/muety/wakapi/models/filters.go:26.22,27.32 1 0 +github.com/muety/wakapi/models/filters.go:32.47,33.21 1 1 +github.com/muety/wakapi/models/filters.go:44.2,44.21 1 1 +github.com/muety/wakapi/models/filters.go:33.21,35.3 1 1 +github.com/muety/wakapi/models/filters.go:35.8,35.23 1 1 +github.com/muety/wakapi/models/filters.go:35.23,37.3 1 0 +github.com/muety/wakapi/models/filters.go:37.8,37.29 1 1 +github.com/muety/wakapi/models/filters.go:37.29,39.3 1 1 +github.com/muety/wakapi/models/filters.go:39.8,39.27 1 1 +github.com/muety/wakapi/models/filters.go:39.27,41.3 1 0 +github.com/muety/wakapi/models/filters.go:41.8,41.28 1 1 +github.com/muety/wakapi/models/filters.go:41.28,43.3 1 0 github.com/muety/wakapi/config/fs.go:9.56,10.19 1 0 github.com/muety/wakapi/config/fs.go:13.2,13.19 1 0 github.com/muety/wakapi/config/fs.go:10.19,12.3 1 0 @@ -410,6 +274,148 @@ github.com/muety/wakapi/config/config.go:344.70,346.3 1 0 github.com/muety/wakapi/config/config.go:348.28,350.3 1 0 github.com/muety/wakapi/config/config.go:352.29,355.3 2 0 github.com/muety/wakapi/config/config.go:357.94,359.3 1 0 +github.com/muety/wakapi/config/db.go:39.50,40.19 1 0 +github.com/muety/wakapi/config/db.go:53.2,53.12 1 0 +github.com/muety/wakapi/config/db.go:41.23,45.5 1 0 +github.com/muety/wakapi/config/db.go:46.26,49.5 1 0 +github.com/muety/wakapi/config/db.go:50.24,51.48 1 0 +github.com/muety/wakapi/config/db.go:56.53,66.2 1 1 +github.com/muety/wakapi/config/db.go:68.56,70.16 2 1 +github.com/muety/wakapi/config/db.go:74.2,81.3 1 1 +github.com/muety/wakapi/config/db.go:70.16,72.3 1 0 +github.com/muety/wakapi/config/db.go:84.54,86.2 1 1 +github.com/muety/wakapi/config/eventbus.go:18.13,20.2 1 1 +github.com/muety/wakapi/config/eventbus.go:22.26,24.2 1 0 +github.com/muety/wakapi/utils/filesystem.go:14.68,16.16 2 0 +github.com/muety/wakapi/utils/filesystem.go:20.2,21.15 2 0 +github.com/muety/wakapi/utils/filesystem.go:33.2,33.15 1 0 +github.com/muety/wakapi/utils/filesystem.go:16.16,18.3 1 0 +github.com/muety/wakapi/utils/filesystem.go:21.15,23.47 2 0 +github.com/muety/wakapi/utils/filesystem.go:23.47,25.23 2 0 +github.com/muety/wakapi/utils/filesystem.go:29.4,29.19 1 0 +github.com/muety/wakapi/utils/filesystem.go:25.23,27.5 1 0 +github.com/muety/wakapi/utils/set.go:3.51,5.26 2 0 +github.com/muety/wakapi/utils/set.go:8.2,8.12 1 0 +github.com/muety/wakapi/utils/set.go:5.26,7.3 1 0 +github.com/muety/wakapi/utils/set.go:11.49,13.21 2 0 +github.com/muety/wakapi/utils/set.go:16.2,16.14 1 0 +github.com/muety/wakapi/utils/set.go:13.21,15.3 1 0 +github.com/muety/wakapi/utils/common.go:18.73,19.58 1 0 +github.com/muety/wakapi/utils/common.go:22.2,22.87 1 0 +github.com/muety/wakapi/utils/common.go:25.2,25.64 1 0 +github.com/muety/wakapi/utils/common.go:19.58,21.3 1 0 +github.com/muety/wakapi/utils/common.go:22.87,24.3 1 0 +github.com/muety/wakapi/utils/common.go:28.40,30.2 1 0 +github.com/muety/wakapi/utils/common.go:32.44,34.2 1 0 +github.com/muety/wakapi/utils/common.go:36.49,38.2 1 0 +github.com/muety/wakapi/utils/common.go:40.45,42.2 1 0 +github.com/muety/wakapi/utils/common.go:44.24,46.2 1 0 +github.com/muety/wakapi/utils/common.go:48.56,51.45 3 1 +github.com/muety/wakapi/utils/common.go:54.2,54.40 1 1 +github.com/muety/wakapi/utils/common.go:51.45,53.3 1 1 +github.com/muety/wakapi/utils/color.go:8.90,10.32 2 0 +github.com/muety/wakapi/utils/color.go:15.2,15.15 1 0 +github.com/muety/wakapi/utils/color.go:10.32,11.50 1 0 +github.com/muety/wakapi/utils/color.go:11.50,13.4 1 0 +github.com/muety/wakapi/utils/date.go:8.43,10.2 1 1 +github.com/muety/wakapi/utils/date.go:12.48,14.2 1 0 +github.com/muety/wakapi/utils/date.go:16.41,18.21 2 1 +github.com/muety/wakapi/utils/date.go:21.2,21.23 1 1 +github.com/muety/wakapi/utils/date.go:18.21,20.3 1 0 +github.com/muety/wakapi/utils/date.go:24.46,26.2 1 0 +github.com/muety/wakapi/utils/date.go:28.51,30.2 1 0 +github.com/muety/wakapi/utils/date.go:32.44,35.2 2 1 +github.com/muety/wakapi/utils/date.go:37.52,39.2 1 0 +github.com/muety/wakapi/utils/date.go:41.45,43.2 1 0 +github.com/muety/wakapi/utils/date.go:45.51,47.2 1 0 +github.com/muety/wakapi/utils/date.go:49.44,51.2 1 0 +github.com/muety/wakapi/utils/date.go:54.42,56.2 1 1 +github.com/muety/wakapi/utils/date.go:59.41,61.21 2 1 +github.com/muety/wakapi/utils/date.go:64.2,64.36 1 1 +github.com/muety/wakapi/utils/date.go:61.21,63.3 1 1 +github.com/muety/wakapi/utils/date.go:68.63,70.2 1 0 +github.com/muety/wakapi/utils/date.go:73.62,79.2 5 0 +github.com/muety/wakapi/utils/date.go:82.67,85.33 2 1 +github.com/muety/wakapi/utils/date.go:94.2,94.18 1 1 +github.com/muety/wakapi/utils/date.go:85.33,87.19 2 1 +github.com/muety/wakapi/utils/date.go:90.3,91.10 2 1 +github.com/muety/wakapi/utils/date.go:87.19,89.4 1 1 +github.com/muety/wakapi/utils/date.go:97.50,103.2 5 0 +github.com/muety/wakapi/utils/date.go:106.79,109.36 3 1 +github.com/muety/wakapi/utils/date.go:113.2,113.21 1 1 +github.com/muety/wakapi/utils/date.go:117.2,117.21 1 1 +github.com/muety/wakapi/utils/date.go:121.2,121.13 1 1 +github.com/muety/wakapi/utils/date.go:109.36,112.3 2 0 +github.com/muety/wakapi/utils/date.go:113.21,116.3 2 1 +github.com/muety/wakapi/utils/date.go:117.21,120.3 2 1 +github.com/muety/wakapi/utils/http.go:9.90,12.58 3 0 +github.com/muety/wakapi/utils/http.go:12.58,14.3 1 0 +github.com/muety/wakapi/utils/strings.go:8.34,10.2 1 0 +github.com/muety/wakapi/utils/strings.go:12.77,13.29 1 0 +github.com/muety/wakapi/utils/strings.go:18.2,18.19 1 0 +github.com/muety/wakapi/utils/strings.go:13.29,14.18 1 0 +github.com/muety/wakapi/utils/strings.go:14.18,16.4 1 0 +github.com/muety/wakapi/utils/summary.go:10.66,11.40 1 0 +github.com/muety/wakapi/utils/summary.go:16.2,16.48 1 0 +github.com/muety/wakapi/utils/summary.go:11.40,12.27 1 0 +github.com/muety/wakapi/utils/summary.go:12.27,14.4 1 0 +github.com/muety/wakapi/utils/summary.go:19.88,22.2 2 0 +github.com/muety/wakapi/utils/summary.go:24.95,26.16 2 0 +github.com/muety/wakapi/utils/summary.go:29.2,29.38 1 0 +github.com/muety/wakapi/utils/summary.go:26.16,28.3 1 0 +github.com/muety/wakapi/utils/summary.go:32.105,35.18 2 0 +github.com/muety/wakapi/utils/summary.go:70.2,70.22 1 0 +github.com/muety/wakapi/utils/summary.go:36.28,37.26 1 0 +github.com/muety/wakapi/utils/summary.go:38.32,40.24 2 0 +github.com/muety/wakapi/utils/summary.go:41.31,42.29 1 0 +github.com/muety/wakapi/utils/summary.go:43.31,45.27 2 0 +github.com/muety/wakapi/utils/summary.go:46.32,47.30 1 0 +github.com/muety/wakapi/utils/summary.go:48.32,50.28 2 0 +github.com/muety/wakapi/utils/summary.go:51.31,52.29 1 0 +github.com/muety/wakapi/utils/summary.go:53.32,54.44 1 0 +github.com/muety/wakapi/utils/summary.go:55.41,57.42 2 0 +github.com/muety/wakapi/utils/summary.go:58.33,59.45 1 0 +github.com/muety/wakapi/utils/summary.go:60.33,61.45 1 0 +github.com/muety/wakapi/utils/summary.go:62.35,63.45 1 0 +github.com/muety/wakapi/utils/summary.go:64.26,65.21 1 0 +github.com/muety/wakapi/utils/summary.go:66.10,67.39 1 0 +github.com/muety/wakapi/utils/summary.go:73.73,80.56 5 0 +github.com/muety/wakapi/utils/summary.go:96.2,103.8 2 0 +github.com/muety/wakapi/utils/summary.go:80.56,82.3 1 0 +github.com/muety/wakapi/utils/summary.go:82.8,82.54 1 0 +github.com/muety/wakapi/utils/summary.go:82.54,84.3 1 0 +github.com/muety/wakapi/utils/summary.go:84.8,86.17 2 0 +github.com/muety/wakapi/utils/summary.go:90.3,91.17 2 0 +github.com/muety/wakapi/utils/summary.go:86.17,88.4 1 0 +github.com/muety/wakapi/utils/summary.go:91.17,93.4 1 0 +github.com/muety/wakapi/utils/summary.go:106.48,110.51 2 0 +github.com/muety/wakapi/utils/summary.go:113.2,113.12 1 0 +github.com/muety/wakapi/utils/summary.go:110.51,112.3 1 0 +github.com/muety/wakapi/utils/template.go:8.41,10.16 2 0 +github.com/muety/wakapi/utils/template.go:13.2,13.23 1 0 +github.com/muety/wakapi/utils/template.go:10.16,12.3 1 0 +github.com/muety/wakapi/utils/template.go:16.37,17.30 1 0 +github.com/muety/wakapi/utils/template.go:20.2,20.10 1 0 +github.com/muety/wakapi/utils/template.go:17.30,19.3 1 0 +github.com/muety/wakapi/utils/auth.go:16.79,18.54 2 0 +github.com/muety/wakapi/utils/auth.go:22.2,24.16 3 0 +github.com/muety/wakapi/utils/auth.go:28.2,30.45 3 0 +github.com/muety/wakapi/utils/auth.go:33.2,34.32 2 0 +github.com/muety/wakapi/utils/auth.go:18.54,20.3 1 0 +github.com/muety/wakapi/utils/auth.go:24.16,26.3 1 0 +github.com/muety/wakapi/utils/auth.go:30.45,32.3 1 0 +github.com/muety/wakapi/utils/auth.go:37.65,39.85 2 0 +github.com/muety/wakapi/utils/auth.go:43.2,44.30 2 0 +github.com/muety/wakapi/utils/auth.go:39.85,41.3 1 0 +github.com/muety/wakapi/utils/auth.go:47.94,49.16 2 0 +github.com/muety/wakapi/utils/auth.go:53.2,53.107 1 0 +github.com/muety/wakapi/utils/auth.go:57.2,57.22 1 0 +github.com/muety/wakapi/utils/auth.go:49.16,51.3 1 0 +github.com/muety/wakapi/utils/auth.go:53.107,55.3 1 0 +github.com/muety/wakapi/utils/auth.go:60.56,64.2 3 0 +github.com/muety/wakapi/utils/auth.go:66.55,69.16 3 0 +github.com/muety/wakapi/utils/auth.go:72.2,72.16 1 0 +github.com/muety/wakapi/utils/auth.go:69.16,71.3 1 0 github.com/muety/wakapi/middlewares/authenticate.go:19.91,25.2 1 1 github.com/muety/wakapi/middlewares/authenticate.go:27.90,30.2 2 0 github.com/muety/wakapi/middlewares/authenticate.go:32.90,35.2 2 0 @@ -493,80 +499,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/services/language_mapping.go:18.118,24.2 1 0 -github.com/muety/wakapi/services/language_mapping.go:26.86,28.2 1 0 -github.com/muety/wakapi/services/language_mapping.go:30.96,31.53 1 0 -github.com/muety/wakapi/services/language_mapping.go:35.2,36.16 2 0 -github.com/muety/wakapi/services/language_mapping.go:39.2,40.22 2 0 -github.com/muety/wakapi/services/language_mapping.go:31.53,33.3 1 0 -github.com/muety/wakapi/services/language_mapping.go:36.16,38.3 1 0 -github.com/muety/wakapi/services/language_mapping.go:43.92,46.16 3 0 -github.com/muety/wakapi/services/language_mapping.go:50.2,50.33 1 0 -github.com/muety/wakapi/services/language_mapping.go:53.2,53.22 1 0 -github.com/muety/wakapi/services/language_mapping.go:46.16,48.3 1 0 -github.com/muety/wakapi/services/language_mapping.go:50.33,52.3 1 0 -github.com/muety/wakapi/services/language_mapping.go:56.109,58.16 2 0 -github.com/muety/wakapi/services/language_mapping.go:62.2,63.20 2 0 -github.com/muety/wakapi/services/language_mapping.go:58.16,60.3 1 0 -github.com/muety/wakapi/services/language_mapping.go:66.82,67.26 1 0 -github.com/muety/wakapi/services/language_mapping.go:70.2,72.12 3 0 -github.com/muety/wakapi/services/language_mapping.go:67.26,69.3 1 0 -github.com/muety/wakapi/services/language_mapping.go:75.74,78.2 1 0 -github.com/muety/wakapi/services/misc.go:23.126,30.2 1 0 -github.com/muety/wakapi/services/misc.go:42.50,44.48 1 0 -github.com/muety/wakapi/services/misc.go:48.2,50.19 3 0 -github.com/muety/wakapi/services/misc.go:44.48,46.3 1 0 -github.com/muety/wakapi/services/misc.go:53.51,59.40 4 0 -github.com/muety/wakapi/services/misc.go:63.2,66.56 2 0 -github.com/muety/wakapi/services/misc.go:77.2,77.12 1 0 -github.com/muety/wakapi/services/misc.go:59.40,61.3 1 0 -github.com/muety/wakapi/services/misc.go:66.56,67.27 1 0 -github.com/muety/wakapi/services/misc.go:67.27,72.4 1 0 -github.com/muety/wakapi/services/misc.go:73.8,75.3 1 0 -github.com/muety/wakapi/services/misc.go:80.116,81.24 1 0 -github.com/muety/wakapi/services/misc.go:81.24,82.151 1 0 -github.com/muety/wakapi/services/misc.go:91.3,91.48 1 0 -github.com/muety/wakapi/services/misc.go:82.151,84.4 1 0 -github.com/muety/wakapi/services/misc.go:84.9,90.4 2 0 -github.com/muety/wakapi/services/misc.go:91.48,94.4 2 0 -github.com/muety/wakapi/services/misc.go:98.86,101.30 3 0 -github.com/muety/wakapi/services/misc.go:106.2,109.17 1 0 -github.com/muety/wakapi/services/misc.go:113.2,116.17 1 0 -github.com/muety/wakapi/services/misc.go:101.30,104.3 2 0 -github.com/muety/wakapi/services/misc.go:109.17,111.3 1 0 -github.com/muety/wakapi/services/misc.go:116.17,118.3 1 0 -github.com/muety/wakapi/services/user.go:21.73,28.2 1 0 -github.com/muety/wakapi/services/user.go:30.74,31.40 1 0 -github.com/muety/wakapi/services/user.go:35.2,36.16 2 0 -github.com/muety/wakapi/services/user.go:40.2,41.15 2 0 -github.com/muety/wakapi/services/user.go:31.40,33.3 1 0 -github.com/muety/wakapi/services/user.go:36.16,38.3 1 0 -github.com/muety/wakapi/services/user.go:44.72,45.37 1 0 -github.com/muety/wakapi/services/user.go:49.2,50.16 2 0 -github.com/muety/wakapi/services/user.go:54.2,55.15 2 0 -github.com/muety/wakapi/services/user.go:45.37,47.3 1 0 -github.com/muety/wakapi/services/user.go:50.16,52.3 1 0 -github.com/muety/wakapi/services/user.go:58.76,60.2 1 0 -github.com/muety/wakapi/services/user.go:62.86,64.2 1 0 -github.com/muety/wakapi/services/user.go:66.58,68.2 1 0 -github.com/muety/wakapi/services/user.go:70.86,72.2 1 0 -github.com/muety/wakapi/services/user.go:74.61,77.2 2 0 -github.com/muety/wakapi/services/user.go:79.48,81.2 1 0 -github.com/muety/wakapi/services/user.go:83.102,93.93 2 0 -github.com/muety/wakapi/services/user.go:99.2,99.38 1 0 -github.com/muety/wakapi/services/user.go:93.93,95.3 1 0 -github.com/muety/wakapi/services/user.go:95.8,97.3 1 0 -github.com/muety/wakapi/services/user.go:102.73,106.2 3 0 -github.com/muety/wakapi/services/user.go:108.78,112.2 3 0 -github.com/muety/wakapi/services/user.go:114.99,117.2 2 0 -github.com/muety/wakapi/services/user.go:119.106,122.96 3 0 -github.com/muety/wakapi/services/user.go:127.2,127.68 1 0 -github.com/muety/wakapi/services/user.go:122.96,124.3 1 0 -github.com/muety/wakapi/services/user.go:124.8,126.3 1 0 -github.com/muety/wakapi/services/user.go:130.85,132.2 1 0 -github.com/muety/wakapi/services/user.go:134.57,141.2 4 0 -github.com/muety/wakapi/services/user.go:143.38,145.2 1 0 -github.com/muety/wakapi/services/user.go:147.57,152.2 1 0 github.com/muety/wakapi/services/alias.go:17.77,22.2 1 1 github.com/muety/wakapi/services/alias.go:26.60,27.43 1 1 github.com/muety/wakapi/services/alias.go:30.2,30.14 1 1 @@ -602,106 +534,57 @@ github.com/muety/wakapi/services/alias.go:95.21,97.4 1 0 github.com/muety/wakapi/services/alias.go:104.31,106.3 1 0 github.com/muety/wakapi/services/alias.go:111.52,112.51 1 0 github.com/muety/wakapi/services/alias.go:112.51,114.3 1 0 -github.com/muety/wakapi/services/heartbeat.go:17.141,23.2 1 0 -github.com/muety/wakapi/services/heartbeat.go:25.72,27.2 1 0 -github.com/muety/wakapi/services/heartbeat.go:29.80,34.32 3 0 -github.com/muety/wakapi/services/heartbeat.go:41.2,41.55 1 0 -github.com/muety/wakapi/services/heartbeat.go:34.32,35.36 1 0 -github.com/muety/wakapi/services/heartbeat.go:35.36,38.4 2 0 -github.com/muety/wakapi/services/heartbeat.go:44.53,46.2 1 0 -github.com/muety/wakapi/services/heartbeat.go:48.76,50.2 1 0 -github.com/muety/wakapi/services/heartbeat.go:52.96,54.2 1 0 -github.com/muety/wakapi/services/heartbeat.go:56.111,58.16 2 0 -github.com/muety/wakapi/services/heartbeat.go:61.2,61.43 1 0 -github.com/muety/wakapi/services/heartbeat.go:58.16,60.3 1 0 -github.com/muety/wakapi/services/heartbeat.go:64.92,66.2 1 0 -github.com/muety/wakapi/services/heartbeat.go:68.116,70.2 1 0 -github.com/muety/wakapi/services/heartbeat.go:72.78,74.2 1 0 -github.com/muety/wakapi/services/heartbeat.go:76.62,78.2 1 0 -github.com/muety/wakapi/services/heartbeat.go:80.116,82.16 2 0 -github.com/muety/wakapi/services/heartbeat.go:86.2,86.28 1 0 -github.com/muety/wakapi/services/heartbeat.go:90.2,90.24 1 0 -github.com/muety/wakapi/services/heartbeat.go:82.16,84.3 1 0 -github.com/muety/wakapi/services/heartbeat.go:86.28,88.3 1 0 -github.com/muety/wakapi/services/key_value.go:14.89,19.2 1 0 -github.com/muety/wakapi/services/key_value.go:21.83,23.2 1 0 -github.com/muety/wakapi/services/key_value.go:25.78,27.16 2 0 -github.com/muety/wakapi/services/key_value.go:33.2,33.11 1 0 -github.com/muety/wakapi/services/key_value.go:27.16,32.3 1 0 -github.com/muety/wakapi/services/key_value.go:36.72,38.2 1 0 -github.com/muety/wakapi/services/key_value.go:40.60,42.2 1 0 -github.com/muety/wakapi/services/aggregation.go:29.142,37.2 1 0 -github.com/muety/wakapi/services/aggregation.go:46.43,48.37 1 0 -github.com/muety/wakapi/services/aggregation.go:52.2,54.19 3 0 -github.com/muety/wakapi/services/aggregation.go:48.37,50.3 1 0 -github.com/muety/wakapi/services/aggregation.go:57.67,58.47 1 0 -github.com/muety/wakapi/services/aggregation.go:61.2,66.40 4 0 -github.com/muety/wakapi/services/aggregation.go:70.2,70.50 1 0 -github.com/muety/wakapi/services/aggregation.go:75.2,75.60 1 0 -github.com/muety/wakapi/services/aggregation.go:81.2,81.35 1 0 -github.com/muety/wakapi/services/aggregation.go:58.47,60.3 1 0 -github.com/muety/wakapi/services/aggregation.go:66.40,68.3 1 0 -github.com/muety/wakapi/services/aggregation.go:70.50,72.3 1 0 -github.com/muety/wakapi/services/aggregation.go:75.60,79.3 3 0 -github.com/muety/wakapi/services/aggregation.go:84.109,85.24 1 0 -github.com/muety/wakapi/services/aggregation.go:85.24,86.111 1 0 -github.com/muety/wakapi/services/aggregation.go:86.111,88.4 1 0 -github.com/muety/wakapi/services/aggregation.go:88.9,91.4 2 0 -github.com/muety/wakapi/services/aggregation.go:95.80,96.33 1 0 -github.com/muety/wakapi/services/aggregation.go:96.33,97.60 1 0 -github.com/muety/wakapi/services/aggregation.go:97.60,99.4 1 0 -github.com/muety/wakapi/services/aggregation.go:103.100,107.59 3 0 -github.com/muety/wakapi/services/aggregation.go:122.2,123.16 2 0 -github.com/muety/wakapi/services/aggregation.go:129.2,130.16 2 0 -github.com/muety/wakapi/services/aggregation.go:136.2,137.44 2 0 -github.com/muety/wakapi/services/aggregation.go:142.2,142.41 1 0 -github.com/muety/wakapi/services/aggregation.go:156.2,156.12 1 0 -github.com/muety/wakapi/services/aggregation.go:107.59,110.3 2 0 -github.com/muety/wakapi/services/aggregation.go:110.8,110.47 1 0 -github.com/muety/wakapi/services/aggregation.go:110.47,112.30 2 0 -github.com/muety/wakapi/services/aggregation.go:112.30,113.43 1 0 -github.com/muety/wakapi/services/aggregation.go:113.43,115.5 1 0 -github.com/muety/wakapi/services/aggregation.go:117.8,119.3 1 0 -github.com/muety/wakapi/services/aggregation.go:123.16,126.3 2 0 -github.com/muety/wakapi/services/aggregation.go:130.16,133.3 2 0 -github.com/muety/wakapi/services/aggregation.go:137.44,139.3 1 0 -github.com/muety/wakapi/services/aggregation.go:142.41,143.21 1 0 -github.com/muety/wakapi/services/aggregation.go:143.21,147.4 1 0 -github.com/muety/wakapi/services/aggregation.go:147.9,147.62 1 0 -github.com/muety/wakapi/services/aggregation.go:147.62,151.4 1 0 -github.com/muety/wakapi/services/aggregation.go:159.73,162.27 3 0 -github.com/muety/wakapi/services/aggregation.go:167.2,167.27 1 0 -github.com/muety/wakapi/services/aggregation.go:170.2,170.12 1 0 -github.com/muety/wakapi/services/aggregation.go:162.27,163.39 1 0 -github.com/muety/wakapi/services/aggregation.go:163.39,165.4 1 0 -github.com/muety/wakapi/services/aggregation.go:167.27,169.3 1 0 -github.com/muety/wakapi/services/aggregation.go:173.69,176.27 3 0 -github.com/muety/wakapi/services/aggregation.go:176.27,178.3 1 0 -github.com/muety/wakapi/services/aggregation.go:181.83,196.41 5 0 -github.com/muety/wakapi/services/aggregation.go:196.41,206.3 3 0 -github.com/muety/wakapi/services/aggregation.go:209.34,212.2 2 0 -github.com/muety/wakapi/services/report.go:24.122,35.33 3 0 -github.com/muety/wakapi/services/report.go:41.2,41.12 1 0 -github.com/muety/wakapi/services/report.go:35.33,36.31 1 0 -github.com/muety/wakapi/services/report.go:36.31,38.4 1 0 -github.com/muety/wakapi/services/report.go:44.38,48.16 3 0 -github.com/muety/wakapi/services/report.go:52.2,53.26 2 0 -github.com/muety/wakapi/services/report.go:48.16,50.3 1 0 -github.com/muety/wakapi/services/report.go:53.26,55.3 1 0 -github.com/muety/wakapi/services/report.go:60.61,65.65 3 0 -github.com/muety/wakapi/services/report.go:73.2,73.65 1 0 -github.com/muety/wakapi/services/report.go:85.2,85.24 1 0 -github.com/muety/wakapi/services/report.go:65.65,70.3 4 0 -github.com/muety/wakapi/services/report.go:73.65,83.3 4 0 -github.com/muety/wakapi/services/report.go:88.80,89.22 1 0 -github.com/muety/wakapi/services/report.go:93.2,93.29 1 0 -github.com/muety/wakapi/services/report.go:98.2,102.16 4 0 -github.com/muety/wakapi/services/report.go:107.2,114.65 2 0 -github.com/muety/wakapi/services/report.go:119.2,120.12 2 0 -github.com/muety/wakapi/services/report.go:89.22,91.3 1 0 -github.com/muety/wakapi/services/report.go:93.29,96.3 2 0 -github.com/muety/wakapi/services/report.go:102.16,105.3 2 0 -github.com/muety/wakapi/services/report.go:114.65,117.3 2 0 +github.com/muety/wakapi/services/heartbeat.go:21.141,28.2 1 0 +github.com/muety/wakapi/services/heartbeat.go:30.72,33.2 2 0 +github.com/muety/wakapi/services/heartbeat.go:35.80,40.32 3 0 +github.com/muety/wakapi/services/heartbeat.go:48.2,48.55 1 0 +github.com/muety/wakapi/services/heartbeat.go:40.32,41.36 1 0 +github.com/muety/wakapi/services/heartbeat.go:45.3,45.43 1 0 +github.com/muety/wakapi/services/heartbeat.go:41.36,44.4 2 0 +github.com/muety/wakapi/services/heartbeat.go:51.53,53.2 1 0 +github.com/muety/wakapi/services/heartbeat.go:55.76,57.2 1 0 +github.com/muety/wakapi/services/heartbeat.go:59.96,61.2 1 0 +github.com/muety/wakapi/services/heartbeat.go:63.111,65.16 2 0 +github.com/muety/wakapi/services/heartbeat.go:68.2,68.43 1 0 +github.com/muety/wakapi/services/heartbeat.go:65.16,67.3 1 0 +github.com/muety/wakapi/services/heartbeat.go:71.92,73.2 1 0 +github.com/muety/wakapi/services/heartbeat.go:75.116,77.2 1 0 +github.com/muety/wakapi/services/heartbeat.go:79.78,81.2 1 0 +github.com/muety/wakapi/services/heartbeat.go:83.104,85.54 2 0 +github.com/muety/wakapi/services/heartbeat.go:89.2,90.16 2 0 +github.com/muety/wakapi/services/heartbeat.go:93.2,94.21 2 0 +github.com/muety/wakapi/services/heartbeat.go:85.54,87.3 1 0 +github.com/muety/wakapi/services/heartbeat.go:90.16,92.3 1 0 +github.com/muety/wakapi/services/heartbeat.go:97.62,99.2 1 0 +github.com/muety/wakapi/services/heartbeat.go:101.116,103.16 2 0 +github.com/muety/wakapi/services/heartbeat.go:107.2,107.28 1 0 +github.com/muety/wakapi/services/heartbeat.go:111.2,111.24 1 0 +github.com/muety/wakapi/services/heartbeat.go:103.16,105.3 1 0 +github.com/muety/wakapi/services/heartbeat.go:107.28,109.3 1 0 +github.com/muety/wakapi/services/heartbeat.go:114.96,116.2 1 0 +github.com/muety/wakapi/services/heartbeat.go:118.107,120.55 2 0 +github.com/muety/wakapi/services/heartbeat.go:120.55,121.58 1 0 +github.com/muety/wakapi/services/heartbeat.go:121.58,125.4 1 0 +github.com/muety/wakapi/services/heartbeat.go:129.85,135.2 5 0 +github.com/muety/wakapi/services/language_mapping.go:18.118,24.2 1 0 +github.com/muety/wakapi/services/language_mapping.go:26.86,28.2 1 0 +github.com/muety/wakapi/services/language_mapping.go:30.96,31.53 1 0 +github.com/muety/wakapi/services/language_mapping.go:35.2,36.16 2 0 +github.com/muety/wakapi/services/language_mapping.go:39.2,40.22 2 0 +github.com/muety/wakapi/services/language_mapping.go:31.53,33.3 1 0 +github.com/muety/wakapi/services/language_mapping.go:36.16,38.3 1 0 +github.com/muety/wakapi/services/language_mapping.go:43.92,46.16 3 0 +github.com/muety/wakapi/services/language_mapping.go:50.2,50.33 1 0 +github.com/muety/wakapi/services/language_mapping.go:53.2,53.22 1 0 +github.com/muety/wakapi/services/language_mapping.go:46.16,48.3 1 0 +github.com/muety/wakapi/services/language_mapping.go:50.33,52.3 1 0 +github.com/muety/wakapi/services/language_mapping.go:56.109,58.16 2 0 +github.com/muety/wakapi/services/language_mapping.go:62.2,63.20 2 0 +github.com/muety/wakapi/services/language_mapping.go:58.16,60.3 1 0 +github.com/muety/wakapi/services/language_mapping.go:66.82,67.26 1 0 +github.com/muety/wakapi/services/language_mapping.go:70.2,72.12 3 0 +github.com/muety/wakapi/services/language_mapping.go:67.26,69.3 1 0 +github.com/muety/wakapi/services/language_mapping.go:75.74,78.2 1 0 github.com/muety/wakapi/services/summary.go:28.149,36.2 1 1 github.com/muety/wakapi/services/summary.go:40.136,43.66 2 1 github.com/muety/wakapi/services/summary.go:48.2,48.44 1 1 @@ -795,3 +678,135 @@ github.com/muety/wakapi/services/summary.go:344.54,346.3 1 1 github.com/muety/wakapi/services/summary.go:351.59,353.25 2 1 github.com/muety/wakapi/services/summary.go:356.2,356.32 1 1 github.com/muety/wakapi/services/summary.go:353.25,355.3 1 1 +github.com/muety/wakapi/services/user.go:21.73,28.2 1 0 +github.com/muety/wakapi/services/user.go:30.74,31.40 1 0 +github.com/muety/wakapi/services/user.go:35.2,36.16 2 0 +github.com/muety/wakapi/services/user.go:40.2,41.15 2 0 +github.com/muety/wakapi/services/user.go:31.40,33.3 1 0 +github.com/muety/wakapi/services/user.go:36.16,38.3 1 0 +github.com/muety/wakapi/services/user.go:44.72,45.37 1 0 +github.com/muety/wakapi/services/user.go:49.2,50.16 2 0 +github.com/muety/wakapi/services/user.go:54.2,55.15 2 0 +github.com/muety/wakapi/services/user.go:45.37,47.3 1 0 +github.com/muety/wakapi/services/user.go:50.16,52.3 1 0 +github.com/muety/wakapi/services/user.go:58.76,60.2 1 0 +github.com/muety/wakapi/services/user.go:62.86,64.2 1 0 +github.com/muety/wakapi/services/user.go:66.58,68.2 1 0 +github.com/muety/wakapi/services/user.go:70.86,72.2 1 0 +github.com/muety/wakapi/services/user.go:74.61,77.2 2 0 +github.com/muety/wakapi/services/user.go:79.48,81.2 1 0 +github.com/muety/wakapi/services/user.go:83.102,93.93 2 0 +github.com/muety/wakapi/services/user.go:99.2,99.38 1 0 +github.com/muety/wakapi/services/user.go:93.93,95.3 1 0 +github.com/muety/wakapi/services/user.go:95.8,97.3 1 0 +github.com/muety/wakapi/services/user.go:102.73,106.2 3 0 +github.com/muety/wakapi/services/user.go:108.78,112.2 3 0 +github.com/muety/wakapi/services/user.go:114.99,117.2 2 0 +github.com/muety/wakapi/services/user.go:119.106,122.96 3 0 +github.com/muety/wakapi/services/user.go:127.2,127.68 1 0 +github.com/muety/wakapi/services/user.go:122.96,124.3 1 0 +github.com/muety/wakapi/services/user.go:124.8,126.3 1 0 +github.com/muety/wakapi/services/user.go:130.85,132.2 1 0 +github.com/muety/wakapi/services/user.go:134.57,141.2 4 0 +github.com/muety/wakapi/services/user.go:143.38,145.2 1 0 +github.com/muety/wakapi/services/user.go:147.57,152.2 1 0 +github.com/muety/wakapi/services/aggregation.go:29.142,37.2 1 0 +github.com/muety/wakapi/services/aggregation.go:46.43,48.37 1 0 +github.com/muety/wakapi/services/aggregation.go:52.2,54.19 3 0 +github.com/muety/wakapi/services/aggregation.go:48.37,50.3 1 0 +github.com/muety/wakapi/services/aggregation.go:57.67,58.47 1 0 +github.com/muety/wakapi/services/aggregation.go:61.2,66.40 4 0 +github.com/muety/wakapi/services/aggregation.go:70.2,70.50 1 0 +github.com/muety/wakapi/services/aggregation.go:75.2,75.60 1 0 +github.com/muety/wakapi/services/aggregation.go:81.2,81.35 1 0 +github.com/muety/wakapi/services/aggregation.go:58.47,60.3 1 0 +github.com/muety/wakapi/services/aggregation.go:66.40,68.3 1 0 +github.com/muety/wakapi/services/aggregation.go:70.50,72.3 1 0 +github.com/muety/wakapi/services/aggregation.go:75.60,79.3 3 0 +github.com/muety/wakapi/services/aggregation.go:84.109,85.24 1 0 +github.com/muety/wakapi/services/aggregation.go:85.24,86.111 1 0 +github.com/muety/wakapi/services/aggregation.go:86.111,88.4 1 0 +github.com/muety/wakapi/services/aggregation.go:88.9,91.4 2 0 +github.com/muety/wakapi/services/aggregation.go:95.80,96.33 1 0 +github.com/muety/wakapi/services/aggregation.go:96.33,97.60 1 0 +github.com/muety/wakapi/services/aggregation.go:97.60,99.4 1 0 +github.com/muety/wakapi/services/aggregation.go:103.100,107.59 3 0 +github.com/muety/wakapi/services/aggregation.go:122.2,123.16 2 0 +github.com/muety/wakapi/services/aggregation.go:129.2,130.16 2 0 +github.com/muety/wakapi/services/aggregation.go:136.2,137.44 2 0 +github.com/muety/wakapi/services/aggregation.go:142.2,142.41 1 0 +github.com/muety/wakapi/services/aggregation.go:156.2,156.12 1 0 +github.com/muety/wakapi/services/aggregation.go:107.59,110.3 2 0 +github.com/muety/wakapi/services/aggregation.go:110.8,110.47 1 0 +github.com/muety/wakapi/services/aggregation.go:110.47,112.30 2 0 +github.com/muety/wakapi/services/aggregation.go:112.30,113.43 1 0 +github.com/muety/wakapi/services/aggregation.go:113.43,115.5 1 0 +github.com/muety/wakapi/services/aggregation.go:117.8,119.3 1 0 +github.com/muety/wakapi/services/aggregation.go:123.16,126.3 2 0 +github.com/muety/wakapi/services/aggregation.go:130.16,133.3 2 0 +github.com/muety/wakapi/services/aggregation.go:137.44,139.3 1 0 +github.com/muety/wakapi/services/aggregation.go:142.41,143.21 1 0 +github.com/muety/wakapi/services/aggregation.go:143.21,147.4 1 0 +github.com/muety/wakapi/services/aggregation.go:147.9,147.62 1 0 +github.com/muety/wakapi/services/aggregation.go:147.62,151.4 1 0 +github.com/muety/wakapi/services/aggregation.go:159.73,162.27 3 0 +github.com/muety/wakapi/services/aggregation.go:167.2,167.27 1 0 +github.com/muety/wakapi/services/aggregation.go:170.2,170.12 1 0 +github.com/muety/wakapi/services/aggregation.go:162.27,163.39 1 0 +github.com/muety/wakapi/services/aggregation.go:163.39,165.4 1 0 +github.com/muety/wakapi/services/aggregation.go:167.27,169.3 1 0 +github.com/muety/wakapi/services/aggregation.go:173.69,176.27 3 0 +github.com/muety/wakapi/services/aggregation.go:176.27,178.3 1 0 +github.com/muety/wakapi/services/aggregation.go:181.83,196.41 5 0 +github.com/muety/wakapi/services/aggregation.go:196.41,206.3 3 0 +github.com/muety/wakapi/services/aggregation.go:209.34,212.2 2 0 +github.com/muety/wakapi/services/key_value.go:14.89,19.2 1 0 +github.com/muety/wakapi/services/key_value.go:21.83,23.2 1 0 +github.com/muety/wakapi/services/key_value.go:25.78,27.16 2 0 +github.com/muety/wakapi/services/key_value.go:33.2,33.11 1 0 +github.com/muety/wakapi/services/key_value.go:27.16,32.3 1 0 +github.com/muety/wakapi/services/key_value.go:36.72,38.2 1 0 +github.com/muety/wakapi/services/key_value.go:40.60,42.2 1 0 +github.com/muety/wakapi/services/misc.go:21.126,28.2 1 0 +github.com/muety/wakapi/services/misc.go:40.50,42.48 1 0 +github.com/muety/wakapi/services/misc.go:46.2,48.19 3 0 +github.com/muety/wakapi/services/misc.go:42.48,44.3 1 0 +github.com/muety/wakapi/services/misc.go:51.51,53.16 2 0 +github.com/muety/wakapi/services/misc.go:57.2,60.26 3 0 +github.com/muety/wakapi/services/misc.go:66.2,68.40 2 0 +github.com/muety/wakapi/services/misc.go:73.2,75.33 3 0 +github.com/muety/wakapi/services/misc.go:79.2,84.17 2 0 +github.com/muety/wakapi/services/misc.go:88.2,91.17 1 0 +github.com/muety/wakapi/services/misc.go:95.2,95.12 1 0 +github.com/muety/wakapi/services/misc.go:53.16,55.3 1 0 +github.com/muety/wakapi/services/misc.go:60.26,65.3 1 0 +github.com/muety/wakapi/services/misc.go:68.40,70.3 1 0 +github.com/muety/wakapi/services/misc.go:75.33,78.3 2 0 +github.com/muety/wakapi/services/misc.go:84.17,86.3 1 0 +github.com/muety/wakapi/services/misc.go:91.17,93.3 1 0 +github.com/muety/wakapi/services/misc.go:98.116,99.24 1 0 +github.com/muety/wakapi/services/misc.go:99.24,100.151 1 0 +github.com/muety/wakapi/services/misc.go:100.151,102.4 1 0 +github.com/muety/wakapi/services/misc.go:102.9,107.4 1 0 +github.com/muety/wakapi/services/report.go:24.122,35.33 3 0 +github.com/muety/wakapi/services/report.go:41.2,41.12 1 0 +github.com/muety/wakapi/services/report.go:35.33,36.31 1 0 +github.com/muety/wakapi/services/report.go:36.31,38.4 1 0 +github.com/muety/wakapi/services/report.go:44.38,48.16 3 0 +github.com/muety/wakapi/services/report.go:52.2,53.26 2 0 +github.com/muety/wakapi/services/report.go:48.16,50.3 1 0 +github.com/muety/wakapi/services/report.go:53.26,55.3 1 0 +github.com/muety/wakapi/services/report.go:60.61,65.65 3 0 +github.com/muety/wakapi/services/report.go:73.2,73.65 1 0 +github.com/muety/wakapi/services/report.go:85.2,85.24 1 0 +github.com/muety/wakapi/services/report.go:65.65,70.3 4 0 +github.com/muety/wakapi/services/report.go:73.65,83.3 4 0 +github.com/muety/wakapi/services/report.go:88.80,89.22 1 0 +github.com/muety/wakapi/services/report.go:93.2,93.29 1 0 +github.com/muety/wakapi/services/report.go:98.2,102.16 4 0 +github.com/muety/wakapi/services/report.go:107.2,114.65 2 0 +github.com/muety/wakapi/services/report.go:119.2,120.12 2 0 +github.com/muety/wakapi/services/report.go:89.22,91.3 1 0 +github.com/muety/wakapi/services/report.go:93.29,96.3 2 0 +github.com/muety/wakapi/services/report.go:102.16,105.3 2 0 +github.com/muety/wakapi/services/report.go:114.65,117.3 2 0 diff --git a/main.go b/main.go index bb55c33..ec42035 100644 --- a/main.go +++ b/main.go @@ -168,6 +168,7 @@ func main() { wakatimeV1SummariesHandler := wtV1Routes.NewSummariesHandler(userService, summaryService) wakatimeV1StatsHandler := wtV1Routes.NewStatsHandler(userService, summaryService) wakatimeV1UsersHandler := wtV1Routes.NewUsersHandler(userService, heartbeatService) + wakatimeV1ProjectsHandler := wtV1Routes.NewProjectsHandler(userService, heartbeatService) shieldV1BadgeHandler := shieldsV1Routes.NewBadgeHandler(summaryService, userService) // MVC Handlers @@ -207,6 +208,7 @@ func main() { wakatimeV1SummariesHandler.RegisterRoutes(apiRouter) wakatimeV1StatsHandler.RegisterRoutes(apiRouter) wakatimeV1UsersHandler.RegisterRoutes(apiRouter) + wakatimeV1ProjectsHandler.RegisterRoutes(apiRouter) shieldV1BadgeHandler.RegisterRoutes(apiRouter) // Static Routes diff --git a/mocks/heartbeat_service.go b/mocks/heartbeat_service.go index 72b2515..0eebe42 100644 --- a/mocks/heartbeat_service.go +++ b/mocks/heartbeat_service.go @@ -55,6 +55,11 @@ func (m *HeartbeatServiceMock) GetLatestByOriginAndUser(s string, user *models.U return args.Get(0).(*models.Heartbeat), args.Error(1) } +func (m *HeartbeatServiceMock) GetEntitySetByUser(u uint8, user *models.User) ([]string, error) { + args := m.Called(u, user) + return args.Get(0).([]string), args.Error(1) +} + func (m *HeartbeatServiceMock) DeleteBefore(time time.Time) error { args := m.Called(time) return args.Error(0) diff --git a/models/compat/wakatime/v1/project.go b/models/compat/wakatime/v1/project.go new file mode 100644 index 0000000..d00068e --- /dev/null +++ b/models/compat/wakatime/v1/project.go @@ -0,0 +1,11 @@ +package v1 + +type ProjectsViewModel struct { + Data []*Project `json:"data"` +} + +type Project struct { + ID string `json:"id"` + Name string `json:"name"` + Repository string `json:"repository"` +} diff --git a/repositories/heartbeart.go b/repositories/heartbeart.go index 0c86600..7de6eb9 100644 --- a/repositories/heartbeart.go +++ b/repositories/heartbeart.go @@ -1,6 +1,7 @@ package repositories import ( + "errors" "github.com/muety/wakapi/models" "gorm.io/gorm" "gorm.io/gorm/clause" @@ -136,6 +137,24 @@ func (r *HeartbeatRepository) CountByUsers(users []*models.User) ([]*models.Coun return counts, nil } +func (r HeartbeatRepository) GetEntitySetByUser(entityType uint8, user *models.User) ([]string, error) { + columns := []string{"project", "language", "editor", "operating_system", "machine"} + if int(entityType) >= len(columns) { + // invalid entity type + return nil, errors.New("invalid entity type") + } + + var results []string + if err := r.db. + Model(&models.Heartbeat{}). + Distinct(columns[entityType]). + Where(&models.Heartbeat{UserID: user.ID}). + Find(&results).Error; err != nil { + return nil, err + } + return results, nil +} + func (r *HeartbeatRepository) DeleteBefore(t time.Time) error { if err := r.db. Where("time <= ?", t.Local()). diff --git a/repositories/repositories.go b/repositories/repositories.go index ae935a7..25b14db 100644 --- a/repositories/repositories.go +++ b/repositories/repositories.go @@ -27,6 +27,7 @@ type IHeartbeatRepository interface { Count() (int64, error) CountByUser(*models.User) (int64, error) CountByUsers([]*models.User) ([]*models.CountByUser, error) + GetEntitySetByUser(uint8, *models.User) ([]string, error) DeleteBefore(time.Time) error } diff --git a/routes/api/heartbeat.go b/routes/api/heartbeat.go index 70d4a60..db35940 100644 --- a/routes/api/heartbeat.go +++ b/routes/api/heartbeat.go @@ -39,7 +39,7 @@ func (h *HeartbeatApiHandler) RegisterRoutes(router *mux.Router) { middlewares.NewAuthenticateMiddleware(h.userSrvc).Handler, customMiddleware.NewWakatimeRelayMiddleware().Handler, ) - r.Path("").Methods(http.MethodPost).HandlerFunc(h.Post) + r.Methods(http.MethodPost).HandlerFunc(h.Post) } // @Summary Push a new heartbeat diff --git a/routes/compat/wakatime/v1/projects.go b/routes/compat/wakatime/v1/projects.go new file mode 100644 index 0000000..141ee24 --- /dev/null +++ b/routes/compat/wakatime/v1/projects.go @@ -0,0 +1,76 @@ +package v1 + +import ( + "github.com/gorilla/mux" + conf "github.com/muety/wakapi/config" + "github.com/muety/wakapi/middlewares" + "github.com/muety/wakapi/models" + v1 "github.com/muety/wakapi/models/compat/wakatime/v1" + "github.com/muety/wakapi/services" + "github.com/muety/wakapi/utils" + "net/http" + "strings" +) + +type ProjectsHandler struct { + config *conf.Config + userSrvc services.IUserService + heartbeatSrvc services.IHeartbeatService +} + +func NewProjectsHandler(userService services.IUserService, heartbeatsService services.IHeartbeatService) *ProjectsHandler { + return &ProjectsHandler{ + userSrvc: userService, + heartbeatSrvc: heartbeatsService, + config: conf.Get(), + } +} + +func (h *ProjectsHandler) RegisterRoutes(router *mux.Router) { + r := router.PathPrefix("/compat/wakatime/v1/users/{user}/projects").Subrouter() + r.Use( + middlewares.NewAuthenticateMiddleware(h.userSrvc).Handler, + ) + r.Path("").Methods(http.MethodGet).HandlerFunc(h.Get) +} + +// @Summary Retrieve and fitler the user's projects +// @Description Mimics https://wakatime.com/developers#projects +// @ID get-wakatime-projects +// @Tags wakatime +// @Produce json +// @Param user path string true "User ID to fetch data for (or 'current')" +// @Param q query string true "Query to filter projects by" +// @Security ApiKeyAuth +// @Success 200 {object} v1.ProjectsViewModel +// @Router /compat/wakatime/v1/users/{user}/projects [get] +func (h *ProjectsHandler) Get(w http.ResponseWriter, r *http.Request) { + var vars = mux.Vars(r) + requestedUser := vars["user"] + authorizedUser := middlewares.GetPrincipal(r) + + if requestedUser != authorizedUser.ID && requestedUser != "current" { + w.WriteHeader(http.StatusForbidden) + return + } + + results, err := h.heartbeatSrvc.GetEntitySetByUser(models.SummaryProject, authorizedUser) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte("something went wrong")) + conf.Log().Request(r).Error(err.Error()) + return + } + + q := r.URL.Query().Get("q") + + projects := make([]*v1.Project, 0, len(results)) + for _, p := range results { + if strings.HasPrefix(p, q) { + projects = append(projects, &v1.Project{ID: p, Name: p}) + } + } + + vm := &v1.ProjectsViewModel{Data: projects} + utils.RespondJSON(w, r, http.StatusOK, vm) +} diff --git a/services/heartbeat.go b/services/heartbeat.go index 110572e..3cc4311 100644 --- a/services/heartbeat.go +++ b/services/heartbeat.go @@ -1,8 +1,11 @@ package services import ( + "fmt" "github.com/muety/wakapi/config" "github.com/muety/wakapi/repositories" + "github.com/muety/wakapi/utils" + "github.com/patrickmn/go-cache" "time" "github.com/muety/wakapi/models" @@ -10,6 +13,7 @@ import ( type HeartbeatService struct { config *config.Config + cache *cache.Cache repository repositories.IHeartbeatRepository languageMappingSrvc ILanguageMappingService } @@ -17,12 +21,14 @@ type HeartbeatService struct { func NewHeartbeatService(heartbeatRepo repositories.IHeartbeatRepository, languageMappingService ILanguageMappingService) *HeartbeatService { return &HeartbeatService{ config: config.Get(), + cache: cache.New(24*time.Hour, 24*time.Hour), repository: heartbeatRepo, languageMappingSrvc: languageMappingService, } } func (srv *HeartbeatService) Insert(heartbeat *models.Heartbeat) error { + srv.updateEntityUserCacheByHeartbeat(heartbeat) return srv.repository.InsertBatch([]*models.Heartbeat{heartbeat}) } @@ -36,6 +42,7 @@ func (srv *HeartbeatService) InsertBatch(heartbeats []*models.Heartbeat) error { filteredHeartbeats = append(filteredHeartbeats, hb) hashes[hb.Hash] = true } + srv.updateEntityUserCacheByHeartbeat(hb) } return srv.repository.InsertBatch(filteredHeartbeats) @@ -73,6 +80,20 @@ func (srv *HeartbeatService) GetFirstByUsers() ([]*models.TimeByUser, error) { return srv.repository.GetFirstByUsers() } +func (srv *HeartbeatService) GetEntitySetByUser(entityType uint8, user *models.User) ([]string, error) { + cacheKey := srv.getEntityUserCacheKey(entityType, user) + if results, found := srv.cache.Get(cacheKey); found { + return utils.SetToStrings(results.(map[string]bool)), nil + } + + results, err := srv.repository.GetEntitySetByUser(entityType, user) + if err != nil { + return nil, err + } + srv.cache.Set(cacheKey, utils.StringsToSet(results), cache.DefaultExpiration) + return results, nil +} + func (srv *HeartbeatService) DeleteBefore(t time.Time) error { return srv.repository.DeleteBefore(t) } @@ -89,3 +110,26 @@ func (srv *HeartbeatService) augmented(heartbeats []*models.Heartbeat, userId st return heartbeats, nil } + +func (srv *HeartbeatService) getEntityUserCacheKey(entityType uint8, user *models.User) string { + return fmt.Sprintf("entity_set_%d_%s", entityType, user.ID) +} + +func (srv *HeartbeatService) updateEntityUserCache(entityType uint8, entityKey string, user *models.User) { + cacheKey := srv.getEntityUserCacheKey(entityType, user) + if entities, found := srv.cache.Get(cacheKey); found { + if _, ok := entities.(map[string]bool)[entityKey]; !ok { + // new project / language / ..., which is not yet present in cache, arrived as part of a heartbeats + // -> invalidate cache + srv.cache.Delete(cacheKey) + } + } +} + +func (srv *HeartbeatService) updateEntityUserCacheByHeartbeat(hb *models.Heartbeat) { + srv.updateEntityUserCache(models.SummaryProject, hb.Project, hb.User) + srv.updateEntityUserCache(models.SummaryLanguage, hb.Language, hb.User) + srv.updateEntityUserCache(models.SummaryEditor, hb.Editor, hb.User) + srv.updateEntityUserCache(models.SummaryOS, hb.OperatingSystem, hb.User) + srv.updateEntityUserCache(models.SummaryMachine, hb.Machine, hb.User) +} diff --git a/services/services.go b/services/services.go index 6b3f9fe..7d5327b 100644 --- a/services/services.go +++ b/services/services.go @@ -35,6 +35,7 @@ type IHeartbeatService interface { GetFirstByUsers() ([]*models.TimeByUser, error) GetLatestByUser(*models.User) (*models.Heartbeat, error) GetLatestByOriginAndUser(string, *models.User) (*models.Heartbeat, error) + GetEntitySetByUser(uint8, *models.User) ([]string, error) DeleteBefore(time.Time) error } diff --git a/static/docs/docs.go b/static/docs/docs.go index 7414b63..e7e098d 100644 --- a/static/docs/docs.go +++ b/static/docs/docs.go @@ -160,6 +160,48 @@ var doc = `{ } } }, + "/compat/wakatime/v1/users/{user}/projects": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Mimics https://wakatime.com/developers#projects", + "produces": [ + "application/json" + ], + "tags": [ + "wakatime" + ], + "summary": "Retrieve and fitler the user's projects", + "operationId": "get-wakatime-projects", + "parameters": [ + { + "type": "string", + "description": "User ID to fetch data for (or 'current')", + "name": "user", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Query to filter projects by", + "name": "q", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ProjectsViewModel" + } + } + } + } + }, "/compat/wakatime/v1/users/{user}/stats/{range}": { "get": { "security": [ @@ -574,6 +616,31 @@ var doc = `{ } } }, + "v1.Project": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "repository": { + "type": "string" + } + } + }, + "v1.ProjectsViewModel": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.Project" + } + } + } + }, "v1.StatsData": { "type": "object", "properties": { diff --git a/static/docs/swagger.json b/static/docs/swagger.json index 9c49006..1fcf65a 100644 --- a/static/docs/swagger.json +++ b/static/docs/swagger.json @@ -144,6 +144,48 @@ } } }, + "/compat/wakatime/v1/users/{user}/projects": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Mimics https://wakatime.com/developers#projects", + "produces": [ + "application/json" + ], + "tags": [ + "wakatime" + ], + "summary": "Retrieve and fitler the user's projects", + "operationId": "get-wakatime-projects", + "parameters": [ + { + "type": "string", + "description": "User ID to fetch data for (or 'current')", + "name": "user", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Query to filter projects by", + "name": "q", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ProjectsViewModel" + } + } + } + } + }, "/compat/wakatime/v1/users/{user}/stats/{range}": { "get": { "security": [ @@ -558,6 +600,31 @@ } } }, + "v1.Project": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "repository": { + "type": "string" + } + } + }, + "v1.ProjectsViewModel": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.Project" + } + } + } + }, "v1.StatsData": { "type": "object", "properties": { diff --git a/static/docs/swagger.yaml b/static/docs/swagger.yaml index 12b0eae..e1542cc 100644 --- a/static/docs/swagger.yaml +++ b/static/docs/swagger.yaml @@ -117,6 +117,22 @@ definitions: schemaVersion: type: integer type: object + v1.Project: + properties: + id: + type: string + name: + type: string + repository: + type: string + type: object + v1.ProjectsViewModel: + properties: + data: + items: + $ref: '#/definitions/v1.Project' + type: array + type: object v1.StatsData: properties: daily_average: @@ -392,6 +408,33 @@ paths: summary: Retrieve summary for all time tags: - wakatime + /compat/wakatime/v1/users/{user}/projects: + get: + description: Mimics https://wakatime.com/developers#projects + operationId: get-wakatime-projects + parameters: + - description: User ID to fetch data for (or 'current') + in: path + name: user + required: true + type: string + - description: Query to filter projects by + in: query + name: q + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/v1.ProjectsViewModel' + security: + - ApiKeyAuth: [] + summary: Retrieve and fitler the user's projects + tags: + - wakatime /compat/wakatime/v1/users/{user}/stats/{range}: get: description: Mimics https://wakatime.com/developers#stats diff --git a/utils/set.go b/utils/set.go new file mode 100644 index 0000000..6f88023 --- /dev/null +++ b/utils/set.go @@ -0,0 +1,17 @@ +package utils + +func StringsToSet(slice []string) map[string]bool { + set := make(map[string]bool, len(slice)) + for _, e := range slice { + set[e] = true + } + return set +} + +func SetToStrings(set map[string]bool) []string { + slice := make([]string, len(set)) + for k := range set { + slice = append(slice, k) + } + return slice +} diff --git a/version.txt b/version.txt index 5db08bf..08002f8 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.27.0 +1.27.1