From d23444c799310eeb75e0a8ef9ce573923f2c4282 Mon Sep 17 00:00:00 2001 From: Christian Beutel <> Date: Mon, 17 Mar 2025 02:09:00 +0100 Subject: [PATCH] front end fixes --- db/go.mod | 6 - db/go.sum | 148 +++--------- db/integrations/komoot/komoot.go | 22 +- db/integrations/strava/strava.go | 25 +- db/main.go | 225 ++++++++++++------ .../1742172170_updated__superusers.go | 44 ++++ db/util/notification.go | 7 +- web/src/hooks.client.ts | 2 +- web/src/hooks.server.ts | 16 +- web/src/lib/components/nav_bar.svelte | 2 +- web/src/lib/components/share_info.svelte | 2 +- .../lib/components/trail/trail_card.svelte | 4 +- .../components/trail/trail_dropdown.svelte | 4 +- .../trail/trail_filter_panel.svelte | 2 +- .../components/trail/trail_info_panel.svelte | 6 +- .../components/trail/trail_list_item.svelte | 2 +- web/src/lib/i18n/index.ts | 2 +- web/src/lib/stores/comment_store.ts | 4 +- web/src/lib/stores/integration_store.ts | 4 +- web/src/lib/stores/list_store.ts | 20 +- web/src/lib/stores/summit_log_store.ts | 4 +- web/src/lib/stores/trail_store.ts | 10 +- web/src/lib/stores/user_store.ts | 4 +- web/src/lib/stores/waypoint_store.ts | 4 +- web/src/routes/api/v1/auth/oauth/+server.ts | 4 +- .../[collection]/[record]/[file]/+server.ts | 2 +- web/src/routes/api/v1/list/+server.ts | 2 +- web/src/routes/api/v1/summit-log/+server.ts | 2 +- web/src/routes/api/v1/trail/+server.ts | 2 +- web/src/routes/api/v1/trail/[id]/+server.ts | 2 +- .../api/v1/trail/bounding-box/+server.ts | 4 +- web/src/routes/api/v1/trail/filter/+server.ts | 4 +- .../routes/api/v1/trail/recommend/+server.ts | 4 +- web/src/routes/api/v1/user/[id]/+server.ts | 4 +- web/src/routes/login/+page.svelte | 22 +- web/src/routes/trail/edit/[id]/+page.ts | 2 +- 36 files changed, 328 insertions(+), 295 deletions(-) create mode 100644 db/migrations/1742172170_updated__superusers.go diff --git a/db/go.mod b/db/go.mod index c8a04abd..e9264ba5 100644 --- a/db/go.mod +++ b/db/go.mod @@ -5,7 +5,6 @@ go 1.23 toolchain go1.24.1 require ( - github.com/labstack/echo/v5 v5.0.0-20230722203903-ec5b858dab61 github.com/meilisearch/meilisearch-go v0.29.0 github.com/pocketbase/dbx v1.11.0 github.com/pocketbase/pocketbase v0.23.12 @@ -43,7 +42,6 @@ require ( github.com/gabriel-vasile/mimetype v1.4.7 // indirect github.com/ganigeorgiev/fexpr v0.4.1 // indirect github.com/go-ozzo/ozzo-validation/v4 v4.3.0 // indirect - github.com/goccy/go-json v0.10.3 // indirect github.com/golang-jwt/jwt/v4 v4.5.1 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/google/uuid v1.6.0 // indirect @@ -55,7 +53,6 @@ require ( github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-sqlite3 v1.14.22 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/ncruces/go-strftime v0.1.9 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect @@ -64,8 +61,6 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/twpayne/go-gpx v1.4.1 github.com/twpayne/go-polyline v1.1.1 - github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasttemplate v1.2.2 // indirect go.opencensus.io v0.24.0 // indirect gocloud.dev v0.40.0 // indirect golang.org/x/crypto v0.31.0 // indirect @@ -76,7 +71,6 @@ require ( golang.org/x/sys v0.28.0 // indirect golang.org/x/term v0.27.0 // indirect golang.org/x/text v0.21.0 // indirect - golang.org/x/time v0.8.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/api v0.214.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20241219192143-6b3ec007d9bb // indirect diff --git a/db/go.sum b/db/go.sum index 2e8989f5..57bbc4ec 100644 --- a/db/go.sum +++ b/db/go.sum @@ -1,12 +1,12 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ= -cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc= -cloud.google.com/go/auth v0.9.1 h1:+pMtLEV2k0AXKvs/tGZojuj6QaioxfUjOpMsG5Gtx+w= -cloud.google.com/go/auth v0.9.1/go.mod h1:Sw8ocT5mhhXxFklyhT12Eiy0ed6tTrPMCJjSI8KhYLk= -cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= -cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= -cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= -cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= +cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14= +cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU= +cloud.google.com/go/auth v0.13.0 h1:8Fu8TZy167JkW8Tj3q7dIkr2v4cndv41ouecJx0PAHs= +cloud.google.com/go/auth v0.13.0/go.mod h1:COOjD9gwfKNKz+IIduatIhYJQIc0mG3H102r/EMxX6Q= +cloud.google.com/go/auth/oauth2adapt v0.2.6 h1:V6a6XDu2lTwPZWOawrAa9HUK+DB2zfJyTuciBG5hFkU= +cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= +cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= +cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= cloud.google.com/go/iam v1.1.13 h1:7zWBXG9ERbMLrzQBRhFliAV+kjcRToDTgQT3CTwYyv4= cloud.google.com/go/iam v1.1.13/go.mod h1:K8mY0uSXwEXS30KrnVb+j54LB/ntfZu1dr+4zFMNbus= cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs= @@ -29,78 +29,42 @@ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3d github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= -github.com/aws/aws-sdk-go-v2 v1.32.2 h1:AkNLZEyYMLnx/Q/mSKkcMqwNFXMAvFto9bNsHqcTduI= -github.com/aws/aws-sdk-go-v2 v1.32.2/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= github.com/aws/aws-sdk-go-v2 v1.32.7 h1:ky5o35oENWi0JYWUZkB7WYvVPP+bcRF5/Iq7JWSb5Rw= github.com/aws/aws-sdk-go-v2 v1.32.7/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 h1:70PVAiL15/aBMh5LThwgXdSQorVr91L127ttckI9QQU= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4/go.mod h1:/MQxMqci8tlqDH+pjmoLu1i0tbWCUP1hhyMRuFxpQCw= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 h1:lL7IfaFzngfx0ZwUGOZdsFFnQ5uLvR0hWqqhyE7Q9M8= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7/go.mod h1:QraP0UcVlQJsmHfioCrveWOC1nbiWUl3ej08h4mXWoc= -github.com/aws/aws-sdk-go-v2/config v1.27.31 h1:kxBoRsjhT3pq0cKthgj6RU6bXTm/2SgdoUMyrVw0rAI= -github.com/aws/aws-sdk-go-v2/config v1.27.31/go.mod h1:z04nZdSWFPaDwK3DdJOG2r+scLQzMYuJeW0CujEm9FM= github.com/aws/aws-sdk-go-v2/config v1.28.7 h1:GduUnoTXlhkgnxTD93g1nv4tVPILbdNQOzav+Wpg7AE= github.com/aws/aws-sdk-go-v2/config v1.28.7/go.mod h1:vZGX6GVkIE8uECSUHB6MWAUsd4ZcG2Yq/dMa4refR3M= -github.com/aws/aws-sdk-go-v2/credentials v1.17.30 h1:aau/oYFtibVovr2rDt8FHlU17BTicFEMAi29V1U+L5Q= -github.com/aws/aws-sdk-go-v2/credentials v1.17.30/go.mod h1:BPJ/yXV92ZVq6G8uYvbU0gSl8q94UB63nMT5ctNO38g= github.com/aws/aws-sdk-go-v2/credentials v1.17.48 h1:IYdLD1qTJ0zanRavulofmqut4afs45mOWEI+MzZtTfQ= github.com/aws/aws-sdk-go-v2/credentials v1.17.48/go.mod h1:tOscxHN3CGmuX9idQ3+qbkzrjVIx32lqDSU1/0d/qXs= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12 h1:yjwoSyDZF8Jth+mUk5lSPJCkMC0lMy6FaCD51jm6ayE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12/go.mod h1:fuR57fAgMk7ot3WcNQfb6rSEn+SUffl7ri+aa8uKysI= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22 h1:kqOrpojG71DxJm/KDPO+Z/y1phm1JlC8/iT+5XRmAn8= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22/go.mod h1:NtSFajXVVL8TA2QNngagVZmUtXciyrHOt7xgz4faS/M= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.15 h1:ijB7hr56MngOiELJe0C5aQRaBQ11LveNgWFyG02AUto= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.15/go.mod h1:0QEmQSSWMVfiAk93l1/ayR9DQ9+jwni7gHS2NARZXB0= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.44 h1:2zxMLXLedpB4K1ilbJFxtMKsVKaexOqDttOhc0QGm3Q= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.44/go.mod h1:VuLHdqwjSvgftNC7yqPWyGVhEwPmJpeRi07gOgOfHF8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16 h1:TNyt/+X43KJ9IJJMjKfa3bNTiZbUP7DeCxfbTROESwY= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16/go.mod h1:2DwJF39FlNAUiX5pAc0UNeiz16lK2t7IaFcm0LFHEgc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 h1:I/5wmGMffY4happ8NOCuIUEWGUvvFp5NSeQcXl9RHcI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26/go.mod h1:FR8f4turZtNy6baO0KJ5FJUmXH/cSkI9fOngs0yl6mA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16 h1:jYfy8UPmd+6kJW5YhY0L1/KftReOGxI/4NtVSTh9O/I= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16/go.mod h1:7ZfEPZxkW42Afq4uQB8H2E2e6ebh6mXTueEpYzjCzcs= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26 h1:zXFLuEuMMUOvEARXFUVJdfqZ4bvvSgdGRq/ATcrQxzM= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26/go.mod h1:3o2Wpy0bogG1kyOPrgkXA8pgIfEEv0+m19O9D5+W8y8= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.16 h1:mimdLQkIX1zr8GIPY1ZtALdBQGxcASiBd2MOp8m/dMc= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.16/go.mod h1:YHk6owoSwrIsok+cAH9PENCOGoH5PU2EllX4vLtSrsY= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.26 h1:GeNJsIFHB+WW5ap2Tec4K6dzcVTsRbsT1Lra46Hv9ME= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.26/go.mod h1:zfgMpwHDXX2WGoG84xG2H+ZlPTkJUU4YUvx2svLQYWo= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.18 h1:GckUnpm4EJOAio1c8o25a+b3lVfwVzC9gnSBqiiNmZM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.18/go.mod h1:Br6+bxfG33Dk3ynmkhsW2Z/t9D4+lRqdLDNCKi85w0U= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.7 h1:tB4tNw83KcajNAzaIMhkhVI2Nt8fAZd5A5ro113FEMY= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.7/go.mod h1:lvpyBGkZ3tZ9iSsUIcC2EWp+0ywa7aK3BLT+FwZi+mQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.18 h1:tJ5RnkHCiSH0jyd6gROjlJtNwov0eGYNz8s8nFcR0jQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.18/go.mod h1:++NHzT+nAF7ZPrHPsA+ENvsXkOO8wEu+C6RXltAG4/c= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7 h1:8eUsivBQzZHqe/3FE+cqwfH+0p5Jo8PFM/QYQSmeZ+M= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7/go.mod h1:kLPQvGUmxn/fqiCrDeohwG33bq2pQpGeY62yRO6Nrh0= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.16 h1:jg16PhLPUiHIj8zYIW6bqzeQSuHVEiWnGA0Brz5Xv2I= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.16/go.mod h1:Uyk1zE1VVdsHSU7096h/rwnXDzOzYQVl+FNPhPw7ShY= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.7 h1:Hi0KGbrnr57bEHWM0bJ1QcBzxLrL/k2DHvGYhb8+W1w= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.7/go.mod h1:wKNgWgExdjjrm4qvfbTorkvocEstaoDl4WCvGfeCy9c= -github.com/aws/aws-sdk-go-v2/service/s3 v1.60.1 h1:mx2ucgtv+MWzJesJY9Ig/8AFHgoE5FwLXwUVgW/FGdI= -github.com/aws/aws-sdk-go-v2/service/s3 v1.60.1/go.mod h1:BSPI0EfnYUuNHPS0uqIo5VrRwzie+Fp+YhQOUs16sKI= github.com/aws/aws-sdk-go-v2/service/s3 v1.71.1 h1:aOVVZJgWbaH+EJYPvEgkNhCEbXXvH7+oML36oaPK3zE= github.com/aws/aws-sdk-go-v2/service/s3 v1.71.1/go.mod h1:r+xl5yzMk9083rMR+sJ5TYj9Tihvf/l1oxzZXDgGj2Q= -github.com/aws/aws-sdk-go-v2/service/sso v1.22.5 h1:zCsFCKvbj25i7p1u94imVoO447I/sFv8qq+lGJhRN0c= -github.com/aws/aws-sdk-go-v2/service/sso v1.22.5/go.mod h1:ZeDX1SnKsVlejeuz41GiajjZpRSWR7/42q/EyA/QEiM= github.com/aws/aws-sdk-go-v2/service/sso v1.24.8 h1:CvuUmnXI7ebaUAhbJcDy9YQx8wHR69eZ9I7q5hszt/g= github.com/aws/aws-sdk-go-v2/service/sso v1.24.8/go.mod h1:XDeGv1opzwm8ubxddF0cgqkZWsyOtw4lr6dxwmb6YQg= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5 h1:SKvPgvdvmiTWoi0GAJ7AsJfOz3ngVkD/ERbs5pUnHNI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5/go.mod h1:20sz31hv/WsPa3HhU3hfrIet2kxM4Pe0r20eBZ20Tac= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7 h1:F2rBfNAL5UyswqoeWv9zs74N/NanhK16ydHW1pahX6E= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7/go.mod h1:JfyQ0g2JG8+Krq0EuZNnRwX0mU0HrwY/tG6JNfcqh4k= -github.com/aws/aws-sdk-go-v2/service/sts v1.30.5 h1:OMsEmCyz2i89XwRwPouAJvhj81wINh+4UK+k/0Yo/q8= -github.com/aws/aws-sdk-go-v2/service/sts v1.30.5/go.mod h1:vmSqFK+BVIwVpDAGZB3CoCXHzurt4qBE8lf+I/kRTh0= github.com/aws/aws-sdk-go-v2/service/sts v1.33.3 h1:Xgv/hyNgvLda/M9l9qxXc4UFSgppnRczLxlMs5Ae/QY= github.com/aws/aws-sdk-go-v2/service/sts v1.33.3/go.mod h1:5Gn+d+VaaRgsjewpMvGazt0WfcFO+Md4wLOuBfGR9Bc= -github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM= -github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -123,16 +87,12 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4= -github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4= github.com/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA= github.com/gabriel-vasile/mimetype v1.4.7/go.mod h1:GDlAgAyIRT27BhFl53XNAFtfjzOkLaF35JdEG0P7LtU= github.com/ganigeorgiev/fexpr v0.4.1 h1:hpUgbUEEWIZhSDBtf4M9aUNfQQ0BZkGRaMePy7Gcx5k= @@ -146,16 +106,11 @@ github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRi github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= -github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -179,8 +134,8 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 h1:5iH8iuqE5apketRbSFBy+X1V0o+l+8NF1avt4HWl7cA= -github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -188,10 +143,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI= github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= -github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= @@ -212,8 +165,6 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labstack/echo/v5 v5.0.0-20230722203903-ec5b858dab61 h1:FwuzbVh87iLiUQj1+uQUsuw9x5t9m5n5g7rG7o4svW4= -github.com/labstack/echo/v5 v5.0.0-20230722203903-ec5b858dab61/go.mod h1:paQfF1YtHe+GrGg5fOgjsjoCX/UKDr9bc1DoWpZfns8= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -223,8 +174,6 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= -github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/meilisearch/meilisearch-go v0.29.0 h1:HZ9NEKN59USINQ/DXJge/aaXq8IrsKbXGTdAoBaaDz4= github.com/meilisearch/meilisearch-go v0.29.0/go.mod h1:2cRCAn4ddySUsFfNDLVPod/plRibQsJkXF/4gLhxbOk= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= @@ -234,12 +183,8 @@ github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdh github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pocketbase/dbx v1.10.1 h1:cw+vsyfCJD8YObOVeqb93YErnlxwYMkNZ4rwN0G0AaA= -github.com/pocketbase/dbx v1.10.1/go.mod h1:xXRCIAKTHMgUCyCKZm55pUOdvFziJjQfXaWKhu2vhMs= github.com/pocketbase/dbx v1.11.0 h1:LpZezioMfT3K4tLrqA55wWFw1EtH1pM4tzSVa7kgszU= github.com/pocketbase/dbx v1.11.0/go.mod h1:xXRCIAKTHMgUCyCKZm55pUOdvFziJjQfXaWKhu2vhMs= -github.com/pocketbase/pocketbase v0.22.26 h1:8hoD9xCEOaZfDpP23FkFH6A51QDfM0gK+vnxlTCyNXw= -github.com/pocketbase/pocketbase v0.22.26/go.mod h1:h2ojT2pqBWH9LLl1aiawkwXiICKtzZA/kjM/8VhydR4= github.com/pocketbase/pocketbase v0.23.12 h1:HB4THFbzaliF0C3wvpx+kNOZxIwCEMDqN3/17gn5N7E= github.com/pocketbase/pocketbase v0.23.12/go.mod h1:OcFJNMO0Vzt3f9+lweMbup6iL7V13ckxu1pdEY6FeM0= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -248,8 +193,6 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qq github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= -github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= @@ -275,25 +218,23 @@ github.com/twpayne/go-gpx v1.4.1 h1:Y41EDC/r49OH6pTAQUk4Qpcp9z96fOvVLchRq/P4iys= github.com/twpayne/go-gpx v1.4.1/go.mod h1:6bVeKyVqzHRZ25UdFOWxv0f6SMW0P9lO7GO1aNNznEU= github.com/twpayne/go-polyline v1.1.1 h1:/tSF1BR7rN4HWj4XKqvRUNrCiYVMCvywxTFVofvDV0w= github.com/twpayne/go-polyline v1.1.1/go.mod h1:ybd9IWWivW/rlXPXuuckeKUyF3yrIim+iqA7kSl4NFY= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= -github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= -gocloud.dev v0.39.0 h1:EYABYGhAalPUaMrbSKOr5lejxoxvXj99nE8XFtsDgds= -gocloud.dev v0.39.0/go.mod h1:drz+VyYNBvrMTW0KZiBAYEdl8lbNZx+OQ7oQvdrFmSQ= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= +go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= +go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= +go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= +go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= gocloud.dev v0.40.0 h1:f8LgP+4WDqOG/RXoUcyLpeIAGOcAbZrZbDQCUee10ng= gocloud.dev v0.40.0/go.mod h1:drz+VyYNBvrMTW0KZiBAYEdl8lbNZx+OQ7oQvdrFmSQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -303,16 +244,14 @@ golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.19.0 h1:D9FX4QWkLfkeqaC62SonffIIuYdOk/UE2XKUBgRIBIQ= -golang.org/x/image v0.19.0/go.mod h1:y0zrRqlQRWQ5PXaYCOMLTW2fpsxZ8Qh9I/ohnInJEys= golang.org/x/image v0.23.0 h1:HseQ7c2OpPKTPVzNjG5fwJsOTCiiwS4QdsYi5XU6H68= golang.org/x/image v0.23.0/go.mod h1:wJJBTdLfCCf3tiHa1fNxpZmUI4mmoZvwMCPP0ddoNKY= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -326,8 +265,6 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= -golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -360,8 +297,7 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= -golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -370,16 +306,12 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= -golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= +golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= +golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 h1:LLhsEBxRTBLuKlQxFBYUOU8xyFgXv6cOTp2HASDlsDk= -golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/api v0.194.0 h1:dztZKG9HgtIpbI35FhfuSNR/zmaMVdxNlntHj1sIS4s= -google.golang.org/api v0.194.0/go.mod h1:AgvUFdojGANh3vI+P7EVnxj3AISHllxGCJSFmggmnd0= google.golang.org/api v0.214.0 h1:h2Gkq07OYi6kusGOaT/9rnNljuXmqPnaig7WGPmKbwA= google.golang.org/api v0.214.0/go.mod h1:bYPpLG8AyeMWwDU6NXoB00xC0DFkikVvd5MfwoxjLqE= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -388,12 +320,10 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20240814211410-ddb44dafa142 h1:oLiyxGgE+rt22duwci1+TG7bg2/L1LQsXwfjPlmuJA0= -google.golang.org/genproto v0.0.0-20240814211410-ddb44dafa142/go.mod h1:G11eXq53iI5Q+kyNOmCvnzBaxEA2Q/Ik5Tj7nqBE8j4= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 h1:+/tmTy5zAieooKIXfzDm9KiA3Bv6JBwriRN9LY+yayk= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988/go.mod h1:4+X6GvPs+25wZKbQq9qyAXrwIRExv7w0Ea6MgZLZiDM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed h1:J6izYgfBXAI3xTKLgxzTmUltdYaLsuBxFCgDHWJ/eXg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 h1:CT2Thj5AuPV9phrYMtzX11k+XkzMGfRAet42PmoTATM= +google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988/go.mod h1:7uvplUBj4RjHAxIZ//98LzOvrQ04JBkaixRmCMI29hc= +google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 h1:CkkIfIt50+lT6NHAVoRYEyAvQGFM7xEwXUUywFvEb3Q= +google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576/go.mod h1:1R3kvZ1dtP3+4p4d3G8uJ8rFk/fWlScl38vanWACI08= google.golang.org/genproto/googleapis/rpc v0.0.0-20241219192143-6b3ec007d9bb h1:3oy2tynMOP1QbTC0MsNNAV+Se8M2Bd0A5+x1QHyw+pI= google.golang.org/genproto/googleapis/rpc v0.0.0-20241219192143-6b3ec007d9bb/go.mod h1:lcTa1sDdWEIHMWlITnIczmw5w60CF9ffkb8Z+DVmmjA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -401,8 +331,6 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU= google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -414,8 +342,6 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= google.golang.org/protobuf v1.36.0 h1:mjIs9gYtt56AzC4ZaffQuh88TZurBGhIJMBZGSxNerQ= google.golang.org/protobuf v1.36.0/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -434,8 +360,6 @@ modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw= modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= -modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a h1:CfbpOLEo2IwNzJdMvE8aiRbPMxoTpgAJeyePh0SmO8M= -modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= modernc.org/gc/v3 v3.0.0-20241213165251-3bc300f6d0c9 h1:ovz6yUKX71igz2yvk4NpiCL5fvdjZAI+DhuDEGx1xyU= modernc.org/gc/v3 v3.0.0-20241213165251-3bc300f6d0c9/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= modernc.org/libc v1.55.3 h1:AzcW1mhlPNrRtjS5sS+eW2ISCgSOLLNyFzRh/V3Qj/U= @@ -448,8 +372,6 @@ modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= -modernc.org/sqlite v1.32.0 h1:6BM4uGza7bWypsw4fdLRsLxut6bHe4c58VeqjRgST8s= -modernc.org/sqlite v1.32.0/go.mod h1:UqoylwmTb9F+IqXERT8bW9zzOWN8qwAIcLdzeBZs4hA= modernc.org/sqlite v1.34.4 h1:sjdARozcL5KJBvYQvLlZEmctRgW9xqIZc2ncN7PU0P8= modernc.org/sqlite v1.34.4/go.mod h1:3QQFCG2SEMtc2nv+Wq4cQCH7Hjcg+p/RMlS1XK+zwbk= modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= diff --git a/db/integrations/komoot/komoot.go b/db/integrations/komoot/komoot.go index 5b10b6bb..0b34d714 100644 --- a/db/integrations/komoot/komoot.go +++ b/db/integrations/komoot/komoot.go @@ -14,14 +14,13 @@ import ( "time" "github.com/pocketbase/dbx" - "github.com/pocketbase/pocketbase" "github.com/pocketbase/pocketbase/core" "github.com/pocketbase/pocketbase/tools/filesystem" "github.com/pocketbase/pocketbase/tools/security" "github.com/twpayne/go-gpx" ) -func SyncKomoot(app *pocketbase.PocketBase) error { +func SyncKomoot(app core.App) error { integrations, err := app.FindAllRecords("integrations", dbx.NewExp("true")) if err != nil { return err @@ -174,7 +173,7 @@ func (k *KomootApi) fetchDetailedTour(tour KomootTour) (*DetailedKomootTour, err return data, nil } -func syncTrailWithTours(app *pocketbase.PocketBase, k *KomootApi, i KomootIntegration, user string, tours []KomootTour) (bool, error) { +func syncTrailWithTours(app core.App, k *KomootApi, i KomootIntegration, user string, tours []KomootTour) (bool, error) { hasNewTours := false for _, tour := range tours { trails, err := app.FindRecordsByFilter("trails", "external_id = {:id}", "", 1, 0, dbx.Params{"id": strconv.Itoa(int(tour.ID))}) @@ -206,7 +205,7 @@ func syncTrailWithTours(app *pocketbase.PocketBase, k *KomootApi, i KomootIntegr return hasNewTours, nil } -func createTrailFromTour(app *pocketbase.PocketBase, detailedTour *DetailedKomootTour, gpx *filesystem.File, user string, wpIds []string) error { +func createTrailFromTour(app core.App, detailedTour *DetailedKomootTour, gpx *filesystem.File, user string, wpIds []string) error { collection, err := app.FindCollectionByNameOrId("trails") if err != nil { return err @@ -268,9 +267,12 @@ func createTrailFromTour(app *pocketbase.PocketBase, detailedTour *DetailedKomoo "author": user, }) - record.Set("photos", photos) - - record.Set("gpx", gpx) + if photos != nil { + record.Set("photos", photos) + } + if gpx != nil { + record.Set("gpx", gpx) + } if err := app.Save(record); err != nil { return err @@ -279,7 +281,7 @@ func createTrailFromTour(app *pocketbase.PocketBase, detailedTour *DetailedKomoo return nil } -func createWaypointsFromTour(app *pocketbase.PocketBase, tour *DetailedKomootTour, user string) ([]string, error) { +func createWaypointsFromTour(app core.App, tour *DetailedKomootTour, user string) ([]string, error) { collection, err := app.FindCollectionByNameOrId("waypoints") if err != nil { return nil, err @@ -319,7 +321,9 @@ func createWaypointsFromTour(app *pocketbase.PocketBase, tour *DetailedKomootTou "distance_from_start": 0, }) - record.Set("photos", photos) + if photos != nil { + record.Set("photos", photos) + } if err := app.Save(record); err != nil { return nil, err diff --git a/db/integrations/strava/strava.go b/db/integrations/strava/strava.go index 0d41780b..806cd7f6 100644 --- a/db/integrations/strava/strava.go +++ b/db/integrations/strava/strava.go @@ -12,7 +12,6 @@ import ( "time" "github.com/pocketbase/dbx" - "github.com/pocketbase/pocketbase" "github.com/pocketbase/pocketbase/core" "github.com/pocketbase/pocketbase/tools/filesystem" "github.com/pocketbase/pocketbase/tools/security" @@ -24,7 +23,7 @@ type StravaApi struct { AceessToken string } -func SyncStrava(app *pocketbase.PocketBase) error { +func SyncStrava(app core.App) error { integrations, err := app.FindAllRecords("integrations", dbx.NewExp("true")) if err != nil { return err @@ -222,7 +221,7 @@ func fetchStravaActivities(accessToken string, page int) ([]StravaActivity, erro return activities, nil } -func syncTrailsWithRoutes(app *pocketbase.PocketBase, accessToken string, user string, routes []StravaRoute) (bool, error) { +func syncTrailsWithRoutes(app core.App, accessToken string, user string, routes []StravaRoute) (bool, error) { hasNewRoutes := false for _, route := range routes { trails, err := app.FindRecordsByFilter("trails", "external_id = {:id}", "", 1, 0, dbx.Params{"id": route.IDStr}) @@ -289,7 +288,7 @@ func fetchRouteGPX(route StravaRoute, accessToken string) (*filesystem.File, err return gpxFile, nil } -func createTrailFromRoute(app *pocketbase.PocketBase, route StravaRoute, gpx *filesystem.File, user string, wpIds []string) error { +func createTrailFromRoute(app core.App, route StravaRoute, gpx *filesystem.File, user string, wpIds []string) error { collection, err := app.FindCollectionByNameOrId("trails") if err != nil { return err @@ -338,7 +337,9 @@ func createTrailFromRoute(app *pocketbase.PocketBase, route StravaRoute, gpx *fi "author": user, }) - record.Set("gpx", gpx) + if gpx != nil { + record.Set("gpx", gpx) + } if err := app.Save(record); err != nil { return err @@ -347,7 +348,7 @@ func createTrailFromRoute(app *pocketbase.PocketBase, route StravaRoute, gpx *fi return nil } -func createWaypointsFromRoute(app *pocketbase.PocketBase, route StravaRoute, user string) ([]string, error) { +func createWaypointsFromRoute(app core.App, route StravaRoute, user string) ([]string, error) { collection, err := app.FindCollectionByNameOrId("waypoints") if err != nil { return nil, err @@ -374,7 +375,7 @@ func createWaypointsFromRoute(app *pocketbase.PocketBase, route StravaRoute, use return wpIds, nil } -func syncTrailsWithActivities(app *pocketbase.PocketBase, accessToken string, user string, activities []StravaActivity) (bool, error) { +func syncTrailsWithActivities(app core.App, accessToken string, user string, activities []StravaActivity) (bool, error) { hasNewActivites := false for _, activity := range activities { trails, err := app.FindRecordsByFilter("trails", "external_id = {:id}", "", 1, 0, dbx.Params{"id": strconv.Itoa(int(activity.ID))}) @@ -430,7 +431,7 @@ func fetchDetailedActivity(activity StravaActivity, accessToken string) (*Detail return &detailedActivity, nil } -func createTrailFromActivity(app *pocketbase.PocketBase, activity *DetailedStravaActivity, gpx *filesystem.File, user string) error { +func createTrailFromActivity(app core.App, activity *DetailedStravaActivity, gpx *filesystem.File, user string) error { collection, err := app.FindCollectionByNameOrId("trails") if err != nil { return err @@ -509,9 +510,13 @@ func createTrailFromActivity(app *pocketbase.PocketBase, activity *DetailedStrav "author": user, }) - record.Set("photos", photo) + if photo != nil { + record.Set("photos", photo) + } - record.Set("gpx", gpx) + if gpx != nil { + record.Set("gpx", gpx) + } if err := app.Save(record); err != nil { return err diff --git a/db/main.go b/db/main.go index d4ca55fb..e6379016 100644 --- a/db/main.go +++ b/db/main.go @@ -53,34 +53,34 @@ func registerMigrations(app *pocketbase.PocketBase) { } func setupEventHandlers(app *pocketbase.PocketBase, client meilisearch.ServiceManager) { - app.OnRecordAfterCreateSuccess("users").BindFunc(createUserHandler(app, client)) + app.OnRecordAfterCreateSuccess("users").BindFunc(createUserHandler(client)) - app.OnRecordAfterCreateSuccess("trails").BindFunc(createTrailHandler(app, client)) - app.OnRecordAfterUpdateSuccess("trails").BindFunc(updateTrailHandler(app, client)) + app.OnRecordAfterCreateSuccess("trails").BindFunc(createTrailHandler(client)) + app.OnRecordAfterUpdateSuccess("trails").BindFunc(updateTrailHandler(client)) app.OnRecordAfterDeleteSuccess("trails").BindFunc(deleteTrailHandler(client)) - app.OnRecordAfterCreateSuccess("trail_share").BindFunc(createTrailShareHandler(app, client)) + app.OnRecordAfterCreateSuccess("trail_share").BindFunc(createTrailShareHandler(client)) app.OnRecordAfterDeleteSuccess("trail_share").BindFunc(deleteTrailShareHandler(client)) - app.OnRecordAfterCreateSuccess("lists").BindFunc(createListHandler(app, client)) + app.OnRecordAfterCreateSuccess("lists").BindFunc(createListHandler(client)) app.OnRecordAfterUpdateSuccess("lists").BindFunc(updateListHandler(client)) app.OnRecordAfterDeleteSuccess("lists").BindFunc(deleteListHandler(client)) - app.OnRecordAfterCreateSuccess("list_share").BindFunc(createListShareHandler(app, client)) + app.OnRecordAfterCreateSuccess("list_share").BindFunc(createListShareHandler(client)) app.OnRecordAfterDeleteSuccess("list_share").BindFunc(deleteListShareHandler(client)) - app.OnRecordAfterCreateSuccess("follows").BindFunc(createFollowHandler(app)) - app.OnRecordAfterCreateSuccess("comments").BindFunc(createCommentHandler(app)) + app.OnRecordAfterCreateSuccess("follows").BindFunc(createFollowHandler()) + app.OnRecordAfterCreateSuccess("comments").BindFunc(createCommentHandler()) app.OnRecordsListRequest("integrations").BindFunc(listIntegrationHandler()) - app.OnRecordCreateRequest("integrations").BindFunc(createIntegrationHandler(app)) - app.OnRecordUpdateRequest("integrations").BindFunc(updateIntegrationHandler(app)) + app.OnRecordCreateRequest("integrations").BindFunc(createIntegrationHandler()) + app.OnRecordUpdateRequest("integrations").BindFunc(updateIntegrationHandler()) - app.OnRecordRequestEmailChangeRequest("users").BindFunc(changeUserEmailHandler(app)) - app.OnServe().BindFunc(onBeforeServeHandler(app, client)) + app.OnRecordRequestEmailChangeRequest("users").BindFunc(changeUserEmailHandler()) + app.OnServe().BindFunc(onBeforeServeHandler(client)) } -func createUserHandler(app *pocketbase.PocketBase, client meilisearch.ServiceManager) func(e *core.RecordEvent) error { +func createUserHandler(client meilisearch.ServiceManager) func(e *core.RecordEvent) error { return func(e *core.RecordEvent) error { userId := e.Record.Id @@ -98,15 +98,19 @@ func createUserHandler(app *pocketbase.PocketBase, client meilisearch.ServiceMan return err } e.Record.Set("token", token) - if err := app.Save(e.Record); err != nil { + if err := e.App.Save(e.Record); err != nil { return err } - return createDefaultUserSettings(app, e.Record.Id) + err = createDefaultUserSettings(e.App, e.Record.Id) + if err != nil { + return err + } + return e.Next() } } -func createDefaultUserSettings(app *pocketbase.PocketBase, userId string) error { +func createDefaultUserSettings(app core.App, userId string) error { collection, err := app.FindCollectionByNameOrId("settings") if err != nil { return err @@ -119,10 +123,10 @@ func createDefaultUserSettings(app *pocketbase.PocketBase, userId string) error return app.Save(settings) } -func createTrailHandler(app *pocketbase.PocketBase, client meilisearch.ServiceManager) func(e *core.RecordEvent) error { +func createTrailHandler(client meilisearch.ServiceManager) func(e *core.RecordEvent) error { return func(e *core.RecordEvent) error { record := e.Record - author, err := app.FindRecordById("users", record.GetString(("author"))) + author, err := e.App.FindRecordById("users", record.GetString(("author"))) if err != nil { return err } @@ -140,20 +144,27 @@ func createTrailHandler(app *pocketbase.PocketBase, client meilisearch.ServiceMa Seen: false, Author: record.GetString("author"), } - return util.SendNotificationToFollowers(app, notification) + err = util.SendNotificationToFollowers(e.App, notification) + if err != nil { + return err + } } - return nil + return e.Next() } } -func updateTrailHandler(app *pocketbase.PocketBase, client meilisearch.ServiceManager) func(e *core.RecordEvent) error { +func updateTrailHandler(client meilisearch.ServiceManager) func(e *core.RecordEvent) error { return func(e *core.RecordEvent) error { record := e.Record - author, err := app.FindRecordById("users", record.GetString(("author"))) + author, err := e.App.FindRecordById("users", record.GetString(("author"))) if err != nil { return err } - return util.UpdateTrail(record, author, client) + err = util.UpdateTrail(record, author, client) + if err != nil { + return err + } + return e.Next() } } @@ -161,16 +172,19 @@ func deleteTrailHandler(client meilisearch.ServiceManager) func(e *core.RecordEv return func(e *core.RecordEvent) error { record := e.Record _, err := client.Index("trails").DeleteDocument(record.Id) - return err + if err != nil { + return err + } + return e.Next() } } -func createTrailShareHandler(app *pocketbase.PocketBase, client meilisearch.ServiceManager) func(e *core.RecordEvent) error { +func createTrailShareHandler(client meilisearch.ServiceManager) func(e *core.RecordEvent) error { return func(e *core.RecordEvent) error { record := e.Record trailId := record.GetString("trail") - shares, err := app.FindAllRecords("trail_share", + shares, err := e.App.FindAllRecords("trail_share", dbx.NewExp("trail = {:trailId}", dbx.Params{"trailId": trailId}), ) if err != nil { @@ -186,7 +200,7 @@ func createTrailShareHandler(app *pocketbase.PocketBase, client meilisearch.Serv return err } - if errs := app.ExpandRecord(record, []string{"trail", "trail.author"}, nil); len(errs) > 0 { + if errs := e.App.ExpandRecord(record, []string{"trail", "trail.author"}, nil); len(errs) > 0 { return fmt.Errorf("failed to expand: %v", errs) } shareTrail := record.ExpandedOne("trail") @@ -202,7 +216,11 @@ func createTrailShareHandler(app *pocketbase.PocketBase, client meilisearch.Serv Seen: false, Author: shareTrailAuthor.Id, } - return util.SendNotification(app, notification, record.GetString("user")) + err = util.SendNotification(e.App, notification, record.GetString("user")) + if err != nil { + return err + } + return e.Next() } } @@ -211,11 +229,15 @@ func deleteTrailShareHandler(client meilisearch.ServiceManager) func(e *core.Rec record := e.Record trailId := record.GetString("trail") - return util.UpdateTrailShares(trailId, []string{}, client) + err := util.UpdateTrailShares(trailId, []string{}, client) + if err != nil { + return err + } + return e.Next() } } -func createListHandler(app *pocketbase.PocketBase, client meilisearch.ServiceManager) func(e *core.RecordEvent) error { +func createListHandler(client meilisearch.ServiceManager) func(e *core.RecordEvent) error { return func(e *core.RecordEvent) error { record := e.Record @@ -223,7 +245,7 @@ func createListHandler(app *pocketbase.PocketBase, client meilisearch.ServiceMan return err } if !record.GetBool("public") { - return nil + return e.Next() } notification := util.Notification{ Type: util.ListCreate, @@ -234,14 +256,23 @@ func createListHandler(app *pocketbase.PocketBase, client meilisearch.ServiceMan Seen: false, Author: record.GetString("author"), } - return util.SendNotificationToFollowers(app, notification) + err := util.SendNotificationToFollowers(e.App, notification) + if err != nil { + return err + } + return e.Next() } } func updateListHandler(client meilisearch.ServiceManager) func(e *core.RecordEvent) error { return func(e *core.RecordEvent) error { record := e.Record - return util.UpdateList(record, client) + err := util.UpdateList(record, client) + if err != nil { + return err + } + + return e.Next() } } @@ -249,15 +280,19 @@ func deleteListHandler(client meilisearch.ServiceManager) func(e *core.RecordEve return func(e *core.RecordEvent) error { record := e.Record _, err := client.Index("lists").DeleteDocument(record.Id) - return err + if err != nil { + return err + } + + return e.Next() } } -func createListShareHandler(app *pocketbase.PocketBase, client meilisearch.ServiceManager) func(e *core.RecordEvent) error { +func createListShareHandler(client meilisearch.ServiceManager) func(e *core.RecordEvent) error { return func(e *core.RecordEvent) error { record := e.Record listId := record.GetString("list") - shares, err := app.FindAllRecords("list_share", + shares, err := e.App.FindAllRecords("list_share", dbx.NewExp("list = {:listId}", dbx.Params{"listId": listId}), ) if err != nil { @@ -273,7 +308,7 @@ func createListShareHandler(app *pocketbase.PocketBase, client meilisearch.Servi return err } - if errs := app.ExpandRecord(record, []string{"list", "list.author"}, nil); len(errs) > 0 { + if errs := e.App.ExpandRecord(record, []string{"list", "list.author"}, nil); len(errs) > 0 { return fmt.Errorf("failed to expand: %v", errs) } shareList := record.ExpandedOne("list") @@ -289,7 +324,11 @@ func createListShareHandler(app *pocketbase.PocketBase, client meilisearch.Servi Seen: false, Author: shareListAuthor.Id, } - return util.SendNotification(app, notification, record.GetString("user")) + err = util.SendNotification(e.App, notification, record.GetString("user")) + if err != nil { + return err + } + return e.Next() } } @@ -297,14 +336,18 @@ func deleteListShareHandler(client meilisearch.ServiceManager) func(e *core.Reco return func(e *core.RecordEvent) error { record := e.Record listId := record.GetString("list") - return util.UpdateListShares(listId, []string{}, client) + err := util.UpdateListShares(listId, []string{}, client) + if err != nil { + return err + } + return e.Next() } } -func createFollowHandler(app *pocketbase.PocketBase) func(e *core.RecordEvent) error { +func createFollowHandler() func(e *core.RecordEvent) error { return func(e *core.RecordEvent) error { record := e.Record - if errs := app.ExpandRecord(record, []string{"follower"}, nil); len(errs) > 0 { + if errs := e.App.ExpandRecord(record, []string{"follower"}, nil); len(errs) > 0 { return fmt.Errorf("failed to expand: %v", errs) } follower := record.ExpandedOne("follower") @@ -317,15 +360,19 @@ func createFollowHandler(app *pocketbase.PocketBase) func(e *core.RecordEvent) e Seen: false, Author: record.GetString("follower"), } - return util.SendNotification(app, notification, record.GetString("followee")) + err := util.SendNotification(e.App, notification, record.GetString("followee")) + if err != nil { + return err + } + return e.Next() } } -func createCommentHandler(app *pocketbase.PocketBase) func(e *core.RecordEvent) error { +func createCommentHandler() func(e *core.RecordEvent) error { return func(e *core.RecordEvent) error { record := e.Record - if errs := app.ExpandRecord(record, []string{"trail", "author"}, nil); len(errs) > 0 { + if errs := e.App.ExpandRecord(record, []string{"trail", "author"}, nil); len(errs) > 0 { return fmt.Errorf("failed to expand: %v", errs) } commentAuthor := record.ExpandedOne("author") @@ -342,14 +389,18 @@ func createCommentHandler(app *pocketbase.PocketBase) func(e *core.RecordEvent) Seen: false, Author: record.GetString("author"), } - return util.SendNotification(app, notification, commentTrail.GetString("author")) + err := util.SendNotification(e.App, notification, commentTrail.GetString("author")) + if err != nil { + return err + } + return e.Next() } } func listIntegrationHandler() func(e *core.RecordsListRequestEvent) error { return func(e *core.RecordsListRequestEvent) error { if e.HasSuperuserAuth() { - return nil + return e.Next() } for _, r := range e.Records { @@ -359,13 +410,13 @@ func listIntegrationHandler() func(e *core.RecordsListRequestEvent) error { } } - return nil + return e.Next() } } -func createIntegrationHandler(app *pocketbase.PocketBase) func(e *core.RecordRequestEvent) error { +func createIntegrationHandler() func(e *core.RecordRequestEvent) error { return func(e *core.RecordRequestEvent) error { - err := encryptIntegrationSecrets(app, e.Record) + err := encryptIntegrationSecrets(e.App, e.Record) if err != nil { return err } @@ -378,13 +429,13 @@ func createIntegrationHandler(app *pocketbase.PocketBase) func(e *core.RecordReq if err != nil { return err } - return nil + return e.Next() } } -func updateIntegrationHandler(app *pocketbase.PocketBase) func(e *core.RecordRequestEvent) error { +func updateIntegrationHandler() func(e *core.RecordRequestEvent) error { return func(e *core.RecordRequestEvent) error { - err := encryptIntegrationSecrets(app, e.Record) + err := encryptIntegrationSecrets(e.App, e.Record) if err != nil { return err } @@ -397,7 +448,7 @@ func updateIntegrationHandler(app *pocketbase.PocketBase) func(e *core.RecordReq if err != nil { return err } - return nil + return e.Next() } } func censorIntegrationSecrets(r *core.Record) error { @@ -411,6 +462,9 @@ func censorIntegrationSecrets(r *core.Record) error { if err := json.Unmarshal([]byte(integrationString), &integration); err != nil { return err } + if integration == nil { + continue + } for _, secretKey := range secretKeys { integration[secretKey] = "" } @@ -425,7 +479,7 @@ func censorIntegrationSecrets(r *core.Record) error { return nil } -func encryptIntegrationSecrets(app *pocketbase.PocketBase, r *core.Record) error { +func encryptIntegrationSecrets(app core.App, r *core.Record) error { encryptionKey := os.Getenv("POCKETBASE_ENCRYPTION_KEY") if len(encryptionKey) == 0 { return apis.NewBadRequestError("POCKETBASE_ENCRYPTION_KEY not set", nil) @@ -459,6 +513,9 @@ func encryptIntegrationSecrets(app *pocketbase.PocketBase, r *core.Record) error if err := json.Unmarshal([]byte(originalString), &originalIntegration); err != nil { return err } + if integration == nil { + continue + } integration[secretKey] = originalIntegration[secretKey] } } @@ -474,30 +531,30 @@ func encryptIntegrationSecrets(app *pocketbase.PocketBase, r *core.Record) error return nil } -func changeUserEmailHandler(app *pocketbase.PocketBase) func(e *core.RecordRequestEmailChangeRequestEvent) error { +func changeUserEmailHandler() func(e *core.RecordRequestEmailChangeRequestEvent) error { return func(e *core.RecordRequestEmailChangeRequestEvent) error { - e.Record.Set("email", e.Record.Email()) - if err := app.Save(e.Record); err != nil { + e.Record.Set("email", e.NewEmail) + if err := e.App.Save(e.Record); err != nil { return err } return nil } } -func onBeforeServeHandler(app *pocketbase.PocketBase, client meilisearch.ServiceManager) func(e *core.ServeEvent) error { - return func(e *core.ServeEvent) error { - registerRoutes(e, app, client) - registerCronJobs(app) - bootstrapData(app, client) +func onBeforeServeHandler(client meilisearch.ServiceManager) func(se *core.ServeEvent) error { + return func(se *core.ServeEvent) error { + registerRoutes(se, client) + registerCronJobs(se.App) + bootstrapData(se.App, client) - return e.Next() + return se.Next() } } -func registerRoutes(e *core.ServeEvent, app *pocketbase.PocketBase, client meilisearch.ServiceManager) { - e.Router.GET("/public/search/token", func(e *core.RequestEvent) error { +func registerRoutes(se *core.ServeEvent, client meilisearch.ServiceManager) { + se.Router.GET("/public/search/token", func(e *core.RequestEvent) error { searchRules := map[string]interface{}{ "lists": map[string]string{ "filter": "public = true", @@ -512,15 +569,19 @@ func registerRoutes(e *core.ServeEvent, app *pocketbase.PocketBase, client meili } return e.JSON(http.StatusOK, map[string]string{"token": token}) }) - e.Router.GET("/trail/recommend", func(e *core.RequestEvent) error { + se.Router.GET("/trail/recommend", func(e *core.RequestEvent) error { qSize := e.Request.URL.Query().Get("size") size, err := strconv.Atoi(qSize) if err != nil { size = 4 } - userId := e.Auth.Id - trails, err := app.FindRecordsByFilter( + userId := "" + if e.Auth != nil { + userId = e.Auth.Id + } + + trails, err := e.App.FindRecordsByFilter( "trails", "author = {:userId} || public = true || ({:userId} != '' && trail_share_via_trail.user ?= {:userId})", "", @@ -542,7 +603,7 @@ func registerRoutes(e *core.ServeEvent, app *pocketbase.PocketBase, client meili }) - e.Router.POST("/integration/strava/token", func(e *core.RequestEvent) error { + se.Router.POST("/integration/strava/token", func(e *core.RequestEvent) error { encryptionKey := os.Getenv("POCKETBASE_ENCRYPTION_KEY") if len(encryptionKey) == 0 { return apis.NewBadRequestError("POCKETBASE_ENCRYPTION_KEY not set", nil) @@ -553,9 +614,12 @@ func registerRoutes(e *core.ServeEvent, app *pocketbase.PocketBase, client meili return apis.NewBadRequestError("Failed to read request data", err) } - userId := e.Auth.Id + userId := "" + if e.Auth != nil { + userId = e.Auth.Id + } - integrations, err := app.FindAllRecords("integrations", dbx.NewExp("user = {:id}", dbx.Params{"id": userId})) + integrations, err := e.App.FindAllRecords("integrations", dbx.NewExp("user = {:id}", dbx.Params{"id": userId})) if err != nil { return err } @@ -604,22 +668,25 @@ func registerRoutes(e *core.ServeEvent, app *pocketbase.PocketBase, client meili return err } integration.Set("strava", string(b)) - err = app.Save(integration) + err = e.App.Save(integration) if err != nil { return err } return e.JSON(http.StatusOK, nil) }) - e.Router.GET("/integration/komoot/login", func(e *core.RequestEvent) error { + se.Router.GET("/integration/komoot/login", func(e *core.RequestEvent) error { encryptionKey := os.Getenv("POCKETBASE_ENCRYPTION_KEY") if len(encryptionKey) == 0 { return apis.NewBadRequestError("POCKETBASE_ENCRYPTION_KEY not set", nil) } - userId := e.Auth.Id + userId := "" + if e.Auth != nil { + userId = e.Auth.Id + } - integrations, err := app.FindAllRecords("integrations", dbx.NewExp("user = {:id}", dbx.Params{"id": userId})) + integrations, err := e.App.FindAllRecords("integrations", dbx.NewExp("user = {:id}", dbx.Params{"id": userId})) if err != nil { return err } @@ -652,7 +719,7 @@ func registerRoutes(e *core.ServeEvent, app *pocketbase.PocketBase, client meili }) } -func registerCronJobs(app *pocketbase.PocketBase) { +func registerCronJobs(app core.App) { schedule := os.Getenv("POCKETBASE_CRON_SYNC_SCHEDULE") if len(schedule) == 0 { schedule = "0 2 * * *" @@ -674,13 +741,13 @@ func registerCronJobs(app *pocketbase.PocketBase) { }) } -func bootstrapData(app *pocketbase.PocketBase, client meilisearch.ServiceManager) error { +func bootstrapData(app core.App, client meilisearch.ServiceManager) error { bootstrapCategories(app) bootstrapMeilisearchTrails(app, client) return nil } -func bootstrapCategories(app *pocketbase.PocketBase) error { +func bootstrapCategories(app core.App) error { query := app.RecordQuery("categories") records := []*core.Record{} @@ -705,7 +772,7 @@ func bootstrapCategories(app *pocketbase.PocketBase) error { return nil } -func bootstrapMeilisearchTrails(app *pocketbase.PocketBase, client meilisearch.ServiceManager) error { +func bootstrapMeilisearchTrails(app core.App, client meilisearch.ServiceManager) error { query := app.RecordQuery("trails") trails := []*core.Record{} diff --git a/db/migrations/1742172170_updated__superusers.go b/db/migrations/1742172170_updated__superusers.go new file mode 100644 index 00000000..76ea1303 --- /dev/null +++ b/db/migrations/1742172170_updated__superusers.go @@ -0,0 +1,44 @@ +package migrations + +import ( + "encoding/json" + + "github.com/pocketbase/pocketbase/core" + m "github.com/pocketbase/pocketbase/migrations" +) + +func init() { + m.Register(func(app core.App) error { + collection, err := app.FindCollectionByNameOrId("pbc_3142635823") + if err != nil { + return err + } + + // update collection data + if err := json.Unmarshal([]byte(`{ + "resetPasswordTemplate": { + "body": "

Hello,

\n

Click on the button below to reset your password.

\n

\n Reset password\n

\n

If you didn't ask to reset your password, you can ignore this email.

\n

\n Thanks,
\n {APP_NAME} team\n

" + } + }`), &collection); err != nil { + return err + } + + return app.Save(collection) + }, func(app core.App) error { + collection, err := app.FindCollectionByNameOrId("pbc_3142635823") + if err != nil { + return err + } + + // update collection data + if err := json.Unmarshal([]byte(`{ + "resetPasswordTemplate": { + "body": "

Hello,

\n

Click on the button below to reset your password.

\n

\n Reset password\n

\n

If you didn't ask to reset your password, you can ignore this email.

\n

\n Thanks,
\n {APP_NAME} team\n

" + } + }`), &collection); err != nil { + return err + } + + return app.Save(collection) + }) +} diff --git a/db/util/notification.go b/db/util/notification.go index 5e81a287..f8ddf09f 100644 --- a/db/util/notification.go +++ b/db/util/notification.go @@ -5,7 +5,6 @@ import ( "net/mail" "github.com/pocketbase/dbx" - "github.com/pocketbase/pocketbase" "github.com/pocketbase/pocketbase/core" "github.com/pocketbase/pocketbase/tools/mailer" ) @@ -33,7 +32,7 @@ type NotificationSettings struct { Email bool `json:"email"` } -func getNotificationPermissions(app *pocketbase.PocketBase, user string, notificationType NotificationType) (*NotificationSettings, error) { +func getNotificationPermissions(app core.App, user string, notificationType NotificationType) (*NotificationSettings, error) { settings, err := app.FindFirstRecordByFilter("settings", "user={:user}", dbx.Params{"user": user}) if err != nil { return nil, err @@ -53,7 +52,7 @@ func getNotificationPermissions(app *pocketbase.PocketBase, user string, notific return &settingsForType, nil } -func SendNotification(app *pocketbase.PocketBase, notification Notification, recipient string) error { +func SendNotification(app core.App, notification Notification, recipient string) error { if notification.Author == recipient { return nil } @@ -109,7 +108,7 @@ func SendNotification(app *pocketbase.PocketBase, notification Notification, rec return nil } -func SendNotificationToFollowers(app *pocketbase.PocketBase, notification Notification) error { +func SendNotificationToFollowers(app core.App, notification Notification) error { followers, err := app.FindRecordsByFilter("follows", "followee={:user}", "", -1, 0, dbx.Params{"user": notification.Author}) if err != nil { diff --git a/web/src/hooks.client.ts b/web/src/hooks.client.ts index 78934316..622c6d5c 100644 --- a/web/src/hooks.client.ts +++ b/web/src/hooks.client.ts @@ -4,7 +4,7 @@ import { currentUser } from '$lib/stores/user_store'; pb.authStore.loadFromCookie(document.cookie) pb.authStore.onChange(() => { - currentUser.set(pb.authStore.model as User) + currentUser.set(pb.authStore.record as User) const secure = location.protocol === "https:" document.cookie = pb.authStore.exportToCookie({ httpOnly: false, secure: secure, sameSite: "Lax" }) }, true) \ No newline at end of file diff --git a/web/src/hooks.server.ts b/web/src/hooks.server.ts index d83ff76e..98534ddc 100644 --- a/web/src/hooks.server.ts +++ b/web/src/hooks.server.ts @@ -56,9 +56,9 @@ const auth: Handle = async ({ event, resolve }) => { // validate the user existence and if the path is acceesible - if (!pb.authStore.model && isRouteProtected(url.pathname)) { + if (!pb.authStore.record && isRouteProtected(url.pathname)) { throw redirect(302, '/login?r=' + url.pathname); - } else if (pb.authStore.model && url.pathname === "/login") { + } else if (pb.authStore.record && url.pathname === "/login") { throw redirect(302, '/'); } else if (envPub.PUBLIC_DISABLE_SIGNUP === "true" && url.pathname === "/register") { throw redirect(302, '/'); @@ -76,9 +76,9 @@ const auth: Handle = async ({ event, resolve }) => { let meiliApiKey: string = ""; let settings: Settings | undefined; - if (pb.authStore.model) { - meiliApiKey = pb.authStore.model.token - settings = await pb.collection('settings').getFirstListItem(`user="${pb.authStore.model.id}"`, { requestKey: null }) + if (pb.authStore.record) { + meiliApiKey = pb.authStore.record.token + settings = await pb.collection('settings').getFirstListItem(`user="${pb.authStore.record.id}"`, { requestKey: null }) } else { const r = await event.fetch(pb.buildURL("/public/search/token")); const response = await r.json(); @@ -88,15 +88,15 @@ const auth: Handle = async ({ event, resolve }) => { event.locals.ms = ms event.locals.pb = pb - event.locals.user = pb.authStore.model + event.locals.user = pb.authStore.record event.locals.settings = settings const lang = settings?.language ?? event.request.headers.get('accept-language')?.split(',')[0] if (lang) { locale.set(lang) - if (pb.authStore.model) { - pb.authStore.model!.language = lang; + if (pb.authStore.record) { + pb.authStore.record!.language = lang; } } diff --git a/web/src/lib/components/nav_bar.svelte b/web/src/lib/components/nav_bar.svelte index 0e19d5d6..1c89caad 100644 --- a/web/src/lib/components/nav_bar.svelte +++ b/web/src/lib/components/nav_bar.svelte @@ -108,7 +108,7 @@ } } - let user = $derived(browser ? $currentUser : pb.authStore.model); + let user = $derived(browser ? $currentUser : pb.authStore.record); diff --git a/web/src/lib/components/share_info.svelte b/web/src/lib/components/share_info.svelte index 2fdb905a..806baf37 100644 --- a/web/src/lib/components/share_info.svelte +++ b/web/src/lib/components/share_info.svelte @@ -21,7 +21,7 @@ let showInfo: boolean = $state(false); let loading: boolean = $state(false); let infoLoaded: boolean = $state(false); - let subjectIsOwned: boolean = subject.author == pb.authStore.model?.id; + let subjectIsOwned: boolean = subject.author == pb.authStore.record?.id; let author: UserAnonymous | undefined = $state(); async function fetchInfo() { diff --git a/web/src/lib/components/trail/trail_card.svelte b/web/src/lib/components/trail/trail_card.svelte index 7d2e551b..fac61551 100644 --- a/web/src/lib/components/trail/trail_card.svelte +++ b/web/src/lib/components/trail/trail_card.svelte @@ -74,13 +74,13 @@ /> {/if} - {#if (trail.public || trailIsShared) && pb.authStore.model} + {#if (trail.public || trailIsShared) && pb.authStore.record}
- {#if trail.public && pb.authStore.model} + {#if trail.public && pb.authStore.record}
- {#if pb.authStore.model} + {#if pb.authStore.record} setAuthorFilter(item)} onclear={() => { diff --git a/web/src/lib/components/trail/trail_info_panel.svelte b/web/src/lib/components/trail/trail_info_panel.svelte index 2cdb141e..8f843f64 100644 --- a/web/src/lib/components/trail/trail_info_panel.svelte +++ b/web/src/lib/components/trail/trail_info_panel.svelte @@ -62,7 +62,7 @@ const tabs = [ $_("summit-book"), $_("photos"), - ...(pb.authStore.model ? [$_("comment", { values: { n: 2 } })] : []), + ...(pb.authStore.record ? [$_("comment", { values: { n: 2 } })] : []), ]; const trailIsShared = @@ -192,14 +192,14 @@
- {#if (trail.public || trailIsShared) && pb.authStore.model} + {#if (trail.public || trailIsShared) && pb.authStore.record}
- {#if trail.public && pb.authStore.model} + {#if trail.public && pb.authStore.record} {trail.name} - {#if trail.public && pb.authStore.model} + {#if trail.public && pb.authStore.record} diff --git a/web/src/lib/i18n/index.ts b/web/src/lib/i18n/index.ts index 53250f56..a12e6be8 100644 --- a/web/src/lib/i18n/index.ts +++ b/web/src/lib/i18n/index.ts @@ -18,5 +18,5 @@ register('zh', () => import('./locales/zh.json')) init({ fallbackLocale: defaultLocale, - initialLocale: browser ? pb.authStore.model?.language ?? window.navigator.language : defaultLocale, + initialLocale: browser ? pb.authStore.record?.language ?? window.navigator.language : defaultLocale, }) \ No newline at end of file diff --git a/web/src/lib/stores/comment_store.ts b/web/src/lib/stores/comment_store.ts index 0dd9369e..e0d01542 100644 --- a/web/src/lib/stores/comment_store.ts +++ b/web/src/lib/stores/comment_store.ts @@ -28,11 +28,11 @@ export async function comments_index(trail: Trail) { } export async function comments_create(comment: Comment) { - if (!pb.authStore.model) { + if (!pb.authStore.record) { throw new Error("Unauthenticated"); } - comment.author = pb.authStore.model!.id; + comment.author = pb.authStore.record!.id; let r = await fetch('/api/v1/comment', { method: 'PUT', diff --git a/web/src/lib/stores/integration_store.ts b/web/src/lib/stores/integration_store.ts index 794e5e1e..bbeb1105 100644 --- a/web/src/lib/stores/integration_store.ts +++ b/web/src/lib/stores/integration_store.ts @@ -25,11 +25,11 @@ export async function integrations_index(f: (url: RequestInfo | URL, config?: Re } export async function integrations_create(integration: Integration) { - if (!pb.authStore.model) { + if (!pb.authStore.record) { throw new Error("Unauthenticated"); } - integration.user = pb.authStore.model!.id; + integration.user = pb.authStore.record!.id; let r = await fetch('/api/v1/integration', { method: 'PUT', diff --git a/web/src/lib/stores/list_store.ts b/web/src/lib/stores/list_store.ts index 1216df72..7d7f0536 100644 --- a/web/src/lib/stores/list_store.ts +++ b/web/src/lib/stores/list_store.ts @@ -121,11 +121,11 @@ export async function lists_show(id: string, f: (url: RequestInfo | URL, config? } export async function lists_create(list: List, avatar?: File) { - if (!pb.authStore.model) { + if (!pb.authStore.record) { throw new Error("Unauthenticated"); } - list.author = pb.authStore.model!.id; + list.author = pb.authStore.record!.id; let r = await fetch('/api/v1/list', { method: 'PUT', @@ -241,13 +241,13 @@ function buildFilterText(filter: ListFilter): string { if (filter.author?.length) { filterText += `&&author="${filter.author}"` } - if (pb.authStore.model) { + if (pb.authStore.record) { if (filter.public === false && filter.shared === false) { - filterText += `&&author="${pb.authStore.model.id}"` + filterText += `&&author="${pb.authStore.record.id}"` } else if (filter.public === true && filter.shared === false) { - filterText += `&&(public=true||list_share_via_list.user!="${pb.authStore.model.id}"||author="${pb.authStore.model.id}")` + filterText += `&&(public=true||list_share_via_list.user!="${pb.authStore.record.id}"||author="${pb.authStore.record.id}")` } else if (filter.public === false && filter.shared === true) { - filterText += `&&(public=false||list_share_via_list.user="${pb.authStore.model.id}"||author="${pb.authStore.model.id}")` + filterText += `&&(public=false||list_share_via_list.user="${pb.authStore.record.id}"||author="${pb.authStore.record.id}")` } } return filterText @@ -268,17 +268,17 @@ function buildSearchFilterText(filter: ListFilter): string { if (filter.public !== undefined) { filterText += `(public = ${filter.public}` - if (!filter.author?.length || filter.author == pb.authStore.model?.id) { - filterText += ` OR author = ${pb.authStore.model?.id}` + if (!filter.author?.length || filter.author == pb.authStore.record?.id) { + filterText += ` OR author = ${pb.authStore.record?.id}` } filterText += ")" } if (filter.shared !== undefined) { if (filter.shared === true) { - filterText += ` OR shares = ${pb.authStore.model?.id}` + filterText += ` OR shares = ${pb.authStore.record?.id}` } else { - filterText += ` AND NOT shares = ${pb.authStore.model?.id}` + filterText += ` AND NOT shares = ${pb.authStore.record?.id}` } } diff --git a/web/src/lib/stores/summit_log_store.ts b/web/src/lib/stores/summit_log_store.ts index e868e986..3a131f9f 100644 --- a/web/src/lib/stores/summit_log_store.ts +++ b/web/src/lib/stores/summit_log_store.ts @@ -46,7 +46,7 @@ export async function summit_logs_index(author: string, filter?: SummitLogFilter } export async function summit_logs_create(summitLog: SummitLog, f: (url: RequestInfo | URL, config?: RequestInit) => Promise = fetch) { - summitLog.author = pb.authStore.model!.id + summitLog.author = pb.authStore.record!.id let r = await f('/api/v1/summit-log', { method: 'PUT', @@ -101,7 +101,7 @@ export async function summit_logs_create(summitLog: SummitLog, f: (url: RequestI } export async function summit_logs_update(oldSummitLog: SummitLog, newSummitLog: SummitLog) { - newSummitLog.author = pb.authStore.model!.id + newSummitLog.author = pb.authStore.record!.id let r = await fetch('/api/v1/summit-log/' + newSummitLog.id, { method: 'POST', diff --git a/web/src/lib/stores/trail_store.ts b/web/src/lib/stores/trail_store.ts index 3740f5bc..82815b43 100644 --- a/web/src/lib/stores/trail_store.ts +++ b/web/src/lib/stores/trail_store.ts @@ -182,7 +182,7 @@ export async function trails_create(trail: Trail, photos: File[], gpx: File | Bl trail.summit_logs.push(model.id!); } - trail.author = pb.authStore.model!.id + trail.author = pb.authStore.record!.id let r = await f(`/api/v1/trail?` + new URLSearchParams({ expand: "category,waypoints,summit_logs,trail_share_via_trail", @@ -501,17 +501,17 @@ function buildFilterText(filter: TrailFilter, includeGeo: boolean): string { if (filter.public !== undefined) { filterText += `(public = ${filter.public}` - if (!filter.author?.length || filter.author == pb.authStore.model?.id) { - filterText += ` OR author = ${pb.authStore.model?.id}` + if (!filter.author?.length || filter.author == pb.authStore.record?.id) { + filterText += ` OR author = ${pb.authStore.record?.id}` } filterText += ")" } if (filter.shared !== undefined) { if (filter.shared === true) { - filterText += ` OR shares = ${pb.authStore.model?.id}` + filterText += ` OR shares = ${pb.authStore.record?.id}` } else { - filterText += ` AND NOT shares = ${pb.authStore.model?.id}` + filterText += ` AND NOT shares = ${pb.authStore.record?.id}` } } diff --git a/web/src/lib/stores/user_store.ts b/web/src/lib/stores/user_store.ts index 728b2bc0..5290f22b 100644 --- a/web/src/lib/stores/user_store.ts +++ b/web/src/lib/stores/user_store.ts @@ -25,7 +25,7 @@ export async function users_create(user: User) { export async function users_search(q: string, includeSelf: boolean = true) { let r = await fetch('/api/v1/user/anonymous?' + new URLSearchParams({ - "filter": `username~"${q}"${includeSelf ? '' : `&&id!="${pb.authStore.model?.id}"`}`, + "filter": `username~"${q}"${includeSelf ? '' : `&&id!="${pb.authStore.record?.id}"`}`, }), { method: 'GET', }) @@ -62,7 +62,7 @@ export async function users_auth_methods(f: (url: RequestInfo | URL, config?: Re const response = await r.json(); throw new APIError(r.status, response.message, response.detail) } - return await r.json() + return await r.json() as AuthMethodsList } diff --git a/web/src/lib/stores/waypoint_store.ts b/web/src/lib/stores/waypoint_store.ts index dd46565f..2509e148 100644 --- a/web/src/lib/stores/waypoint_store.ts +++ b/web/src/lib/stores/waypoint_store.ts @@ -7,7 +7,7 @@ export const waypoint: Writable = writable(new Waypoint(0, 0)); export async function waypoints_create(waypoint: Waypoint, f: (url: RequestInfo | URL, config?: RequestInit) => Promise = fetch) { - waypoint.author = pb.authStore.model!.id + waypoint.author = pb.authStore.record!.id let r = await f('/api/v1/waypoint', { method: 'PUT', @@ -45,7 +45,7 @@ export async function waypoints_create(waypoint: Waypoint, f: (url: RequestInfo } export async function waypoints_update(oldWaypoint: Waypoint, newWaypoint: Waypoint) { - newWaypoint.author = pb.authStore.model!.id + newWaypoint.author = pb.authStore.record!.id let r = await fetch('/api/v1/waypoint/' + newWaypoint.id, { method: 'POST', diff --git a/web/src/routes/api/v1/auth/oauth/+server.ts b/web/src/routes/api/v1/auth/oauth/+server.ts index c5a51e4a..b5d20c62 100644 --- a/web/src/routes/api/v1/auth/oauth/+server.ts +++ b/web/src/routes/api/v1/auth/oauth/+server.ts @@ -12,10 +12,10 @@ export async function GET(event: RequestEvent) { try { const r = await pb.collection('users').listAuthMethods(); - for (const provider of r.authProviders) { + for (const provider of r.oauth2.providers) { const imageURL = `${env.PUBLIC_POCKETBASE_URL}/_/images/oauth2/${provider.name}.svg` provider['img' as keyof typeof provider] = await imageUrlToBase64(imageURL, event.fetch); - provider['url' as keyof typeof provider] = `${provider.authUrl}${redirectURL}` + provider['url' as keyof typeof provider] = `${provider.authURL}${redirectURL}` } return json(r) } catch (e: any) { diff --git a/web/src/routes/api/v1/files/[collection]/[record]/[file]/+server.ts b/web/src/routes/api/v1/files/[collection]/[record]/[file]/+server.ts index a343e1a0..af146c28 100644 --- a/web/src/routes/api/v1/files/[collection]/[record]/[file]/+server.ts +++ b/web/src/routes/api/v1/files/[collection]/[record]/[file]/+server.ts @@ -21,7 +21,7 @@ export async function GET(event: RequestEvent) { parts.push(encodeURIComponent(safeParams.data.record)); parts.push(encodeURIComponent(safeParams.data.file)); - let fileURL = pb.buildUrl(parts.join("/")); + let fileURL = pb.buildURL(parts.join("/")); try { const r = await event.fetch(fileURL) diff --git a/web/src/routes/api/v1/list/+server.ts b/web/src/routes/api/v1/list/+server.ts index 7b53ef04..37adc929 100644 --- a/web/src/routes/api/v1/list/+server.ts +++ b/web/src/routes/api/v1/list/+server.ts @@ -8,7 +8,7 @@ export async function GET(event: RequestEvent) { try { const r = await list(event, Collection.lists); for (const t of r.items) { - if (!t.author || !pb.authStore.model) { + if (!t.author || !pb.authStore.record) { continue; } if (!t.expand) { diff --git a/web/src/routes/api/v1/summit-log/+server.ts b/web/src/routes/api/v1/summit-log/+server.ts index 55507ccc..1ee522bd 100644 --- a/web/src/routes/api/v1/summit-log/+server.ts +++ b/web/src/routes/api/v1/summit-log/+server.ts @@ -9,7 +9,7 @@ export async function GET(event: RequestEvent) { const r = await list(event, Collection.summit_logs); for (const t of r.items) { - if (!t.author || !pb.authStore.model) { + if (!t.author || !pb.authStore.record) { continue; } if (!t.expand) { diff --git a/web/src/routes/api/v1/trail/+server.ts b/web/src/routes/api/v1/trail/+server.ts index b5a445f3..d78164a3 100644 --- a/web/src/routes/api/v1/trail/+server.ts +++ b/web/src/routes/api/v1/trail/+server.ts @@ -9,7 +9,7 @@ export async function GET(event: RequestEvent) { const r = await list(event, Collection.trails); for (const t of r.items) { - if (!t.author || !pb.authStore.model) { + if (!t.author || !pb.authStore.record) { continue; } if (!t.expand) { diff --git a/web/src/routes/api/v1/trail/[id]/+server.ts b/web/src/routes/api/v1/trail/[id]/+server.ts index 5af4dedf..b3beed77 100644 --- a/web/src/routes/api/v1/trail/[id]/+server.ts +++ b/web/src/routes/api/v1/trail/[id]/+server.ts @@ -8,7 +8,7 @@ export async function GET(event: RequestEvent) { try { const r = await show(event, Collection.trails) - if (pb.authStore.model) { + if (pb.authStore.record) { if (!r.expand) { r.expand = {} as any } diff --git a/web/src/routes/api/v1/trail/bounding-box/+server.ts b/web/src/routes/api/v1/trail/bounding-box/+server.ts index ffdaac82..0cdb648d 100644 --- a/web/src/routes/api/v1/trail/bounding-box/+server.ts +++ b/web/src/routes/api/v1/trail/bounding-box/+server.ts @@ -4,7 +4,7 @@ import { handleError } from '$lib/util/api_util'; import { error, json, type RequestEvent } from '@sveltejs/kit'; export async function GET(event: RequestEvent) { - if (!pb.authStore.model) { + if (!pb.authStore.record) { return json({ max_lat: 0, min_lat: 0, @@ -13,7 +13,7 @@ export async function GET(event: RequestEvent) { }); } try { - const r = await pb.collection('trails_bounding_box').getOne(pb.authStore.model!.id) + const r = await pb.collection('trails_bounding_box').getOne(pb.authStore.record!.id) return json(r) } catch (e: any) { throw handleError(e); diff --git a/web/src/routes/api/v1/trail/filter/+server.ts b/web/src/routes/api/v1/trail/filter/+server.ts index b8691a58..7f947013 100644 --- a/web/src/routes/api/v1/trail/filter/+server.ts +++ b/web/src/routes/api/v1/trail/filter/+server.ts @@ -4,7 +4,7 @@ import { handleError } from '$lib/util/api_util'; import { error, json, type RequestEvent } from '@sveltejs/kit'; export async function GET(event: RequestEvent) { - if (!pb.authStore.model) { + if (!pb.authStore.record) { return json({ min_distance: 0, max_distance: 20000, @@ -15,7 +15,7 @@ export async function GET(event: RequestEvent) { }); } try { - const r = await pb.collection('trails_filter').getOne(pb.authStore.model!.id) + const r = await pb.collection('trails_filter').getOne(pb.authStore.record!.id) return json(r) } catch (e: any) { throw handleError(e); diff --git a/web/src/routes/api/v1/trail/recommend/+server.ts b/web/src/routes/api/v1/trail/recommend/+server.ts index e707ca3d..c5559a0f 100644 --- a/web/src/routes/api/v1/trail/recommend/+server.ts +++ b/web/src/routes/api/v1/trail/recommend/+server.ts @@ -10,7 +10,7 @@ export async function GET(event: RequestEvent) { const searchParams = Object.fromEntries(event.url.searchParams); const safeSearchParams = TrailRecommendSchema.parse(searchParams); - const r = await event.fetch(pb.buildUrl("/trail/recommend?" + new URLSearchParams({ + const r = await event.fetch(pb.buildURL("/trail/recommend?" + new URLSearchParams({ size: safeSearchParams.size?.toString() ?? "" }))); @@ -23,7 +23,7 @@ export async function GET(event: RequestEvent) { const result: Trail[] = await r.json(); for (const t of result) { - if (!t.author || !pb.authStore.model) { + if (!t.author || !pb.authStore.record) { continue; } if (!t.expand) { diff --git a/web/src/routes/api/v1/user/[id]/+server.ts b/web/src/routes/api/v1/user/[id]/+server.ts index 5e930bec..ac834537 100644 --- a/web/src/routes/api/v1/user/[id]/+server.ts +++ b/web/src/routes/api/v1/user/[id]/+server.ts @@ -23,9 +23,9 @@ export async function POST(event: RequestEvent) { const safeData = UserUpdateSchema.parse(data); - if (safeData.email && safeData.email != pb.authStore.model!.email) { + if (safeData.email && safeData.email != pb.authStore.record!.email) { const r = await pb.collection('users').requestEmailChange(safeData.email); - pb.authStore.model!.email = safeData.email; + pb.authStore.record!.email = safeData.email; } const r = await pb.collection('users').update(safeParams.id, safeData) if (safeData.password) { diff --git a/web/src/routes/login/+page.svelte b/web/src/routes/login/+page.svelte index 5280ec20..0f88d82b 100644 --- a/web/src/routes/login/+page.svelte +++ b/web/src/routes/login/+page.svelte @@ -15,21 +15,19 @@ import { type AuthProviderInfo } from "pocketbase"; import { _ } from "svelte-i18n"; import { z } from "zod"; + import type { PageProps } from "./$types"; let loading: boolean = $state(false); - const authProviders = page.data.authMethods.authProviders; + let { data: pageData }: PageProps = $props(); + + const authProviders = pageData.authMethods.oauth2.providers; let loginLabel = $state(""); - if ( - page.data.authMethods.usernamePassword && - page.data.authMethods.emailPassword - ) { + if (pageData.authMethods.password) { + loginLabel = `${$_("username")}/${$_("email")}`; + }else if (pageData.authMethods.password) { loginLabel = `${$_("username")}/${$_("email")}`; - } else if (page.data.authMethods.usernamePassword) { - loginLabel = `${$_("username")}`; - } else if (page.data.authMethods.emailPassword) { - loginLabel = `${$_("email")}`; } const { form, errors, data } = createForm({ @@ -100,7 +98,7 @@ {/if}

{$_("slogan")}

- {#if page.data.authMethods.usernamePassword || page.data.authMethods.emailPassword} + {#if page.data.authMethods.password}