37 Commits

Author SHA1 Message Date
a04e53b47f add routes in main 2025-02-05 09:25:21 +01:00
726584b0fb front driver availabilities 2024-12-18 15:05:58 +01:00
50e939c455 list all bookings 2024-12-16 10:12:40 +01:00
3ad5711ae7 set driver availabilities 2024-12-12 12:27:22 +01:00
7a648ccd1b create driver 2024-12-11 15:26:18 +01:00
a8ef3b758f add createDriver renderer et handler 2024-12-04 17:46:25 +01:00
f43d02c762 getAllDrivers 2024-11-29 11:43:47 +01:00
163ffefbfb add onglet beneficiaries_silvermobi 2024-11-28 11:57:36 +01:00
8f21248c29 Add Trajets Solidaire in Deplacement 2024-11-22 17:26:32 +01:00
e811ea7a07 Les SilvermobiBeneficiaries deviennent des ParcourmobBEneficiaries 2024-11-07 18:14:48 +01:00
4f1cc21aeb fix 2024-10-04 18:57:37 +02:00
efaa4f9f0d up list silvermobiBookings 2024-09-26 17:42:18 +02:00
0cfa78e938 list silvermobiBooking by silvermobiUsers 2024-09-26 13:34:08 +02:00
5a89c8b24a create booking done 2024-09-25 15:16:02 +02:00
de060b2ecf front module mobilité solidaire 2024-09-19 11:14:02 +02:00
13a34ad124 Create booking done 2024-09-18 15:56:13 +02:00
127a3c44bf createBooking 2024-09-17 14:42:27 +02:00
66c2c31090 list drivers first_name + last_name 2024-09-17 10:30:29 +02:00
c03fcb31d6 list beneficiaries
+ select beneficiary
2024-09-12 10:52:47 +02:00
5593f8d563 fix form and request 2024-08-28 14:10:03 +02:00
4232bca50d add routing-service to parcourmob 2024-08-08 13:22:09 +02:00
0e3da8c8f6 fix connection 2024-08-07 15:01:01 +02:00
fa6faa51c3 changement d'ortographe 2024-08-07 11:47:35 +02:00
f4ce62543f connection grpc generique done 2024-08-02 15:02:35 +02:00
d8771c67d8 grpc done 2024-07-31 18:33:25 +02:00
9f9ab9f1c0 fix dialogue parcourmob <=> silvermobi 2024-07-31 14:04:53 +02:00
cf792f2e7c fix grpc call 2024-07-31 13:33:38 +02:00
93a9d712c7 add input in front + add connection via grpc to solidarity-service(vue) 2024-06-07 11:51:01 +02:00
883453f4a4 changement de variables 2024-05-02 09:54:51 +02:00
982d07e8ad change function's name in solidarity_mobility folders 2024-04-25 15:16:06 +02:00
b0129aae79 add silvermobi/storage 'dependencie' to solidarity_mobility handler 2024-04-25 15:12:49 +02:00
ea400eefcd change varsilvermobi to solidarity_mobility 2024-04-25 14:45:03 +02:00
ebad682a65 route for silvermobi frontend and backend 2024-04-24 16:05:21 +02:00
41d5f02879 fix mistakes 2024-04-24 12:49:03 +02:00
cc27f9ef1d add path to silvemobi.html in parcourmob/config.yaml + add path and state in renderer/silvermobi.go 2024-04-24 12:18:05 +02:00
bfc39c22f7 add route 'app/silvermobi' + add CRUD functions in handler's folder 2024-04-24 10:22:23 +02:00
dc08de2419 add module silvermobi to lateral navbar 2024-04-19 15:54:38 +02:00
54 changed files with 1396 additions and 2138 deletions

View File

@@ -1,81 +0,0 @@
name: Build and Push Docker Image
on:
push:
tags:
- '*'
branches:
- main
- dev
jobs:
build_and_push:
runs-on: ubuntu-latest
steps:
- name: Install Docker
run: |
apt-get update
apt-get install -y docker.io
- name: Checkout Repository
uses: actions/checkout@v4
- name: Set Kubernetes Context
uses: azure/k8s-set-context@v4
with:
method: kubeconfig
kubeconfig: ${{secrets.buildx_kubeconfig}}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
with:
driver: kubernetes
driver-opts: |
namespace=gitea
- name: Login to Docker Registry
uses: docker/login-action@v3
with:
registry: git.coopgo.io
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_TOKEN }}
- name: Extract metadata (tags, labels) for Docker image
id: metadata
uses: docker/metadata-action@v3
with:
images: git.coopgo.io/${{gitea.repository}}
tags: |
type=ref,event=branch
type=ref,event=tag
type=ref,event=pr
flavor: |
latest=auto
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: |
${{ steps.metadata.outputs.tags }}
build-args: |
ACCESS_TOKEN_USR=${{gitea.actor}}
ACCESS_TOKEN_PWD=${{gitea.token}}
# BUILD WITH KANIKO
# - name: Kaniko build and push
# uses: aevea/action-kaniko@master
# with:
# build_file: Dockerfile
# registry: git.coopgo.io
# username: ${{secrets.registry_user}}
# password: ${{secrets.registry_token}}
# image: ${{gitea.repository}}
# tag: ${{gitea.ref_name}}
# cache: true
# cache_registry: git.coopgo.io/${{gitea.repository}}/cache
# extra-args: |
# ACCESS_TOKEN_USR=${{gitea.actor}}
# ACCESS_TOKEN_PWD=${{gitea.token}}

102
go.mod
View File

@@ -1,41 +1,50 @@
module git.coopgo.io/coopgo-apps/parcoursmob module git.coopgo.io/coopgo-apps/parcoursmob
go 1.22.8 go 1.22
// replace git.coopgo.io/coopgo-platform/mobility-accounts => ../../coopgo-platform/mobility-accounts/ toolchain go1.23.2
// replace git.coopgo.io/coopgo-platform/groups-management => ../../coopgo-platform/groups-management/ replace git.coopgo.io/coopgo-platform/mobility-accounts => ../../coopgo-platform/mobility-accounts/
// replace git.coopgo.io/coopgo-platform/fleets => ../../coopgo-platform/fleets/ replace git.coopgo.io/coopgo-platform/groups-management => ../../coopgo-platform/groups-management/
// replace git.coopgo.io/coopgo-platform/agenda => ../../coopgo-platform/agenda/ replace git.coopgo.io/coopgo-platform/fleets => ../../coopgo-platform/fleets/
replace git.coopgo.io/coopgo-platform/agenda => ../../coopgo-platform/agenda/
replace git.coopgo.io/sbouaram/solidarity-service => ../../coopgo-platform/solidarity-service/
replace git.coopgo.io/coopgo-apps/silvermobi => ../../coopgo-apps/silvermobi/
replace git.coopgo.io/coopgo-platform/routing-service => ../../coopgo-platform/routing-service/
// replace git.coopgo.io/coopgo-platform/emailing => ../../coopgo-platform/emailing/ // replace git.coopgo.io/coopgo-platform/emailing => ../../coopgo-platform/emailing/
require ( require (
github.com/coreos/go-oidc v2.2.1+incompatible
github.com/fogleman/gg v1.3.0 github.com/fogleman/gg v1.3.0
github.com/go-playground/validator/v10 v10.11.0 github.com/go-playground/validator/v10 v10.12.0
github.com/google/uuid v1.6.0 github.com/google/uuid v1.6.0
github.com/gorilla/mux v1.8.0 github.com/gorilla/mux v1.8.1
github.com/gorilla/sessions v1.2.1 github.com/gorilla/sessions v1.2.1
github.com/paulmach/go.geojson v1.4.0 github.com/paulmach/go.geojson v1.4.0
github.com/spf13/viper v1.19.0 github.com/spf13/viper v1.18.2
gitlab.scity.coop/maas/navitia-golang v0.0.0-20220429110621-5c22d6efdd0c gitlab.scity.coop/maas/navitia-golang v0.0.0-20220429110621-5c22d6efdd0c
go.etcd.io/etcd/client/v3 v3.5.12 go.etcd.io/etcd/client/v3 v3.5.10
golang.org/x/image v0.5.0 golang.org/x/image v0.5.0
golang.org/x/oauth2 v0.23.0 golang.org/x/oauth2 v0.23.0
google.golang.org/grpc v1.68.0 google.golang.org/grpc v1.68.1
google.golang.org/protobuf v1.35.2 google.golang.org/protobuf v1.34.2
) )
require ( require (
git.coopgo.io/coopgo-platform/agenda v1.0.0 git.coopgo.io/coopgo-platform/agenda v0.0.0-20230310121901-ef3add576f86
git.coopgo.io/coopgo-platform/emailing v0.0.0-20241119141913-9836b30191c1 git.coopgo.io/coopgo-platform/emailing v0.0.0-20221017030337-c71888d90c15
git.coopgo.io/coopgo-platform/fleets v0.0.0-20230310144446-feb935f8bf4e git.coopgo.io/coopgo-platform/fleets v0.0.0-20230310144446-feb935f8bf4e
git.coopgo.io/coopgo-platform/groups-management v0.0.0-20230310123255-5ef94ee0746c git.coopgo.io/coopgo-platform/groups-management v0.0.0-20230310123255-5ef94ee0746c
git.coopgo.io/coopgo-platform/mobility-accounts v0.0.0-20230329105908-a76c0412a386 git.coopgo.io/coopgo-platform/mobility-accounts v0.0.0-20230430115320-f5bb2e7c2c26
github.com/arran4/golang-ical v0.3.1 git.coopgo.io/coopgo-platform/routing-service v0.0.0-20230403183358-4d30329f06be
github.com/coreos/go-oidc/v3 v3.11.0 git.coopgo.io/sbouaram/solidarity-service v0.0.0-00010101000000-000000000000
github.com/gorilla/securecookie v1.1.1 github.com/gorilla/securecookie v1.1.1
github.com/minio/minio-go/v7 v7.0.43 github.com/minio/minio-go/v7 v7.0.43
github.com/rs/zerolog v1.33.0 github.com/rs/zerolog v1.33.0
@@ -43,36 +52,27 @@ require (
) )
require ( require (
github.com/sagikazarmark/locafero v0.4.0 // indirect ariga.io/atlas v0.13.1 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect
)
require (
ariga.io/atlas v0.12.0 // indirect
git.coopgo.io/coopgo-platform/diags v0.0.0-20250212093351-64da61495c9d
github.com/agext/levenshtein v1.2.1 // indirect github.com/agext/levenshtein v1.2.1 // indirect
github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect
github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-semver v0.3.0 // indirect
github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect
github.com/dustin/go-humanize v1.0.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/go-jose/go-jose/v4 v4.0.2 // indirect
github.com/go-openapi/inflect v0.19.0 // indirect github.com/go-openapi/inflect v0.19.0 // indirect
github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.0 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
github.com/golang/protobuf v1.5.4 // indirect github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.4 // indirect github.com/golang/snappy v0.0.4 // indirect
github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-cmp v0.6.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hashicorp/hcl/v2 v2.10.0 // indirect github.com/hashicorp/hcl/v2 v2.16.2 // indirect
github.com/json-iterator/go v1.1.12 // indirect github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.17.7 // indirect github.com/klauspost/compress v1.17.7 // indirect
github.com/klauspost/cpuid/v2 v2.1.0 // indirect github.com/klauspost/cpuid/v2 v2.2.4 // indirect
github.com/leodido/go-urn v1.2.1 // indirect github.com/leodido/go-urn v1.2.2 // indirect
github.com/lib/pq v1.10.9 // indirect github.com/lib/pq v1.10.9 // indirect
github.com/magiconair/properties v1.8.7 // indirect github.com/magiconair/properties v1.8.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-colorable v0.1.13 // indirect
@@ -85,42 +85,50 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/montanaflynn/stats v0.7.1 // indirect github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
github.com/paulmach/orb v0.11.1 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/pkg/errors v0.9.1 // indirect github.com/pkg/errors v0.9.1 // indirect
github.com/pquerna/cachecontrol v0.1.0 // indirect
github.com/richardlehane/mscfb v1.0.4 // indirect github.com/richardlehane/mscfb v1.0.4 // indirect
github.com/richardlehane/msoleps v1.0.3 // indirect github.com/richardlehane/msoleps v1.0.3 // indirect
github.com/rs/xid v1.5.0 // indirect github.com/rs/xid v1.5.0 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 // indirect github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 // indirect
github.com/sergi/go-diff v1.1.0 // indirect github.com/sirupsen/logrus v1.9.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.11.0 // indirect github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/cast v1.6.0 // indirect github.com/spf13/cast v1.6.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/pflag v1.0.5 // indirect
github.com/subosito/gotenv v1.6.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect
github.com/twpayne/go-geom v1.5.7 // indirect github.com/twpayne/go-geom v1.3.6 // indirect
github.com/wneessen/go-mail v0.5.2 // indirect github.com/twpayne/go-polyline v1.1.1 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/scram v1.1.2 // indirect
github.com/xdg-go/stringprep v1.0.4 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect
github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect
github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
github.com/zclconf/go-cty v1.8.0 // indirect github.com/zclconf/go-cty v1.12.1 // indirect
go.etcd.io/etcd/api/v3 v3.5.12 // indirect go.etcd.io/etcd/api/v3 v3.5.10 // indirect
go.etcd.io/etcd/client/pkg/v3 v3.5.12 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.10 // indirect
go.mongodb.org/mongo-driver v1.17.1 // indirect go.mongodb.org/mongo-driver v1.15.0 // indirect
go.uber.org/atomic v1.9.0 // indirect go.uber.org/atomic v1.11.0 // indirect
go.uber.org/multierr v1.9.0 // indirect go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.21.0 // indirect go.uber.org/zap v1.21.0 // indirect
golang.org/x/crypto v0.28.0 // indirect golang.org/x/crypto v0.27.0 // indirect
golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f // indirect
golang.org/x/net v0.29.0 // indirect golang.org/x/net v0.29.0 // indirect
golang.org/x/sync v0.8.0 // indirect golang.org/x/sync v0.8.0 // indirect
golang.org/x/sys v0.27.0 // indirect golang.org/x/sys v0.28.0 // indirect
golang.org/x/text v0.19.0 // indirect golang.org/x/text v0.18.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/mail.v2 v2.3.1 // indirect
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect
gopkg.in/square/go-jose.v2 v2.5.2-0.20210529014059-a5c7eec3c614 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
) )

266
go.sum Normal file → Executable file
View File

@@ -1,25 +1,11 @@
ariga.io/atlas v0.12.0 h1:jDfjxT3ppKhzqLS26lZv9ni7p9TVNrhy7SQquaF7bPs= ariga.io/atlas v0.13.1 h1:oSkEYgI3qUnQZ6b6+teAEiIuizjBvkZ4YDbz0XWfCdQ=
ariga.io/atlas v0.12.0/go.mod h1:+TR129FJZ5Lvzms6dvCeGWh1yR6hMvmXBhug4hrNIGk= ariga.io/atlas v0.13.1/go.mod h1:+TR129FJZ5Lvzms6dvCeGWh1yR6hMvmXBhug4hrNIGk=
git.coopgo.io/coopgo-platform/agenda v1.0.0 h1:rTHgva1JKKO0wAPlINegifMkHm+xOg3IWW4yQRy334w= git.coopgo.io/coopgo-platform/emailing v0.0.0-20221017030337-c71888d90c15 h1:+ZI4nGE6mqZ6pc7N/BizheEPRXn6Z84Sj7ikwfP2ZcU=
git.coopgo.io/coopgo-platform/agenda v1.0.0/go.mod h1:/hToSla0p6SeWn1zo1MDrfxdmo7RBdZDkbLqCVituIM= git.coopgo.io/coopgo-platform/emailing v0.0.0-20221017030337-c71888d90c15/go.mod h1:rmbqiHVkONcECOoPlsXlxZnD315Tiz2oRnn1M7646Kg=
git.coopgo.io/coopgo-platform/diags v0.0.0-20250210110754-726bb4643c63 h1:BvNTshj4TToGptaheeAzEmaNeuqPCR/NIH6TGePd54A=
git.coopgo.io/coopgo-platform/diags v0.0.0-20250210110754-726bb4643c63/go.mod h1:diyq11WNkgJ0kYHdT7SphXPMQUyoq4lRk7T6IgM5yPA=
git.coopgo.io/coopgo-platform/diags v0.0.0-20250211082457-291671c295e6 h1:McRGfPLueD+wcx8yf19a31uei4Ha0ugiDtnYtHYErrg=
git.coopgo.io/coopgo-platform/diags v0.0.0-20250211082457-291671c295e6/go.mod h1:diyq11WNkgJ0kYHdT7SphXPMQUyoq4lRk7T6IgM5yPA=
git.coopgo.io/coopgo-platform/diags v0.0.0-20250212093351-64da61495c9d h1:fBxVvik4Cb/6d4+HAXZi9e8x8P9UBCJt8JcWgqnNjsE=
git.coopgo.io/coopgo-platform/diags v0.0.0-20250212093351-64da61495c9d/go.mod h1:diyq11WNkgJ0kYHdT7SphXPMQUyoq4lRk7T6IgM5yPA=
git.coopgo.io/coopgo-platform/emailing v0.0.0-20241119141913-9836b30191c1 h1:gAhJ9wwlitMiETmnD4U2L6xLnVd5xE4hPX72IJ5s7+I=
git.coopgo.io/coopgo-platform/emailing v0.0.0-20241119141913-9836b30191c1/go.mod h1:EXy6NRvFfpW6yIHoZUixldkXrj1qzjCbTHpumDvzaKI=
git.coopgo.io/coopgo-platform/fleets v0.0.0-20230310144446-feb935f8bf4e h1:eHahRTKlC8aBWYCd6LbXNcX8HoQhuZj31OFWrw0EL0U=
git.coopgo.io/coopgo-platform/fleets v0.0.0-20230310144446-feb935f8bf4e/go.mod h1:s9OIFCNcjBAbBzRNHwoCTYV6kAntPG9CpT3GVweGdTY=
git.coopgo.io/coopgo-platform/groups-management v0.0.0-20230310123255-5ef94ee0746c h1:bY7PyrAgYY02f5IpDyf1WVfRqvWzivu31K6aEAYbWCw=
git.coopgo.io/coopgo-platform/groups-management v0.0.0-20230310123255-5ef94ee0746c/go.mod h1:lozSy6qlIIYhvKKXscZzz28HAtS0qBDUTv5nofLRmYA=
git.coopgo.io/coopgo-platform/mobility-accounts v0.0.0-20230329105908-a76c0412a386 h1:v1JUdx8sknw2YYhFGz5cOAa1dEWNIBKvyiOpKr3RR+s=
git.coopgo.io/coopgo-platform/mobility-accounts v0.0.0-20230329105908-a76c0412a386/go.mod h1:1typNYtO+PQT6KG77vs/PUv0fO60/nbeSGZL2tt1LLg=
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
github.com/DATA-DOG/go-sqlmock v1.3.2/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DATA-DOG/go-sqlmock v1.3.2/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
@@ -27,27 +13,20 @@ github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jB
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=
github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8= github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8=
github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
github.com/alecthomas/assert/v2 v2.10.0 h1:jjRCHsj6hBJhkmhznrCzoNpbA3zqy0fYiUcYZP/GkPY=
github.com/alecthomas/assert/v2 v2.10.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk=
github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw=
github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo=
github.com/arran4/golang-ical v0.3.1 h1:v13B3eQZ9VDHTAvT6M11vVzxYgcYmjyPBE2eAZl3VZk=
github.com/arran4/golang-ical v0.3.1/go.mod h1:LZWxF8ZIu/sjBVUCV0udiVPrQAgq3V0aa0RfbO99Qkk=
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs=
github.com/containerd/continuity v0.0.0-20181203112020-004b46473808/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20181203112020-004b46473808/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
github.com/coreos/go-oidc/v3 v3.11.0 h1:Ia3MxdwpSw702YW0xgfmP1GVCMA9aEFWu12XUZ3/OtI= github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
github.com/coreos/go-oidc/v3 v3.11.0/go.mod h1:gE3LgjOgFoHi9a4ce4/tJczr0Ai2/BoDhf0r5lltWI0= github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk=
github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo= github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -55,8 +34,10 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/dvyukov/go-fuzz v0.0.0-20200318091601-be3528f3a813/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8=
github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
@@ -64,18 +45,16 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/go-jose/go-jose/v4 v4.0.2 h1:R3l3kkBds16bO7ZFAEEcofK0MkrAJt3jlJznWZG0nvk=
github.com/go-jose/go-jose/v4 v4.0.2/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY=
github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4=
github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4=
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.11.0 h1:0W+xRM511GY47Yy3bZUbJVitCNg2BOGlCyvTqsp/xIw= github.com/go-playground/validator/v10 v10.12.0 h1:E4gtWgxWxp8YSxExrQFv5BpCahla0PVF2oTTEYaWQGI=
github.com/go-playground/validator/v10 v10.11.0/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-playground/validator/v10 v10.12.0/go.mod h1:hCAPuzYvKdP33pxWa+2+6AIKXEKqjIUyqsNCtbsSJrA=
github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
@@ -83,23 +62,24 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/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 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 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/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ=
github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI=
@@ -107,26 +87,24 @@ github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/z
github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hashicorp/hcl/v2 v2.10.0 h1:1S1UnuhDGlv3gRFV4+0EdwB+znNP5HmcGbIqwnSCByg= github.com/hashicorp/hcl/v2 v2.16.2 h1:mpkHZh/Tv+xet3sy3F9Ld4FyI2tUpWe9x3XtPx9f1a0=
github.com/hashicorp/hcl/v2 v2.10.0/go.mod h1:FwWsfWEjyV/CMj8s/gqAuiviY72rJ1/oayI9WftqcKg= github.com/hashicorp/hcl/v2 v2.16.2/go.mod h1:JRmR89jycNkrrqnMmvPDMd56n1rQJ2Q6KocSLCMCXng=
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
github.com/huandu/xstrings v1.3.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg=
github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.1.0 h1:eyi1Ad2aNJMW95zcSbmGg7Cg6cq3ADwLpMAP96d8rF0= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -135,9 +113,11 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3vkb4ax0b5D2DHbNAUsen0Gx5wZoq3lV4= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3vkb4ax0b5D2DHbNAUsen0Gx5wZoq3lV4=
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.2 h1:7z68G0FCGvDk646jz1AelTYNYWrTNm0bEcFAo147wt4=
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/leodido/go-urn v1.2.2/go.mod h1:kUaIbLZWttglzwNuG0pgsh5vuV6u2YcGBYz1hIPjtOQ=
github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
@@ -172,62 +152,69 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
github.com/ory/dockertest v3.3.4+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/ory/dockertest v3.3.4+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs=
github.com/ory/dockertest/v3 v3.6.0/go.mod h1:4ZOpj8qBUmh8fcBSVzkH2bws2s91JdGvHUqan4GHEuQ=
github.com/paulmach/go.geojson v1.4.0 h1:5x5moCkCtDo5x8af62P9IOAYGQcYHtxz2QJ3x1DoCgY= github.com/paulmach/go.geojson v1.4.0 h1:5x5moCkCtDo5x8af62P9IOAYGQcYHtxz2QJ3x1DoCgY=
github.com/paulmach/go.geojson v1.4.0/go.mod h1:YaKx1hKpWF+T2oj2lFJPsW/t1Q5e1jQI61eoQSTwpIs= github.com/paulmach/go.geojson v1.4.0/go.mod h1:YaKx1hKpWF+T2oj2lFJPsW/t1Q5e1jQI61eoQSTwpIs=
github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU=
github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU=
github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY=
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc=
github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI=
github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM= github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM=
github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
github.com/rwtodd/Go.Sed v0.0.0-20210816025313-55464686f9ef/go.mod h1:8AEUvGVi2uQ5b24BIhcr0GCcpd/RNAFWaN2CJFrWIIQ=
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 h1:TToq11gyfNlrMFZiYujSekIsPd9AmsA2Bj/iv+s4JHE= github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 h1:TToq11gyfNlrMFZiYujSekIsPd9AmsA2Bj/iv+s4JHE=
github.com/santhosh-tekuri/jsonschema/v5 v5.0.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= github.com/santhosh-tekuri/jsonschema/v5 v5.0.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0=
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ=
github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
@@ -239,25 +226,28 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/twpayne/go-geom v1.2.1/go.mod h1:90yvs0wf/gyT5eQ9W4v5WOZ9w/Xnrj5RMlA9XNKqxyA= github.com/twpayne/go-geom v1.2.1/go.mod h1:90yvs0wf/gyT5eQ9W4v5WOZ9w/Xnrj5RMlA9XNKqxyA=
github.com/twpayne/go-geom v1.5.7 h1:7fdceDUr03/MP7rAKOaTV6x9njMiQdxB/D0PDzMTCDc= github.com/twpayne/go-geom v1.3.6 h1:O27mIXZnMYiZi0ZD8ewjs/IT/ZOFVbZHBzPjA9skdmg=
github.com/twpayne/go-geom v1.5.7/go.mod h1:y4fTAQtLedXW8eG2Yo4tYrIGN1yIwwKkmA+K3iSHKBA= github.com/twpayne/go-geom v1.3.6/go.mod h1:XTyWHR6+l9TUYONbbK4ImUTYbWDCu2ySSPrZmmiA0Pg=
github.com/twpayne/go-kml v1.5.0/go.mod h1:g/OG8Q8JUxqFw8LGXE44W7osn1uXDAYaVFr1Yld43yc= github.com/twpayne/go-kml v1.5.0/go.mod h1:g/OG8Q8JUxqFw8LGXE44W7osn1uXDAYaVFr1Yld43yc=
github.com/twpayne/go-kml v1.5.1/go.mod h1:kz8jAiIz6FIdU2Zjce9qGlVtgFYES9vt7BTPBHf5jl4=
github.com/twpayne/go-polyline v1.0.0/go.mod h1:ICh24bcLYBX8CknfvNPKqoTbe+eg+MX1NPyJmSBo7pU= github.com/twpayne/go-polyline v1.0.0/go.mod h1:ICh24bcLYBX8CknfvNPKqoTbe+eg+MX1NPyJmSBo7pU=
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= github.com/twpayne/go-polyline v1.1.1 h1:/tSF1BR7rN4HWj4XKqvRUNrCiYVMCvywxTFVofvDV0w=
github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= github.com/twpayne/go-polyline v1.1.1/go.mod h1:ybd9IWWivW/rlXPXuuckeKUyF3yrIim+iqA7kSl4NFY=
github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/twpayne/go-waypoint v0.0.0-20200706203930-b263a7f6e4e8/go.mod h1:qj5pHncxKhu9gxtZEYWypA/z097sxhFlbTyOyt9gcnU=
github.com/wneessen/go-mail v0.5.2 h1:MZKwgHJoRboLJ+EHMLuHpZc95wo+u1xViL/4XSswDT8=
github.com/wneessen/go-mail v0.5.2/go.mod h1:kRroJvEq2hOSEPFRiKjN7Csrz0G1w+RpiGR3b6yo+Ck=
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 h1:6932x8ltq1w4utjmfMPVj09jdMlkY0aiA6+Skbtl3/c= github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 h1:6932x8ltq1w4utjmfMPVj09jdMlkY0aiA6+Skbtl3/c=
@@ -266,51 +256,46 @@ github.com/xuri/excelize/v2 v2.7.1 h1:gm8q0UCAyaTt3MEF5wWMjVdmthm2EHAWesGSKS9tdV
github.com/xuri/excelize/v2 v2.7.1/go.mod h1:qc0+2j4TvAUrBw36ATtcTeC1VCM0fFdAXZOmcF4nTpY= github.com/xuri/excelize/v2 v2.7.1/go.mod h1:qc0+2j4TvAUrBw36ATtcTeC1VCM0fFdAXZOmcF4nTpY=
github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 h1:OAmKAfT06//esDdpi/DZ8Qsdt4+M5+ltca05dA5bG2M= github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 h1:OAmKAfT06//esDdpi/DZ8Qsdt4+M5+ltca05dA5bG2M=
github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= github.com/zclconf/go-cty v1.12.1 h1:PcupnljUm9EIvbgSHQnHhUr3fO6oFmkOrvs2BAFNXXY=
github.com/zclconf/go-cty v1.8.0 h1:s4AvqaeQzJIu3ndv4gVIhplVD0krU+bgrcLSVUnaWuA= github.com/zclconf/go-cty v1.12.1/go.mod h1:s9IfD1LK5ccNMSWCVFCE2rJfHiZgi7JijgeWIMfhLvA=
github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk=
github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8=
gitlab.scity.coop/maas/navitia-golang v0.0.0-20220429110621-5c22d6efdd0c h1:pCazzEsTvjDopl3bvo6H2f2xjo1cDjOZ9QpJRNFCc00= gitlab.scity.coop/maas/navitia-golang v0.0.0-20220429110621-5c22d6efdd0c h1:pCazzEsTvjDopl3bvo6H2f2xjo1cDjOZ9QpJRNFCc00=
gitlab.scity.coop/maas/navitia-golang v0.0.0-20220429110621-5c22d6efdd0c/go.mod h1:M1U2osA6dYQF8zuJOTb/0O1F/Xgcb+4AkRdw+Un6Rp4= gitlab.scity.coop/maas/navitia-golang v0.0.0-20220429110621-5c22d6efdd0c/go.mod h1:M1U2osA6dYQF8zuJOTb/0O1F/Xgcb+4AkRdw+Un6Rp4=
go.etcd.io/etcd/api/v3 v3.5.12 h1:W4sw5ZoU2Juc9gBWuLk5U6fHfNVyY1WC5g9uiXZio/c= go.etcd.io/etcd/api/v3 v3.5.10 h1:szRajuUUbLyppkhs9K6BRtjY37l66XQQmw7oZRANE4k=
go.etcd.io/etcd/api/v3 v3.5.12/go.mod h1:Ot+o0SWSyT6uHhA56al1oCED0JImsRiU9Dc26+C2a+4= go.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI=
go.etcd.io/etcd/client/pkg/v3 v3.5.12 h1:EYDL6pWwyOsylrQyLp2w+HkQ46ATiOvoEdMarindU2A= go.etcd.io/etcd/client/pkg/v3 v3.5.10 h1:kfYIdQftBnbAq8pUWFXfpuuxFSKzlmM5cSn76JByiT0=
go.etcd.io/etcd/client/pkg/v3 v3.5.12/go.mod h1:seTzl2d9APP8R5Y2hFL3NVlD6qC/dOT+3kvrqPyTas4= go.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U=
go.etcd.io/etcd/client/v3 v3.5.12 h1:v5lCPXn1pf1Uu3M4laUE2hp/geOTc5uPcYYsNe1lDxg= go.etcd.io/etcd/client/v3 v3.5.10 h1:W9TXNZ+oB3MCd/8UjxHTWK5J9Nquw9fQBLJd5ne5/Ao=
go.etcd.io/etcd/client/v3 v3.5.12/go.mod h1:tSbBCakoWmmddL+BKVAJHa9km+O/E+bumDe9mSbPiqw= go.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc=
go.mongodb.org/mongo-driver v1.17.1 h1:Wic5cJIwJgSpBhe3lx3+/RybR5PiYRMpVFgO7cOHyIM= go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g=
go.mongodb.org/mongo-driver v1.17.1/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4= go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc=
go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f h1:99ci1mjWVBWwJiEKYY6jWa4d2nTQVIEhZIptnrVb1XY=
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI=
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ=
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc=
golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI= golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI=
golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4= golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
@@ -319,16 +304,11 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
@@ -336,40 +316,32 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200121082415-34d275377bf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -378,80 +350,68 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc=
google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0=
google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw=
google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/mail.v2 v2.3.1 h1:WYFn/oANrAGP2C0dcV6/pbkPzv8yGzqTjPmTeO7qoXk=
gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw=
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw=
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
gopkg.in/square/go-jose.v2 v2.5.2-0.20210529014059-a5c7eec3c614 h1:lwJmuuJQGclcankpPJwh8rorzB0bNbVALv8phDGh8TQ=
gopkg.in/square/go-jose.v2 v2.5.2-0.20210529014059-a5c7eec3c614/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=

View File

@@ -2,11 +2,10 @@ package api
import ( import (
"encoding/json" "encoding/json"
"fmt"
"net/http" "net/http"
"strconv" "strconv"
"github.com/rs/zerolog/log"
"github.com/gorilla/mux" "github.com/gorilla/mux"
) )
@@ -19,7 +18,7 @@ func (h APIHandler) GetCache(w http.ResponseWriter, r *http.Request) {
go func() { go func() {
d, err := h.cache.Get(cacheid) d, err := h.cache.Get(cacheid)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
ch <- nil ch <- nil
return return

View File

@@ -1,120 +0,0 @@
package api
import (
"net/http"
"time"
"git.coopgo.io/coopgo-apps/parcoursmob/services"
ics "github.com/arran4/golang-ical"
"github.com/gorilla/mux"
"github.com/rs/zerolog/log"
)
func (h *APIHandler) icsCalendar(events []services.AgendaEvent) (*ics.Calendar, error) {
calendar := ics.NewCalendarFor(h.config.GetString("service_name"))
for _, e := range events {
vevent := ics.NewEvent(e.ID)
vevent.SetSummary(e.Name)
vevent.SetDescription(e.Description)
if e.Allday {
vevent.SetAllDayStartAt(e.Startdate)
if e.Enddate.After(e.Startdate) {
vevent.SetAllDayEndAt(e.Enddate.Add(24 * time.Hour))
}
} else {
timeloc, err := time.LoadLocation("Europe/Paris")
if err != nil {
log.Error().Err(err).Msg("Tried to load timezone location Europe/Paris. Error. Missing zones in container ?")
return nil, err
}
starttime, err := time.ParseInLocation("15:04", e.Starttime, timeloc)
if err != nil {
return nil, err
}
startdatetime := time.Date(e.Startdate.Year(), e.Startdate.Month(), e.Startdate.Day(), starttime.Hour(), starttime.Minute(), 0, 0, timeloc)
endtime, err := time.Parse("15:04", e.Endtime)
if err != nil {
return nil, err
}
enddatetime := time.Date(e.Enddate.Year(), e.Enddate.Month(), e.Enddate.Day(), endtime.Hour(), endtime.Minute(), 0, 0, timeloc)
vevent.SetStartAt(startdatetime)
vevent.SetEndAt(enddatetime)
}
calendar.AddVEvent(vevent)
}
return calendar, nil
}
func (h *APIHandler) CalendarGlobal(w http.ResponseWriter, r *http.Request) {
enabled := h.config.GetBool("modules.agenda.enabled") && h.config.GetBool("modules.agenda.calendars.global.enabled")
if !enabled {
log.Error().Msg("global calendar not activated in configuration")
w.WriteHeader(http.StatusForbidden)
return
}
events, err := h.services.GetAgendaEvents()
if err != nil {
log.Error().Err(err).Msg("error retrieving agenda events")
w.WriteHeader(http.StatusInternalServerError)
return
}
calendar, err := h.icsCalendar(events)
if err != nil {
log.Error().Err(err).Msg("error while creating ics calendar")
w.WriteHeader(http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "text/calendar")
w.Write([]byte(calendar.Serialize()))
}
func (h *APIHandler) CalendarOrganizations(w http.ResponseWriter, r *http.Request) {
enabled := h.config.GetBool("modules.agenda.enabled") && h.config.GetBool("modules.agenda.calendars.organizations.enabled")
if !enabled {
log.Error().Msg("organizations calendar not activated in configuration")
w.WriteHeader(http.StatusForbidden)
return
}
// TODO set additional calendar rights in group configuration to prevent default behavior ?
vars := mux.Vars(r)
groupid := vars["groupid"]
events, err := h.services.GetAgendaEvents()
if err != nil {
log.Error().Err(err).Msg("error retrieving agenda events")
w.WriteHeader(http.StatusInternalServerError)
return
}
filteredEvents := []services.AgendaEvent{}
for _, e := range events {
for _, g := range e.Owners {
if g == groupid {
filteredEvents = append(filteredEvents, e)
continue
}
}
}
calendar, err := h.icsCalendar(filteredEvents)
if err != nil {
log.Error().Err(err).Msg("error while creating ics calendar")
w.WriteHeader(http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "text/calendar")
w.Write([]byte(calendar.Serialize()))
}

View File

@@ -8,7 +8,6 @@ import (
"strconv" "strconv"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/rs/zerolog/log"
) )
type FlatMaps []map[string]any type FlatMaps []map[string]any
@@ -49,7 +48,7 @@ func (h APIHandler) CacheExport(w http.ResponseWriter, r *http.Request) {
d, err := h.cache.Get(cacheid) d, err := h.cache.Get(cacheid)
if err != nil { if err != nil {
log.Error().Err(err).Msg("Error getting cache") fmt.Println(err)
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
return return
} }
@@ -57,6 +56,7 @@ func (h APIHandler) CacheExport(w http.ResponseWriter, r *http.Request) {
if data, ok := d.([]any); ok { if data, ok := d.([]any); ok {
flatmaps := FlatMaps{} flatmaps := FlatMaps{}
//fmt.Println(data)
for _, v := range data { for _, v := range data {
fm := map[string]any{} fm := map[string]any{}
@@ -90,7 +90,7 @@ func flatten(prefix string, src map[string]any, dest map[string]any) {
dest[prefix+k+"."+strconv.Itoa(i)] = child[i] dest[prefix+k+"."+strconv.Itoa(i)] = child[i]
} }
default: default:
// log.Trace().Str("key", prefix+k).Any("value", v).Msg("") fmt.Println(prefix+k, " : ", v)
dest[prefix+k] = v dest[prefix+k] = v
} }
} }

View File

@@ -3,12 +3,13 @@ package api
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"io" "io/ioutil"
"log" "log"
"net/http" "net/http"
) )
func (h *APIHandler) GeoAutocomplete(w http.ResponseWriter, r *http.Request) { func (h *APIHandler) GeoAutocomplete(w http.ResponseWriter, r *http.Request) {
pelias := h.config.GetString("geo.pelias.url") pelias := h.config.GetString("geo.pelias.url")
t, ok := r.URL.Query()["text"] t, ok := r.URL.Query()["text"]
@@ -28,7 +29,8 @@ func (h *APIHandler) GeoAutocomplete(w http.ResponseWriter, r *http.Request) {
defer resp.Body.Close() defer resp.Body.Close()
body, err := io.ReadAll(resp.Body) body, err := ioutil.ReadAll(resp.Body)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }

View File

@@ -2,15 +2,15 @@ package api
import ( import (
"context" "context"
"fmt"
"net/http" "net/http"
"github.com/rs/zerolog/log"
) )
func (h APIHandler) OAuth2Callback(w http.ResponseWriter, r *http.Request) { func (h APIHandler) OAuth2Callback(w http.ResponseWriter, r *http.Request) {
oauth2Token, err := h.idp.OAuth2Config.Exchange(context.Background(), r.URL.Query().Get("code")) oauth2Token, err := h.idp.OAuth2Config.Exchange(context.Background(), r.URL.Query().Get("code"))
if err != nil { if err != nil {
log.Error().Err(err).Msg("Exchange error") fmt.Println("Exchange error")
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -18,14 +18,15 @@ func (h APIHandler) OAuth2Callback(w http.ResponseWriter, r *http.Request) {
// Extract the ID Token from OAuth2 token. // Extract the ID Token from OAuth2 token.
rawIDToken, ok := oauth2Token.Extra("id_token").(string) rawIDToken, ok := oauth2Token.Extra("id_token").(string)
if !ok { if !ok {
log.Error().Msg("Cannot retrieve ID token") fmt.Println("issue retrieving token")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
_, err = h.idp.TokenVerifier.Verify(context.Background(), rawIDToken) _, err = h.idp.TokenVerifier.Verify(context.Background(), rawIDToken)
if err != nil { if err != nil {
log.Error().Err(err).Msg("Not able to verify token") fmt.Println("not able to verify token")
fmt.Println(err)
w.WriteHeader(http.StatusUnauthorized) w.WriteHeader(http.StatusUnauthorized)
return return
} }
@@ -41,7 +42,7 @@ func (h APIHandler) OAuth2Callback(w http.ResponseWriter, r *http.Request) {
} }
if err = session.Save(r, w); err != nil { if err = session.Save(r, w); err != nil {
log.Error().Err(err).Msg("Cannot save session") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }

View File

@@ -24,7 +24,6 @@ import (
mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage" mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/rs/zerolog/log"
"google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/structpb"
) )
@@ -102,14 +101,7 @@ func (h *ApplicationHandler) Administration(w http.ResponseWriter, r *http.Reque
}() }()
wg.Wait() wg.Wait()
if accountsErr != nil || beneficiariesErr != nil || bookingsErr != nil || groupsResponseErr != nil || eventsResponseErr != nil { if accountsErr != nil || beneficiariesErr != nil || bookingsErr != nil || groupsResponseErr != nil || eventsResponseErr != nil {
log.Error(). fmt.Println(accountsErr, beneficiariesErr, bookingsErr, groupsResponseErr, eventsResponseErr, groupsBatchErr)
Any("accounts error", accountsErr).
Any("beneficiaries error", beneficiariesErr).
Any("bookings error", bookingsErr).
Any("groups response error", groupsResponseErr).
Any("events response error", eventsResponseErr).
Any("groups batch error", groupsBatchErr).
Msg("Error in retrieving administration data")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -122,7 +114,7 @@ func (h *ApplicationHandler) AdministrationCreateGroup(w http.ResponseWriter, r
if r.FormValue("name") == "" { if r.FormValue("name") == "" {
log.Error().Str("name", r.FormValue("name")).Msg("Invalid name") fmt.Println("invalid name")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@@ -149,7 +141,7 @@ func (h *ApplicationHandler) AdministrationCreateGroup(w http.ResponseWriter, r
data, err := structpb.NewValue(dataMap) data, err := structpb.NewValue(dataMap)
if err != nil { if err != nil {
log.Error().Err(err).Msg("Cannot create PB struct from data map") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -171,7 +163,7 @@ func (h *ApplicationHandler) AdministrationCreateGroup(w http.ResponseWriter, r
go func() { go func() {
_, err = h.services.GRPC.GroupsManagement.AddGroup(context.TODO(), request_organization) _, err = h.services.GRPC.GroupsManagement.AddGroup(context.TODO(), request_organization)
if err != nil { if err != nil {
log.Error().Err(err).Msg("Issue in Groups management service - AddGroup") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -180,7 +172,7 @@ func (h *ApplicationHandler) AdministrationCreateGroup(w http.ResponseWriter, r
go func() { go func() {
_, err = h.services.GRPC.GroupsManagement.AddGroup(context.TODO(), request_role) _, err = h.services.GRPC.GroupsManagement.AddGroup(context.TODO(), request_role)
if err != nil { if err != nil {
log.Error().Err(err).Msg("Issue in Groups management service - AddGroup") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -201,14 +193,14 @@ func (h *ApplicationHandler) AdministrationGroupDisplay(w http.ResponseWriter, r
resp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), request) resp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("Issue in Groups management service - GetGroup") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
groupmembers, admins, err := h.groupmembers(groupid) groupmembers, admins, err := h.groupmembers(groupid)
if err != nil { if err != nil {
log.Error().Err(err).Msg("inssue retrieving group members") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -224,141 +216,164 @@ func (h *ApplicationHandler) AdministrationGroupInviteAdmin(w http.ResponseWrite
accountresp *accounts.GetAccountUsernameResponse accountresp *accounts.GetAccountUsernameResponse
err error err error
) )
groupresp, err = h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), &groupsmanagement.GetGroupRequest{ go func() {
Id: groupid, groupresp, err = h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), &groupsmanagement.GetGroupRequest{
Namespace: "parcoursmob_organizations", Id: groupid,
}) Namespace: "parcoursmob_organizations",
if err != nil { })
log.Error().Err(err).Msg("Issue in Groups management service - GetGroup")
w.WriteHeader(http.StatusInternalServerError) if err != nil {
return fmt.Println(err)
} w.WriteHeader(http.StatusInternalServerError)
return
}
}()
r.ParseForm() r.ParseForm()
accountresp, err = h.services.GRPC.MobilityAccounts.GetAccountUsername(context.TODO(), &accounts.GetAccountUsernameRequest{ go func() {
Username: r.FormValue("username"), accountresp, err = h.services.GRPC.MobilityAccounts.GetAccountUsername(context.TODO(), &accounts.GetAccountUsernameRequest{
Namespace: "parcoursmob", Username: r.FormValue("username"),
}) Namespace: "parcoursmob",
if err == nil { })
log.Print("account exists") if err == nil {
// Account already exists : adding the existing account to admin list // Account already exists : adding the existing account to admin list
account := accountresp.Account.ToStorageType() account := accountresp.Account.ToStorageType()
// account.Data["groups"] = append(account.Data["groups"].([]any), groupid, groupid) account.Data["groups"] = append(account.Data["groups"].([]any), groupid, groupid)
account.Data["groups"] = append(account.Data["groups"].([]any), groupid, groupid+":admin") account.Data["groups"] = append(account.Data["groups"].([]any), groupid, groupid+":admin")
as, _ := accounts.AccountFromStorageType(&account) as, _ := accounts.AccountFromStorageType(&account)
if _, err = h.services.GRPC.MobilityAccounts.UpdateData(context.TODO(), &accounts.UpdateDataRequest{Account: as}); err != nil { _, err = h.services.GRPC.MobilityAccounts.UpdateData(
log.Error().Err(err).Msg("could not set groups to user account") context.TODO(),
w.WriteHeader(http.StatusInternalServerError) &accounts.UpdateDataRequest{
Account: as,
},
)
fmt.Println(err)
data := map[string]any{
"group": groupresp.Group.ToStorageType().Data["name"],
}
if err := h.emailing.Send("onboarding.existing_administrator", r.FormValue("username"), data); err != nil {
fmt.Println(err)
}
http.Redirect(w, r, fmt.Sprintf("/app/administration/groups/%s", groupid), http.StatusFound)
return return
} else {
// Onboard now administrator
onboarding := map[string]any{
"username": r.FormValue("username"),
"group": groupid,
"admin": true,
}
b := make([]byte, 16)
if _, err := io.ReadFull(rand.Reader, b); err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
key := base64.RawURLEncoding.EncodeToString(b)
h.cache.PutWithTTL("onboarding/"+key, onboarding, 168*time.Hour) // 1 week TTL
data := map[string]any{
"group": groupresp.Group.ToStorageType().Data["name"],
"key": key,
}
if err := h.emailing.Send("onboarding.new_administrator", r.FormValue("username"), data); err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
} }
data := map[string]any{ http.Redirect(w, r, fmt.Sprintf("/app/administration/groups/%s", groupid), http.StatusFound)
"group": groupresp.Group.ToStorageType().Data["name"], return
} }()
if err := h.emailing.Send("onboarding.existing_administrator", r.FormValue("username"), data); err != nil {
log.Error().Err(err).Msg("Cannot send email")
}
} else {
// Onboard now administrator
onboarding := map[string]any{
"username": r.FormValue("username"),
"group": groupid,
"admin": true,
}
b := make([]byte, 16)
if _, err := io.ReadFull(rand.Reader, b); err != nil {
log.Error().Err(err).Msg("Issue creating random bytes")
w.WriteHeader(http.StatusInternalServerError)
return
}
key := base64.RawURLEncoding.EncodeToString(b)
h.cache.PutWithTTL("onboarding/"+key, onboarding, 168*time.Hour) // 1 week TTL
data := map[string]any{
"group": groupresp.Group.ToStorageType().Data["name"],
"key": key,
}
if err := h.emailing.Send("onboarding.new_administrator", r.FormValue("username"), data); err != nil {
log.Error().Err(err).Msg("Cannot send email")
w.WriteHeader(http.StatusInternalServerError)
return
}
}
http.Redirect(w, r, fmt.Sprintf("/app/administration/groups/%s", groupid), http.StatusFound)
} }
func (h *ApplicationHandler) AdministrationGroupInviteMember(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) AdministrationGroupInviteMember(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r) vars := mux.Vars(r)
groupid := vars["groupid"] groupid := vars["groupid"]
group, err := h.services.GetGroup(groupid) var (
if err != nil { group storage.Group
log.Error().Err(err).Msg("Issue in Groups management service - GetGroup") )
w.WriteHeader(http.StatusInternalServerError) groupCh := make(chan storage.Group)
return go func() {
} groupresp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), &groupsmanagement.GetGroupRequest{
Id: groupid,
Namespace: "parcoursmob_organizations",
})
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
group := groupresp.Group.ToStorageType()
groupCh <- group
}()
r.ParseForm() r.ParseForm()
accountresp, err := h.services.GRPC.MobilityAccounts.GetAccountUsername(context.TODO(), &accounts.GetAccountUsernameRequest{ go func() {
Username: r.FormValue("username"), group = <-groupCh
Namespace: "parcoursmob", accountresp, err := h.services.GRPC.MobilityAccounts.GetAccountUsername(context.TODO(), &accounts.GetAccountUsernameRequest{
}) Username: r.FormValue("username"),
if err == nil { Namespace: "parcoursmob",
account := accountresp.Account.ToStorageType() })
account.Data["groups"] = append(account.Data["groups"].([]any), group.ID) if err == nil {
account := accountresp.Account.ToStorageType()
account.Data["groups"] = append(account.Data["groups"].([]any), group.ID)
as, _ := accounts.AccountFromStorageType(&account) as, _ := accounts.AccountFromStorageType(&account)
_, err = h.services.GRPC.MobilityAccounts.UpdateData( _, err = h.services.GRPC.MobilityAccounts.UpdateData(
context.TODO(), context.TODO(),
&accounts.UpdateDataRequest{ &accounts.UpdateDataRequest{
Account: as, Account: as,
}, },
) )
data := map[string]any{ data := map[string]any{
"group": group.Data["name"], "group": group.Data["name"],
} }
if err := h.emailing.Send("onboarding.existing_member", r.FormValue("username"), data); err != nil { if err := h.emailing.Send("onboarding.existing_member", r.FormValue("username"), data); err != nil {
log.Error().Err(err).Msg("error sending email onboarding.existing_member") }
}
// http.Redirect(w, r, "/app/group/settings", http.StatusFound) http.Redirect(w, r, "/app/group/settings", http.StatusFound)
// return
} else {
// Onboard new administrator
onboarding := map[string]any{
"username": r.FormValue("username"),
"group": group.ID,
"admin": false,
}
b := make([]byte, 16)
if _, err := io.ReadFull(rand.Reader, b); err != nil {
w.WriteHeader(http.StatusInternalServerError)
return return
} } else {
key := base64.RawURLEncoding.EncodeToString(b) // Onboard now administrator
onboarding := map[string]any{
"username": r.FormValue("username"),
"group": group.ID,
"admin": false,
}
h.cache.PutWithTTL("onboarding/"+key, onboarding, 168*time.Hour) // 1 week TTL b := make([]byte, 16)
data := map[string]any{ if _, err := io.ReadFull(rand.Reader, b); err != nil {
"group": group.Data["name"], w.WriteHeader(http.StatusInternalServerError)
"key": key, return
} }
key := base64.RawURLEncoding.EncodeToString(b)
if err := h.emailing.Send("onboarding.new_member", r.FormValue("username"), data); err != nil { h.cache.PutWithTTL("onboarding/"+key, onboarding, 168*time.Hour) // 1 week TTL
log.Error().Err(err).Msg("error sending email onboarding.new_member") data := map[string]any{
w.WriteHeader(http.StatusInternalServerError) "group": group.Data["name"],
return "key": key,
}
if err := h.emailing.Send("onboarding.new_member", r.FormValue("username"), data); err != nil {
w.WriteHeader(http.StatusInternalServerError)
return
}
} }
} }()
http.Redirect(w, r, "/app/administration/groups/"+group.ID, http.StatusFound) http.Redirect(w, r, "/app/administration/groups/"+group.ID, http.StatusFound)
return
} }
func filteVehicle(r *http.Request, v *fleets.Vehicle) bool { func filteVehicle(r *http.Request, v *fleets.Vehicle) bool {
@@ -379,6 +394,7 @@ func filteVehicle(r *http.Request, v *fleets.Vehicle) bool {
} }
func (h ApplicationHandler) AdminStatVehicles(w http.ResponseWriter, r *http.Request) { func (h ApplicationHandler) AdminStatVehicles(w http.ResponseWriter, r *http.Request) {
bookings := []fleetsstorage.Booking{} bookings := []fleetsstorage.Booking{}
administrators := []string{} administrators := []string{}
reequest := &fleets.GetVehiclesRequest{ reequest := &fleets.GetVehiclesRequest{
@@ -386,7 +402,7 @@ func (h ApplicationHandler) AdminStatVehicles(w http.ResponseWriter, r *http.Req
} }
reesp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), reequest) reesp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), reequest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("Issue in Fleets service - GetVehicles") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
} }
@@ -424,7 +440,7 @@ func (h ApplicationHandler) AdminStatVehicles(w http.ResponseWriter, r *http.Req
Groupids: administrators, Groupids: administrators,
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("Issue in Groups management service - GetGroupsBatch") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -440,6 +456,7 @@ func (h ApplicationHandler) AdminStatVehicles(w http.ResponseWriter, r *http.Req
} }
func (h ApplicationHandler) AdminStatBookings(w http.ResponseWriter, r *http.Request) { func (h ApplicationHandler) AdminStatBookings(w http.ResponseWriter, r *http.Request) {
vehicles := map[string]fleetsstorage.Vehicle{} vehicles := map[string]fleetsstorage.Vehicle{}
bookings := []fleetsstorage.Booking{} bookings := []fleetsstorage.Booking{}
@@ -448,7 +465,7 @@ func (h ApplicationHandler) AdminStatBookings(w http.ResponseWriter, r *http.Req
} }
reesp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), reequest) reesp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), reequest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("Issue in Fleets service - GetVehicles") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -474,7 +491,7 @@ func (h ApplicationHandler) AdminStatBookings(w http.ResponseWriter, r *http.Req
Namespaces: []string{"parcoursmob_organizations"}, Namespaces: []string{"parcoursmob_organizations"},
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("Issue in Groups management service - GetGroups") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -487,7 +504,7 @@ func (h ApplicationHandler) AdminStatBookings(w http.ResponseWriter, r *http.Req
Accountids: beneficiaries_ids, Accountids: beneficiaries_ids,
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("Issue in Mobility accounts service - GetAccountsBatch") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -516,7 +533,7 @@ func (h *ApplicationHandler) groupmembers(groupid string) (groupmembers []mobili
members, err := h.members() members, err := h.members()
if err != nil { if err != nil {
if err != nil { if err != nil {
log.Error().Err(err).Msg("Cannot get members") fmt.Println(err)
return nil, nil, err return nil, nil, err
} }
} }
@@ -542,7 +559,7 @@ func (h *ApplicationHandler) groupmembers(groupid string) (groupmembers []mobili
func (h ApplicationHandler) AdminStatBeneficaires(w http.ResponseWriter, r *http.Request) { func (h ApplicationHandler) AdminStatBeneficaires(w http.ResponseWriter, r *http.Request) {
beneficiaries, err := h.services.GetBeneficiaries() beneficiaries, err := h.services.GetBeneficiaries()
if err != nil { if err != nil {
log.Error().Err(err).Msg("Cannot get beneficiaries") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -555,8 +572,9 @@ func (h ApplicationHandler) AdminStatEvents(w http.ResponseWriter, r *http.Reque
resp, err := h.services.GRPC.Agenda.GetEvents(context.TODO(), &agenda.GetEventsRequest{ resp, err := h.services.GRPC.Agenda.GetEvents(context.TODO(), &agenda.GetEventsRequest{
Namespaces: []string{"parcoursmob_dispositifs"}, Namespaces: []string{"parcoursmob_dispositifs"},
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("Issue in Agenda service - GetEvents") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }

View File

@@ -4,7 +4,6 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io"
"net/http" "net/http"
"sort" "sort"
"strconv" "strconv"
@@ -14,15 +13,12 @@ import (
formvalidators "git.coopgo.io/coopgo-apps/parcoursmob/utils/form-validators" formvalidators "git.coopgo.io/coopgo-apps/parcoursmob/utils/form-validators"
"git.coopgo.io/coopgo-apps/parcoursmob/utils/identification" "git.coopgo.io/coopgo-apps/parcoursmob/utils/identification"
"git.coopgo.io/coopgo-apps/parcoursmob/utils/sorting" "git.coopgo.io/coopgo-apps/parcoursmob/utils/sorting"
filestorage "git.coopgo.io/coopgo-apps/parcoursmob/utils/storage"
agenda "git.coopgo.io/coopgo-platform/agenda/grpcapi" agenda "git.coopgo.io/coopgo-platform/agenda/grpcapi"
agendastorage "git.coopgo.io/coopgo-platform/agenda/storage" agendastorage "git.coopgo.io/coopgo-platform/agenda/storage"
groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi" groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi"
"git.coopgo.io/coopgo-platform/groups-management/storage" "git.coopgo.io/coopgo-platform/groups-management/storage"
mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi" mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
"github.com/google/uuid"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/rs/zerolog/log"
"google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/structpb"
"google.golang.org/protobuf/types/known/timestamppb" "google.golang.org/protobuf/types/known/timestamppb"
) )
@@ -47,7 +43,7 @@ func (h *ApplicationHandler) AgendaHome(w http.ResponseWriter, r *http.Request)
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -82,7 +78,7 @@ func (h *ApplicationHandler) AgendaHistory(w http.ResponseWriter, r *http.Reques
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -123,12 +119,10 @@ func (h *ApplicationHandler) AgendaCreateEvent(w http.ResponseWriter, r *http.Re
eventForm, err := parseEventsForm(r) eventForm, err := parseEventsForm(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
log.Debug().Any("eventFrom", eventForm).Msg("Form data submitted to create event")
data, _ := structpb.NewStruct(map[string]any{ data, _ := structpb.NewStruct(map[string]any{
"address": eventForm.Address, "address": eventForm.Address,
@@ -153,52 +147,17 @@ func (h *ApplicationHandler) AgendaCreateEvent(w http.ResponseWriter, r *http.Re
} }
resp, err := h.services.GRPC.Agenda.CreateEvent(context.TODO(), request) resp, err := h.services.GRPC.Agenda.CreateEvent(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
contentType := r.Header.Get("Content-Type")
if strings.HasPrefix(contentType, "multipart/form-data") {
err = r.ParseMultipartForm(100 * 1024 * 1024) // 100 MB limit
if err != nil {
log.Error().Err(err).Msg("Error parsing multipart form")
w.WriteHeader(http.StatusBadRequest)
return
}
file, header, err := r.FormFile("file-upload")
if err == nil {
defer file.Close()
document_type := r.FormValue("file_type")
document_name := r.FormValue("file_name")
fileid := uuid.NewString()
metadata := map[string]string{
"file_type": document_type,
"file_name": document_name,
}
if err := h.filestorage.Put(file, filestorage.PREFIX_AGENDA, fmt.Sprintf("%s/%s_%s", resp.Event.Id, fileid, header.Filename), header.Size, metadata); err != nil {
log.Error().Err(err).Msg("Error uploading file")
w.WriteHeader(http.StatusInternalServerError)
return
}
} else if err != http.ErrMissingFile {
log.Error().Err(err).Msg("Error retrieving file")
w.WriteHeader(http.StatusInternalServerError)
return
}
}
http.Redirect(w, r, fmt.Sprintf("/app/agenda/%s", resp.Event.Id), http.StatusFound) http.Redirect(w, r, fmt.Sprintf("/app/agenda/%s", resp.Event.Id), http.StatusFound)
return return
} }
h.Renderer.AgendaCreateEvent(w, r)
h.Renderer.AgendaCreateEvent(w, r, h.config.GetStringSlice("modules.agenda.documents_types"), h.config.GetStringMapString("storage.files.file_types"), nil)
} }
func (h *ApplicationHandler) AgendaDisplayEvent(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) AgendaDisplayEvent(w http.ResponseWriter, r *http.Request) {
@@ -211,7 +170,7 @@ func (h *ApplicationHandler) AgendaDisplayEvent(w http.ResponseWriter, r *http.R
resp, err := h.services.GRPC.Agenda.GetEvent(context.TODO(), request) resp, err := h.services.GRPC.Agenda.GetEvent(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -222,7 +181,7 @@ func (h *ApplicationHandler) AgendaDisplayEvent(w http.ResponseWriter, r *http.R
groupresp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), grouprequest) groupresp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), grouprequest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -249,7 +208,7 @@ func (h *ApplicationHandler) AgendaDisplayEvent(w http.ResponseWriter, r *http.R
g := r.Context().Value(identification.GroupKey) g := r.Context().Value(identification.GroupKey)
if g == nil { if g == nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -278,24 +237,19 @@ func (h *ApplicationHandler) AgendaDisplayEvent(w http.ResponseWriter, r *http.R
} }
} }
documents := h.filestorage.List(filestorage.PREFIX_AGENDA + "/" + eventid) h.Renderer.AgendaDisplayEvent(w, r, resp.Event.ToStorageType(), groupresp.Group.ToStorageType(), subscribers, accounts)
events_file_types := h.config.GetStringSlice("modules.agenda.documents_types")
file_types_map := h.config.GetStringMapString("storage.files.file_types")
h.Renderer.AgendaDisplayEvent(w, r, resp.Event.ToStorageType(), groupresp.Group.ToStorageType(), events_file_types, file_types_map, documents, subscribers, accounts)
} }
func (h *ApplicationHandler) AgendaSubscribeEvent(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) AgendaSubscribeEvent(w http.ResponseWriter, r *http.Request) {
current_group, err := h.currentGroup(r) current_group, err := h.currentGroup(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
current_user_token, current_user_claims, err := h.currentUser(r) current_user_token, current_user_claims, err := h.currentUser(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -303,7 +257,7 @@ func (h *ApplicationHandler) AgendaSubscribeEvent(w http.ResponseWriter, r *http
eventid := vars["eventid"] eventid := vars["eventid"]
if err := r.ParseForm(); err != nil { if err := r.ParseForm(); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@@ -323,7 +277,7 @@ func (h *ApplicationHandler) AgendaSubscribeEvent(w http.ResponseWriter, r *http
} }
datapb, err := structpb.NewStruct(data) datapb, err := structpb.NewStruct(data)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -336,7 +290,7 @@ func (h *ApplicationHandler) AgendaSubscribeEvent(w http.ResponseWriter, r *http
_, err = h.services.GRPC.Agenda.SubscribeEvent(context.TODO(), request) _, err = h.services.GRPC.Agenda.SubscribeEvent(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -412,7 +366,7 @@ func contains(s []*agenda.Subscription, e string) bool {
return false return false
} }
// /////////////////////////////Update Event///////////////////////////////////////// ///////////////////////////////Update Event/////////////////////////////////////////
func (h *ApplicationHandler) AgendaUpdateEvent(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) AgendaUpdateEvent(w http.ResponseWriter, r *http.Request) {
adm := strings.Split(r.URL.Path, "/") adm := strings.Split(r.URL.Path, "/")
eventID := adm[3] eventID := adm[3]
@@ -422,7 +376,7 @@ func (h *ApplicationHandler) AgendaUpdateEvent(w http.ResponseWriter, r *http.Re
resp, err := h.services.GRPC.Agenda.GetEvent(context.TODO(), request) resp, err := h.services.GRPC.Agenda.GetEvent(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -437,7 +391,7 @@ func (h *ApplicationHandler) AgendaUpdateEvent(w http.ResponseWriter, r *http.Re
eventForm, err := parseEventsForm(r) eventForm, err := parseEventsForm(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@@ -468,7 +422,7 @@ func (h *ApplicationHandler) AgendaUpdateEvent(w http.ResponseWriter, r *http.Re
resp, err := h.services.GRPC.Agenda.UpdateEvent(context.TODO(), request) resp, err := h.services.GRPC.Agenda.UpdateEvent(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -489,7 +443,7 @@ func (h *ApplicationHandler) AgendaDeleteEvent(w http.ResponseWriter, r *http.Re
resp, err := h.services.GRPC.Agenda.GetEvent(context.TODO(), request) resp, err := h.services.GRPC.Agenda.GetEvent(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -519,7 +473,7 @@ func (h *ApplicationHandler) AgendaDeleteEvent(w http.ResponseWriter, r *http.Re
_, err := h.services.GRPC.Agenda.UpdateEvent(context.TODO(), request) _, err := h.services.GRPC.Agenda.UpdateEvent(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -530,7 +484,7 @@ func (h *ApplicationHandler) AgendaDeleteEvent(w http.ResponseWriter, r *http.Re
h.Renderer.AgendaDeleteEvent(w, r, resp.Event.ToStorageType()) h.Renderer.AgendaDeleteEvent(w, r, resp.Event.ToStorageType())
} }
// /////////////////////////Delete subscriber/////////////////////////////// ///////////////////////////Delete subscriber///////////////////////////////
func (h *ApplicationHandler) AgendaDeleteSubscribeEvent(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) AgendaDeleteSubscribeEvent(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r) vars := mux.Vars(r)
eventId := vars["eventid"] eventId := vars["eventid"]
@@ -546,7 +500,7 @@ func (h *ApplicationHandler) AgendaDeleteSubscribeEvent(w http.ResponseWriter, r
resp, err := h.services.GRPC.Agenda.GetEvent(context.TODO(), request) resp, err := h.services.GRPC.Agenda.GetEvent(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -568,14 +522,14 @@ func (h *ApplicationHandler) AgendaDeleteSubscribeEvent(w http.ResponseWriter, r
current_group, err := h.currentGroup(r) current_group, err := h.currentGroup(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
current_user_token, current_user_claims, err := h.currentUser(r) current_user_token, current_user_claims, err := h.currentUser(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -608,7 +562,7 @@ func (h *ApplicationHandler) AgendaDeleteSubscribeEvent(w http.ResponseWriter, r
datapb, err := structpb.NewStruct(data) datapb, err := structpb.NewStruct(data)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -629,18 +583,18 @@ func (h *ApplicationHandler) AgendaDeleteSubscribeEvent(w http.ResponseWriter, r
// récupérer l'adresse mail de l'utilisateur qui a créé l'événement // récupérer l'adresse mail de l'utilisateur qui a créé l'événement
mail := s_b_email mail := s_b_email
log.Debug().Str("mail", mail).Msg("Email content") fmt.Println(mail)
_, err := h.services.GRPC.Agenda.DeleteSubscription(context.TODO(), request) _, err := h.services.GRPC.Agenda.DeleteSubscription(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
if err := h.emailing.Send("delete_subscriber.request", mail, data); err != nil { if err := h.emailing.Send("delete_subscriber.request", mail, data); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -651,7 +605,7 @@ func (h *ApplicationHandler) AgendaDeleteSubscribeEvent(w http.ResponseWriter, r
h.Renderer.AgendaDeleteSubscribeEvent(w, r, eventId) h.Renderer.AgendaDeleteSubscribeEvent(w, r, eventId)
} }
// ////////////////////////////////////////////////////// ////////////////////////////////////////////////////////
// /////////////////////History Event//////////////////////// // /////////////////////History Event////////////////////////
func (h *ApplicationHandler) AgendaHistoryEvent(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) AgendaHistoryEvent(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r) vars := mux.Vars(r)
@@ -662,7 +616,7 @@ func (h *ApplicationHandler) AgendaHistoryEvent(w http.ResponseWriter, r *http.R
resp, err := h.services.GRPC.Agenda.GetEvent(context.TODO(), request) resp, err := h.services.GRPC.Agenda.GetEvent(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -673,7 +627,7 @@ func (h *ApplicationHandler) AgendaHistoryEvent(w http.ResponseWriter, r *http.R
groupresp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), grouprequest) groupresp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), grouprequest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -700,6 +654,7 @@ func (h *ApplicationHandler) AgendaHistoryEvent(w http.ResponseWriter, r *http.R
g := r.Context().Value(identification.GroupKey) g := r.Context().Value(identification.GroupKey)
if g == nil { if g == nil {
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -730,61 +685,3 @@ func (h *ApplicationHandler) AgendaHistoryEvent(w http.ResponseWriter, r *http.R
h.Renderer.AgendaHistoryEvent(w, r, resp.Event.ToStorageType(), groupresp.Group.ToStorageType(), subscribers, accounts) h.Renderer.AgendaHistoryEvent(w, r, resp.Event.ToStorageType(), groupresp.Group.ToStorageType(), subscribers, accounts)
} }
// //// ADD DOCUMENTS //////
func (h *ApplicationHandler) EventDocuments(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
eventID := vars["eventid"]
//r.ParseForm()
r.ParseMultipartForm(100 * 1024 * 1024)
document_type := r.FormValue("type")
document_name := r.FormValue("name")
file, header, err := r.FormFile("file-upload")
if err != nil {
log.Error().Err(err).Msg("")
return
}
defer file.Close()
fileid := uuid.NewString()
metadata := map[string]string{
"type": document_type,
"name": document_name,
}
if err := h.filestorage.Put(file, filestorage.PREFIX_AGENDA, fmt.Sprintf("%s/%s_%s", eventID, fileid, header.Filename), header.Size, metadata); err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
http.Redirect(w, r, fmt.Sprintf("/app/agenda/%s", eventID), http.StatusFound)
}
func (h *ApplicationHandler) EventDocumentDownload(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
eventID := vars["eventid"]
document := vars["document"]
file, info, err := h.filestorage.Get(filestorage.PREFIX_AGENDA, fmt.Sprintf("%s/%s", eventID, document))
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", info.ContentType)
if _, err = io.Copy(w, file); err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
http.Redirect(w, r, fmt.Sprintf("/app/agenda/%s", eventID), http.StatusFound)
}

View File

@@ -10,7 +10,7 @@ import (
cache "git.coopgo.io/coopgo-apps/parcoursmob/utils/storage" cache "git.coopgo.io/coopgo-apps/parcoursmob/utils/storage"
"git.coopgo.io/coopgo-platform/emailing" "git.coopgo.io/coopgo-platform/emailing"
"git.coopgo.io/coopgo-platform/groups-management/storage" "git.coopgo.io/coopgo-platform/groups-management/storage"
"github.com/coreos/go-oidc/v3/oidc" "github.com/coreos/go-oidc"
"github.com/spf13/viper" "github.com/spf13/viper"
) )

View File

@@ -8,6 +8,7 @@ import (
"fmt" "fmt"
"image/png" "image/png"
"io" "io"
"log"
"net/http" "net/http"
"sort" "sort"
"strconv" "strconv"
@@ -27,11 +28,11 @@ import (
"git.coopgo.io/coopgo-platform/groups-management/storage" "git.coopgo.io/coopgo-platform/groups-management/storage"
mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi" mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage" mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage"
diags "git.coopgo.io/coopgo-platform/diags/grpcapi" solidarity_service "git.coopgo.io/sbouaram/solidarity-service/servers/grpc/proto"
diagsstorage "git.coopgo.io/coopgo-platform/diags/storage"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/rs/zerolog/log"
"google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/structpb"
) )
@@ -111,7 +112,7 @@ func (h *ApplicationHandler) BeneficiariesList(w http.ResponseWriter, r *http.Re
accounts, err := h.beneficiaries(r) accounts, err := h.beneficiaries(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@@ -126,7 +127,7 @@ func (h *ApplicationHandler) BeneficiariesList(w http.ResponseWriter, r *http.Re
func (h *ApplicationHandler) BeneficiaryCreate(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) BeneficiaryCreate(w http.ResponseWriter, r *http.Request) {
g := r.Context().Value(identification.GroupKey) g := r.Context().Value(identification.GroupKey)
if g == nil { if g == nil {
log.Error().Msg("Create beneficiary : could not find group") fmt.Println("Create beneficiary : could not find group")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@@ -137,14 +138,14 @@ func (h *ApplicationHandler) BeneficiaryCreate(w http.ResponseWriter, r *http.Re
dataMap, err := parseBeneficiariesForm(r) dataMap, err := parseBeneficiariesForm(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
data, err := structpb.NewValue(dataMap) data, err := structpb.NewValue(dataMap)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -159,7 +160,7 @@ func (h *ApplicationHandler) BeneficiaryCreate(w http.ResponseWriter, r *http.Re
resp, err := h.services.GRPC.MobilityAccounts.Register(context.TODO(), request) resp, err := h.services.GRPC.MobilityAccounts.Register(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -172,7 +173,7 @@ func (h *ApplicationHandler) BeneficiaryCreate(w http.ResponseWriter, r *http.Re
_, err = h.services.GRPC.GroupsManagement.Subscribe(context.TODO(), subscribe) _, err = h.services.GRPC.GroupsManagement.Subscribe(context.TODO(), subscribe)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -196,7 +197,7 @@ func (h *ApplicationHandler) BeneficiaryDisplay(w http.ResponseWriter, r *http.R
resp, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), request) resp, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -207,7 +208,7 @@ func (h *ApplicationHandler) BeneficiaryDisplay(w http.ResponseWriter, r *http.R
subcriptionresp, err := h.services.GRPC.Agenda.GetSubscriptionByUser(context.TODO(), subscriptionrequest) subcriptionresp, err := h.services.GRPC.Agenda.GetSubscriptionByUser(context.TODO(), subscriptionrequest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -221,7 +222,7 @@ func (h *ApplicationHandler) BeneficiaryDisplay(w http.ResponseWriter, r *http.R
} }
eventresp, err := h.services.GRPC.Agenda.GetEvent(context.TODO(), eventresquest) eventresp, err := h.services.GRPC.Agenda.GetEvent(context.TODO(), eventresquest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -235,7 +236,7 @@ func (h *ApplicationHandler) BeneficiaryDisplay(w http.ResponseWriter, r *http.R
} }
bookingsresp, err := h.services.GRPC.Fleets.GetDriverBookings(context.TODO(), bookingsrequest) bookingsresp, err := h.services.GRPC.Fleets.GetDriverBookings(context.TODO(), bookingsrequest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -283,7 +284,7 @@ func (h *ApplicationHandler) BeneficiaryDisplay(w http.ResponseWriter, r *http.R
GetVehiculeResp, err := h.services.GRPC.Fleets.GetVehicle(context.Background(), GetVehiculeRequest) GetVehiculeResp, err := h.services.GRPC.Fleets.GetVehicle(context.Background(), GetVehiculeRequest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -312,26 +313,6 @@ func (h *ApplicationHandler) BeneficiaryDisplay(w http.ResponseWriter, r *http.R
} }
sortByDate(events_list) sortByDate(events_list)
diag := []diagsstorage.Diag{}
diagsrequest := &diags.GetDiagsRequest{
Namespaces: []string{"parcoursmob_beneficiaries"},
}
diagsresp, err := h.services.GRPC.Diags.GetDiags(context.TODO(), diagsrequest)
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
for _, d := range diagsresp.Diags {
diagData := d.Data.AsMap()
if beneficiary, ok := diagData["beneficiary"].(string); ok && beneficiary == beneficiaryID {
diag = append(diag, d.ToStorageType())
}
}
groupsrequest := &groupsmanagement.GetGroupsRequest{ groupsrequest := &groupsmanagement.GetGroupsRequest{
Namespaces: []string{"parcoursmob_organizations"}, Namespaces: []string{"parcoursmob_organizations"},
Member: beneficiaryID, Member: beneficiaryID,
@@ -339,22 +320,95 @@ func (h *ApplicationHandler) BeneficiaryDisplay(w http.ResponseWriter, r *http.R
groupsresp, err := h.services.GRPC.GroupsManagement.GetGroups(context.TODO(), groupsrequest) groupsresp, err := h.services.GRPC.GroupsManagement.GetGroups(context.TODO(), groupsrequest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
} }
organizations := []any{} organizations := []any{}
for _, o := range groupsresp.Groups { for _, o := range groupsresp.Groups {
organizations = append(organizations, o.ToStorageType()) organizations = append(organizations, o.ToStorageType())
} }
beneficiaries_file_types := h.config.GetStringSlice("modules.beneficiaries.documents_types") beneficiaries_file_types := h.config.GetStringSlice("modules.beneficiaries.documents_types")
file_types_map := h.config.GetStringMapString("storage.files.file_types") file_types_map := h.config.GetStringMapString("storage.files.file_types")
diagsAny := make([]any, len(diag)) if r.Method == "POST" {
for i, d := range diag {
diagsAny[i] = d request := &mobilityaccounts.GetAccountRequest{
Id: beneficiaryID,
}
resp, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), request)
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
fields := resp.Account.Data.Fields
firstName, ok := fields["first_name"]
if !ok {
fmt.Println("first_name not found in the data")
w.WriteHeader(http.StatusInternalServerError)
return
}
lastName, ok := fields["last_name"]
if !ok {
fmt.Println("last_name not found in the data")
w.WriteHeader(http.StatusInternalServerError)
return
}
passenger := solidarity_service.PassengerTripRequest {
Passenger : &solidarity_service.User {
Id: resp.Account.Id,
FirstName: firstName.Kind.(*structpb.Value_StringValue).StringValue,
LastName: lastName.Kind.(*structpb.Value_StringValue).StringValue,
Alias: " ",
Grade: 0,
Picture: " ",
Gender: " ",
VerifiedIdentity: true,
},
}
silvermobiPassenger, err := h.services.GRPC.SolidarityService.SetPassengerTrip(context.TODO(), &passenger)
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
t := silvermobiPassenger
t = t
} }
h.Renderer.BeneficiaryDisplay(w, r, resp.Account.ToStorageType(), bookings, organizations, beneficiaries_file_types, file_types_map, documents, events_list, diagsAny)
solidarity_booking := &solidarity_service.GetBookingsByStatusRequest{
Status : 0, /// 0 : pending
UserId : beneficiaryID,
Type: 1, /// 1 : passenger
}
solidarity_bookings_object, err := h.services.GRPC.SolidarityService.GetBookingsByStatus(context.TODO(), solidarity_booking)
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusBadRequest)
return
}
var solidarity_bookings_list []any
for _, o := range solidarity_bookings_object.Booking {
if(o.PassengerPickupDate != nil){
solidarity_bookings_list = append(solidarity_bookings_list, o)
}
}
h.Renderer.BeneficiaryDisplay(w, r, resp.Account.ToStorageType(), bookings, organizations, beneficiaries_file_types, file_types_map, documents, events_list, solidarity_bookings_list)
} }
func (h *ApplicationHandler) BeneficiaryUpdate(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) BeneficiaryUpdate(w http.ResponseWriter, r *http.Request) {
@@ -365,14 +419,14 @@ func (h *ApplicationHandler) BeneficiaryUpdate(w http.ResponseWriter, r *http.Re
dataMap, err := parseBeneficiariesForm(r) dataMap, err := parseBeneficiariesForm(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
data, err := structpb.NewValue(dataMap) data, err := structpb.NewValue(dataMap)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -388,7 +442,7 @@ func (h *ApplicationHandler) BeneficiaryUpdate(w http.ResponseWriter, r *http.Re
resp, err := h.services.GRPC.MobilityAccounts.UpdateData(context.TODO(), request) resp, err := h.services.GRPC.MobilityAccounts.UpdateData(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -404,7 +458,7 @@ func (h *ApplicationHandler) BeneficiaryUpdate(w http.ResponseWriter, r *http.Re
resp, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), request) resp, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -425,7 +479,7 @@ func (h *ApplicationHandler) BeneficiaryPicture(w http.ResponseWriter, r *http.R
resp, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), request) resp, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -438,13 +492,13 @@ func (h *ApplicationHandler) BeneficiaryPicture(w http.ResponseWriter, r *http.R
buffer := new(bytes.Buffer) buffer := new(bytes.Buffer)
if err := png.Encode(buffer, picture); err != nil { if err := png.Encode(buffer, picture); err != nil {
log.Error().Err(err).Msg("unable to encode image.") log.Println("unable to encode image.")
} }
w.Header().Set("Content-Type", "image/png") w.Header().Set("Content-Type", "image/png")
w.Header().Set("Content-Length", strconv.Itoa(len(buffer.Bytes()))) w.Header().Set("Content-Length", strconv.Itoa(len(buffer.Bytes())))
if _, err := w.Write(buffer.Bytes()); err != nil { if _, err := w.Write(buffer.Bytes()); err != nil {
log.Error().Err(err).Msg("unable to write image.") log.Println("unable to write image.")
} }
} }
@@ -460,7 +514,7 @@ func (h *ApplicationHandler) BeneficiaryDocuments(w http.ResponseWriter, r *http
file, header, err := r.FormFile("file-upload") file, header, err := r.FormFile("file-upload")
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return return
} }
defer file.Close() defer file.Close()
@@ -472,10 +526,8 @@ func (h *ApplicationHandler) BeneficiaryDocuments(w http.ResponseWriter, r *http
"name": document_name, "name": document_name,
} }
log.Debug().Any("metadata", metadata).Msg("Metadata")
if err := h.filestorage.Put(file, filestorage.PREFIX_BENEFICIARIES, fmt.Sprintf("%s/%s_%s", beneficiaryID, fileid, header.Filename), header.Size, metadata); err != nil { if err := h.filestorage.Put(file, filestorage.PREFIX_BENEFICIARIES, fmt.Sprintf("%s/%s_%s", beneficiaryID, fileid, header.Filename), header.Size, metadata); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -491,14 +543,14 @@ func (h *ApplicationHandler) BeneficiaryDocumentDownload(w http.ResponseWriter,
file, info, err := h.filestorage.Get(filestorage.PREFIX_BENEFICIARIES, fmt.Sprintf("%s/%s", beneficiaryID, document)) file, info, err := h.filestorage.Get(filestorage.PREFIX_BENEFICIARIES, fmt.Sprintf("%s/%s", beneficiaryID, document))
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
w.Header().Set("Content-Type", info.ContentType) w.Header().Set("Content-Type", info.ContentType)
if _, err = io.Copy(w, file); err != nil { if _, err = io.Copy(w, file); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -562,7 +614,7 @@ func parseBeneficiariesForm(r *http.Request) (map[string]any, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
date = &d date = &d
} }
formData := BeneficiariesForm{ formData := BeneficiariesForm{
@@ -571,7 +623,7 @@ func parseBeneficiariesForm(r *http.Request) (map[string]any, error) {
Email: r.PostFormValue("email"), Email: r.PostFormValue("email"),
Birthdate: date, Birthdate: date,
PhoneNumber: r.PostFormValue("phone_number"), PhoneNumber: r.PostFormValue("phone_number"),
FileNumber: r.PostFormValue("file_number"), FileNumber: r.PostFormValue("file_number"),
Gender: r.PostFormValue("gender"), Gender: r.PostFormValue("gender"),
} }

View File

@@ -2,6 +2,7 @@ package application
import ( import (
"context" "context"
"fmt"
"net/http" "net/http"
"sort" "sort"
@@ -9,11 +10,8 @@ import (
"git.coopgo.io/coopgo-apps/parcoursmob/utils/sorting" "git.coopgo.io/coopgo-apps/parcoursmob/utils/sorting"
agenda "git.coopgo.io/coopgo-platform/agenda/grpcapi" agenda "git.coopgo.io/coopgo-platform/agenda/grpcapi"
agendastorage "git.coopgo.io/coopgo-platform/agenda/storage" agendastorage "git.coopgo.io/coopgo-platform/agenda/storage"
fleets "git.coopgo.io/coopgo-platform/fleets/grpcapi"
fleetstorage "git.coopgo.io/coopgo-platform/fleets/storage"
"git.coopgo.io/coopgo-platform/groups-management/storage" "git.coopgo.io/coopgo-platform/groups-management/storage"
mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi" mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
"github.com/rs/zerolog/log"
"google.golang.org/protobuf/types/known/timestamppb" "google.golang.org/protobuf/types/known/timestamppb"
) )
@@ -33,7 +31,7 @@ func (h *ApplicationHandler) Dashboard(w http.ResponseWriter, r *http.Request) {
resp, err := h.services.GRPC.MobilityAccounts.GetAccountsBatch(context.TODO(), request) resp, err := h.services.GRPC.MobilityAccounts.GetAccountsBatch(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -56,7 +54,7 @@ func (h *ApplicationHandler) Dashboard(w http.ResponseWriter, r *http.Request) {
members, _, err := h.groupmembers(group.ID) members, _, err := h.groupmembers(group.ID)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -78,18 +76,6 @@ func (h *ApplicationHandler) Dashboard(w http.ResponseWriter, r *http.Request) {
sort.Sort(sorting.EventsByStartdate(events)) sort.Sort(sorting.EventsByStartdate(events))
bookings := []fleetstorage.Booking{} h.Renderer.Dashboard(w, r, accounts, count, count_members, events)
bookingsresp, err := h.services.GRPC.Fleets.GetBookings(context.TODO(), &fleets.GetBookingsRequest{
Namespaces: []string{"parcoursmob_dispositifs"},
})
if err == nil {
for _, b := range bookingsresp.Bookings {
bookings = append(bookings, b.ToStorageType())
}
}
h.Renderer.Dashboard(w, r, accounts, count, count_members, events, bookings)
} }

View File

@@ -1,642 +0,0 @@
package application
import (
"context"
"encoding/json"
"errors"
"fmt"
"io"
// "io"
"net/http"
// "strconv"
"strings"
"time"
"git.coopgo.io/coopgo-apps/parcoursmob/services"
"git.coopgo.io/coopgo-apps/parcoursmob/utils/identification"
filestorage "git.coopgo.io/coopgo-apps/parcoursmob/utils/storage"
// filestorage "git.coopgo.io/coopgo-apps/parcoursmob/utils/storage"
diags "git.coopgo.io/coopgo-platform/diags/grpcapi"
diagsstorage "git.coopgo.io/coopgo-platform/diags/storage"
groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi"
"git.coopgo.io/coopgo-platform/groups-management/storage"
// mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
// "github.com/google/uuid"
"github.com/google/uuid"
"github.com/gorilla/mux"
"github.com/rs/zerolog/log"
"google.golang.org/protobuf/types/known/structpb"
"google.golang.org/protobuf/types/known/timestamppb"
)
type DiagsForm struct {
Name string `json:"name" validate:"required"`
Namespace string `json:"namespace" validate:"required"`
JsonSchema string `json:"json_schema"`
UiSchema string `json:"ui_schema"`
Data map[string]any `json:"data"`
Deleted bool `json:"deleted"`
Diagdate *time.Time `json:"diagdate"`
Owners []string `json:"owners"`
}
func (h *ApplicationHandler) DiagsHome(w http.ResponseWriter, r *http.Request) {
groupID := r.Context().Value(identification.GroupKey).(storage.Group).ID
resp, err := h.services.GRPC.Diags.GetDiags(context.TODO(), &diags.GetDiagsRequest{
Namespaces: []string{"parcoursmob_beneficiaries", "parcoursmob_diagnostiques", "parcoursmob_vehicles", "parcoursmob_bookings"},
})
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
responses := []diagsstorage.Diag{}
groupids := []string{}
for _, e := range resp.Diags {
groupids = append(groupids, e.Owners...)
responses = append(responses, e.ToStorageType())
}
groupsresp, err := h.services.GRPC.GroupsManagement.GetGroupsBatch(context.TODO(), &groupsmanagement.GetGroupsBatchRequest{
Groupids: groupids,
})
groups := map[string]any{}
if err == nil {
for _, g := range groupsresp.Groups {
groups[g.Id] = g.ToStorageType()
}
}
filteredDiags := []diagsstorage.Diag{}
for _, diag := range responses {
for _, owner := range diag.Owners {
if string(owner) == groupID {
filteredDiags = append(filteredDiags, diag)
log.Debug().Msgf("Diag %s added to filtered list", diag.ID)
break
}
}
}
h.Renderer.DiagsHome(w, r, filteredDiags, groups)
}
func (h *ApplicationHandler) DiagsHistory(w http.ResponseWriter, r *http.Request) {
resp, err := h.services.GRPC.Diags.GetDiags(context.TODO(), &diags.GetDiagsRequest{
Namespaces: []string{"parcoursmob_beneficiaries", "parcoursmob_diagnostiques", "parcoursmob_vehicles", "parcoursmob_bookings"},
})
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
responses := []diagsstorage.Diag{}
for _, e := range resp.Diags {
if e.Deleted {
responses = append(responses, e.ToStorageType())
}
}
h.Renderer.DiagsHistory(w, r, responses)
}
func (h *ApplicationHandler) BeneficiariesCreateDiag(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
beneficiaryID := vars["beneficiaryid"]
if h.services == nil || (h.services.GRPC == services.GRPCServices{}) || h.services.GRPC.Diags == nil {
log.Error().Msg("Diags service is not initialized")
http.Error(w, "Internal server error", http.StatusInternalServerError)
return
}
if r.Method == http.MethodPost {
g := r.Context().Value(identification.GroupKey)
if g == nil {
http.Error(w, "Missing group information", http.StatusBadRequest)
return
}
group := g.(storage.Group)
diagForm, err := parseDiagsForm(r)
if err != nil {
log.Error().Err(err).Msg("Invalid form data")
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
data, err := structpb.NewStruct(map[string]any{
"beneficiary": beneficiaryID,
})
if err != nil {
log.Error().Err(err).Msg("Failed to create protobuf struct")
w.WriteHeader(http.StatusInternalServerError)
return
}
request := &diags.CreateDiagRequest{
Diag: &diags.Diag{
Name: diagForm.Name,
Namespace: diagForm.Namespace,
JsonSchema: diagForm.JsonSchema,
UiSchema: diagForm.UiSchema,
Data: data,
Deleted: diagForm.Deleted,
Diagdate: timestamppb.New(time.Now()),
Owners: []string{group.ID},
},
}
resp, err := h.services.GRPC.Diags.CreateDiag(context.TODO(), request)
if err != nil {
log.Error().Err(err).Msg("Failed to create diagnostic")
w.WriteHeader(http.StatusInternalServerError)
return
}
contentType := r.Header.Get("Content-Type")
if strings.HasPrefix(contentType, "multipart/form-data") {
err = r.ParseMultipartForm(100 * 1024 * 1024) // 100 MB limit
if err != nil {
log.Error().Err(err).Msg("Error parsing multipart form")
w.WriteHeader(http.StatusBadRequest)
return
}
file, header, err := r.FormFile("file-upload")
if err == nil {
defer file.Close()
document_type := r.FormValue("file_type")
document_name := r.FormValue("file_name")
fileid := uuid.NewString()
metadata := map[string]string{
"file_type": document_type,
"file_name": document_name,
}
if err := h.filestorage.Put(file, filestorage.PREFIX_DIAGS, fmt.Sprintf("%s/%s_%s", resp.Diag.Id, fileid, header.Filename), header.Size, metadata); err != nil {
log.Error().Err(err).Msg("Error uploading file")
w.WriteHeader(http.StatusInternalServerError)
return
}
} else if err != http.ErrMissingFile {
log.Error().Err(err).Msg("Error retrieving file")
w.WriteHeader(http.StatusInternalServerError)
return
}
}
http.Redirect(w, r, fmt.Sprintf("/app/diags/%s", resp.Diag.Id), http.StatusFound)
return
}
h.Renderer.BeneficiariesCreateDiag(w, r, beneficiaryID, h.config.GetStringSlice("modules.diags.documents_types"), h.config.GetStringMapString("storage.files.file_types"), nil)
}
func (h *ApplicationHandler) VehiclesCreateDiag(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
vehicleID := vars["vehicleid"]
if h.services == nil || (h.services.GRPC == services.GRPCServices{}) || h.services.GRPC.Diags == nil {
log.Error().Msg("Diags service is not initialized")
http.Error(w, "Internal server error", http.StatusInternalServerError)
return
}
if r.Method == http.MethodPost {
g := r.Context().Value(identification.GroupKey)
if g == nil {
http.Error(w, "Missing group information", http.StatusBadRequest)
return
}
diagForm, err := parseDiagsForm(r)
if err != nil {
log.Error().Err(err).Msg("Invalid form data")
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
log.Debug().Interface("diagForm", diagForm).Msg("Form data parsed")
data, err := structpb.NewStruct(map[string]any{
"vehicle": vehicleID,
})
if err != nil {
log.Error().Err(err).Msg("Failed to create protobuf struct")
w.WriteHeader(http.StatusInternalServerError)
return
}
group := g.(storage.Group)
request := &diags.CreateDiagRequest{
Diag: &diags.Diag{
Name: diagForm.Name,
Namespace: diagForm.Namespace,
JsonSchema: diagForm.JsonSchema,
UiSchema: diagForm.UiSchema,
Data: data,
Deleted: diagForm.Deleted,
Diagdate: timestamppb.New(time.Now()),
Owners: []string{group.ID},
},
}
resp, err := h.services.GRPC.Diags.CreateDiag(context.TODO(), request)
if err != nil {
log.Error().Err(err).Msg("Failed to create diagnostic")
w.WriteHeader(http.StatusInternalServerError)
return
}
http.Redirect(w, r, fmt.Sprintf("/app/diags/%s", resp.Diag.Id), http.StatusFound)
return
}
h.Renderer.VehiclesCreateDiag(w, r, vehicleID)
}
func (h *ApplicationHandler) BookingsCreateDiag(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
bookingID := vars["bookingid"]
if h.services == nil || (h.services.GRPC == services.GRPCServices{}) || h.services.GRPC.Diags == nil {
log.Error().Msg("Diags service is not initialized")
http.Error(w, "Internal server error", http.StatusInternalServerError)
return
}
if r.Method == http.MethodPost {
g := r.Context().Value(identification.GroupKey)
if g == nil {
http.Error(w, "Missing group information", http.StatusBadRequest)
return
}
diagForm, err := parseDiagsForm(r)
if err != nil {
log.Error().Err(err).Msg("Invalid form data")
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
log.Debug().Interface("diagForm", diagForm).Msg("Form data parsed")
data, err := structpb.NewStruct(map[string]any{
"booking": bookingID,
})
if err != nil {
log.Error().Err(err).Msg("Failed to create protobuf struct")
w.WriteHeader(http.StatusInternalServerError)
return
}
group := g.(storage.Group)
request := &diags.CreateDiagRequest{
Diag: &diags.Diag{
Name: diagForm.Name,
Namespace: diagForm.Namespace,
JsonSchema: diagForm.JsonSchema,
UiSchema: diagForm.UiSchema,
Data: data,
Deleted: diagForm.Deleted,
Diagdate: timestamppb.New(time.Now()),
Owners: []string{group.ID},
},
}
resp, err := h.services.GRPC.Diags.CreateDiag(context.TODO(), request)
if err != nil {
log.Error().Err(err).Msg("Failed to create diagnostic")
w.WriteHeader(http.StatusInternalServerError)
return
}
http.Redirect(w, r, fmt.Sprintf("/app/diags/%s", resp.Diag.Id), http.StatusFound)
return
}
h.Renderer.BookingsCreateDiag(w, r, bookingID)
}
func (h *ApplicationHandler) VehicleBookingsCreateDiag(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
bookingID := vars["bookingid"]
if h.services == nil || (h.services.GRPC == services.GRPCServices{}) || h.services.GRPC.Diags == nil {
log.Error().Msg("Diags service is not initialized")
http.Error(w, "Internal server error", http.StatusInternalServerError)
return
}
if r.Method == http.MethodPost {
g := r.Context().Value(identification.GroupKey)
if g == nil {
http.Error(w, "Missing group information", http.StatusBadRequest)
return
}
diagForm, err := parseDiagsForm(r)
if err != nil {
log.Error().Err(err).Msg("Invalid form data")
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
log.Debug().Interface("diagForm", diagForm).Msg("Form data parsed")
data, err := structpb.NewStruct(map[string]any{
"booking": bookingID,
})
if err != nil {
log.Error().Err(err).Msg("Failed to create protobuf struct")
w.WriteHeader(http.StatusInternalServerError)
return
}
group := g.(storage.Group)
request := &diags.CreateDiagRequest{
Diag: &diags.Diag{
Name: diagForm.Name,
Namespace: diagForm.Namespace,
JsonSchema: diagForm.JsonSchema,
UiSchema: diagForm.UiSchema,
Data: data,
Deleted: diagForm.Deleted,
Diagdate: timestamppb.New(time.Now()),
Owners: []string{group.ID},
},
}
resp, err := h.services.GRPC.Diags.CreateDiag(context.TODO(), request)
if err != nil {
log.Error().Err(err).Msg("Failed to create diagnostic")
w.WriteHeader(http.StatusInternalServerError)
return
}
http.Redirect(w, r, fmt.Sprintf("/app/diags/%s", resp.Diag.Id), http.StatusFound)
return
}
h.Renderer.VehicleBookingsCreateDiag(w, r, bookingID)
}
func (h *ApplicationHandler) DiagsDisplayDiag(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
diagid := vars["diagid"]
request := &diags.GetDiagRequest{
Id: diagid,
}
resp, err := h.services.GRPC.Diags.GetDiag(context.TODO(), request)
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
g := r.Context().Value(identification.GroupKey)
if g == nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
documents := h.filestorage.List(filestorage.PREFIX_DIAGS + "/" + diagid)
diags_file_types := h.config.GetStringSlice("modules.diags.documents_types")
file_types_map := h.config.GetStringMapString("storage.files.file_types")
h.Renderer.DiagsDisplayDiag(w, r, resp.Diag.ToStorageType(), diags_file_types, file_types_map, documents)
}
func parseDiagsForm(r *http.Request) (*DiagsForm, error) {
if err := r.ParseForm(); err != nil {
return nil, err
}
formData := &DiagsForm{
Name: r.PostFormValue("name"),
Namespace: r.PostFormValue("namespace"), // Récupère le namespace
JsonSchema: r.PostFormValue("json_schema"),
UiSchema: r.PostFormValue("ui_schema"),
Deleted: false,
}
if formData.Name == "" || formData.Namespace == "" {
return nil, errors.New("missing required fields: 'name' or 'namespace'")
}
// Gestion de la valeur JSON dans `data`
if rawData := r.PostFormValue("data"); rawData != "" {
data := map[string]any{}
if err := json.Unmarshal([]byte(rawData), &data); err != nil {
return nil, errors.New("invalid 'data' field: must be a valid JSON object")
}
formData.Data = data
}
return formData, nil
}
func (h *ApplicationHandler) DiagUpdate(w http.ResponseWriter, r *http.Request) {
adm := strings.Split(r.URL.Path, "/")
diagID := adm[3]
request := &diags.GetDiagRequest{
Id: diagID,
}
resp, err := h.services.GRPC.Diags.GetDiag(context.TODO(), request)
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
if r.Method == "POST" {
g := r.Context().Value(identification.GroupKey)
if g == nil {
w.WriteHeader(http.StatusBadRequest)
return
}
group := g.(storage.Group)
diagForm, err := parseDiagsForm(r)
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusBadRequest)
return
}
data, _ := structpb.NewStruct(map[string]any{})
request := &diags.UpdateDiagRequest{
Diag: &diags.Diag{
Namespace: diagForm.Namespace,
Id: diagID,
Name: diagForm.Name,
JsonSchema: diagForm.JsonSchema,
UiSchema: diagForm.UiSchema,
Data: data,
Diagdate: timestamppb.New(time.Now()),
Owners: []string{group.ID},
},
}
resp, err := h.services.GRPC.Diags.UpdateDiag(context.TODO(), request)
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
http.Redirect(w, r, fmt.Sprintf("/app/diags/%s", resp.Diag.Id), http.StatusFound)
return
}
h.Renderer.DiagUpdate(w, r, resp.Diag.ToStorageType())
}
func (h *ApplicationHandler) DiagDelete(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
diagID := vars["diagid"]
request := &diags.GetDiagRequest{
Id: diagID,
}
resp, err := h.services.GRPC.Diags.GetDiag(context.TODO(), request)
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
if r.Method == "POST" {
request := &diags.UpdateDiagRequest{
Diag: &diags.Diag{
Namespace: resp.Diag.Namespace,
Id: resp.Diag.Id,
Name: resp.Diag.Name,
JsonSchema: resp.Diag.JsonSchema,
UiSchema: resp.Diag.UiSchema,
Data: resp.Diag.Data,
Deleted: true,
Diagdate: resp.Diag.Diagdate,
},
}
_, err := h.services.GRPC.Diags.UpdateDiag(context.TODO(), request)
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
http.Redirect(w, r, "/app/diags/", http.StatusFound)
return
}
h.Renderer.DiagDelete(w, r, resp.Diag.ToStorageType())
}
func (h *ApplicationHandler) DiagsHistoryDiag(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
diagId := vars["diagid"]
request := &diags.GetDiagRequest{
Id: diagId,
}
resp, err := h.services.GRPC.Diags.GetDiag(context.TODO(), request)
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
h.Renderer.DiagsHistoryDiag(w, r, resp.Diag.ToStorageType())
}
// //// ADD DOCUMENTS //////
func (h *ApplicationHandler) DiagsDocuments(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
diagID := vars["diagid"]
//r.ParseForm()
r.ParseMultipartForm(100 * 1024 * 1024)
document_type := r.FormValue("type")
document_name := r.FormValue("name")
file, header, err := r.FormFile("file-upload")
if err != nil {
log.Error().Err(err).Msg("")
return
}
defer file.Close()
fileid := uuid.NewString()
metadata := map[string]string{
"type": document_type,
"name": document_name,
}
if err := h.filestorage.Put(file, filestorage.PREFIX_DIAGS, fmt.Sprintf("%s/%s_%s", diagID, fileid, header.Filename), header.Size, metadata); err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
http.Redirect(w, r, fmt.Sprintf("/app/diags/%s", diagID), http.StatusFound)
}
func (h *ApplicationHandler) DiagsDocumentDownload(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
diagID := vars["diagid"]
document := vars["document"]
file, info, err := h.filestorage.Get(filestorage.PREFIX_DIAGS, fmt.Sprintf("%s/%s", diagID, document))
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", info.ContentType)
if _, err = io.Copy(w, file); err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
http.Redirect(w, r, fmt.Sprintf("/app/diags/%s", diagID), http.StatusFound)
}

View File

@@ -4,6 +4,7 @@ import (
"context" "context"
"crypto/rand" "crypto/rand"
"encoding/base64" "encoding/base64"
"fmt"
"io" "io"
"net/http" "net/http"
"time" "time"
@@ -11,7 +12,6 @@ import (
"git.coopgo.io/coopgo-apps/parcoursmob/utils/identification" "git.coopgo.io/coopgo-apps/parcoursmob/utils/identification"
"git.coopgo.io/coopgo-platform/groups-management/storage" "git.coopgo.io/coopgo-platform/groups-management/storage"
accounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi" accounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
"github.com/rs/zerolog/log"
) )
func (h *ApplicationHandler) GroupSettingsDisplay(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) GroupSettingsDisplay(w http.ResponseWriter, r *http.Request) {
@@ -26,7 +26,7 @@ func (h *ApplicationHandler) GroupSettingsDisplay(w http.ResponseWriter, r *http
members, err := h.members() members, err := h.members()
if err != nil { if err != nil {
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -81,16 +81,14 @@ func (h *ApplicationHandler) GroupSettingsInviteMember(w http.ResponseWriter, r
}, },
) )
if err != nil { fmt.Println(err)
log.Error().Err(err).Msg("")
}
data := map[string]any{ data := map[string]any{
"group": group.Data["name"], "group": group.Data["name"],
} }
if err := h.emailing.Send("onboarding.existing_member", r.FormValue("username"), data); err != nil { if err := h.emailing.Send("onboarding.existing_member", r.FormValue("username"), data); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
} }
http.Redirect(w, r, "/app/group/settings", http.StatusFound) http.Redirect(w, r, "/app/group/settings", http.StatusFound)
@@ -105,7 +103,7 @@ func (h *ApplicationHandler) GroupSettingsInviteMember(w http.ResponseWriter, r
b := make([]byte, 16) b := make([]byte, 16)
if _, err := io.ReadFull(rand.Reader, b); err != nil { if _, err := io.ReadFull(rand.Reader, b); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -119,7 +117,7 @@ func (h *ApplicationHandler) GroupSettingsInviteMember(w http.ResponseWriter, r
} }
if err := h.emailing.Send("onboarding.new_member", r.FormValue("username"), data); err != nil { if err := h.emailing.Send("onboarding.new_member", r.FormValue("username"), data); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }

View File

@@ -14,7 +14,6 @@ import (
mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi" mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/rs/zerolog/log"
"google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/structpb"
) )
@@ -45,8 +44,8 @@ func (h *ApplicationHandler) Groups(w http.ResponseWriter, r *http.Request) {
} }
resp, err := h.services.GRPC.GroupsManagement.GetGroups(context.TODO(), request) resp, err := h.services.GRPC.GroupsManagement.GetGroups(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -74,12 +73,14 @@ func (h *ApplicationHandler) CreateGroupModule(w http.ResponseWriter, r *http.Re
r.ParseForm() r.ParseForm()
if r.FormValue("name") == "" { if r.FormValue("name") == "" {
log.Error().Msg("Invalid name")
fmt.Println("invalid name")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
if r.FormValue("type") == "" { if r.FormValue("type") == "" {
log.Error().Msg("Invalid type")
fmt.Println("invalid type")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@@ -95,7 +96,7 @@ func (h *ApplicationHandler) CreateGroupModule(w http.ResponseWriter, r *http.Re
data, err := structpb.NewValue(dataMap) data, err := structpb.NewValue(dataMap)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -110,7 +111,7 @@ func (h *ApplicationHandler) CreateGroupModule(w http.ResponseWriter, r *http.Re
_, err = h.services.GRPC.GroupsManagement.AddGroup(context.TODO(), request_organization) _, err = h.services.GRPC.GroupsManagement.AddGroup(context.TODO(), request_organization)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -144,7 +145,7 @@ func (h *ApplicationHandler) DisplayGroupModule(w http.ResponseWriter, r *http.R
resp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), request) resp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -185,7 +186,7 @@ func (h *ApplicationHandler) DisplayGroupModule(w http.ResponseWriter, r *http.R
respbeneficiary, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), requestbeneficiary) respbeneficiary, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), requestbeneficiary)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -200,7 +201,7 @@ func (h *ApplicationHandler) DisplayGroupModule(w http.ResponseWriter, r *http.R
_, err = h.services.GRPC.GroupsManagement.Subscribe(context.TODO(), subscribe) _, err = h.services.GRPC.GroupsManagement.Subscribe(context.TODO(), subscribe)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -211,7 +212,7 @@ func (h *ApplicationHandler) DisplayGroupModule(w http.ResponseWriter, r *http.R
accountsBeneficaire, err := h.beneficiaries(r) accountsBeneficaire, err := h.beneficiaries(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }

View File

@@ -14,31 +14,45 @@ import (
groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi" groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi"
groupstorage "git.coopgo.io/coopgo-platform/groups-management/storage" groupstorage "git.coopgo.io/coopgo-platform/groups-management/storage"
mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi" mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
solidarity_service "git.coopgo.io/sbouaram/solidarity-service/servers/grpc/proto"
models "git.coopgo.io/coopgo-apps/parcoursmob/utils/models"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/gorilla/mux" "github.com/gorilla/mux"
geojson "github.com/paulmach/go.geojson" geojson "github.com/paulmach/go.geojson"
"github.com/rs/zerolog/log"
"gitlab.scity.coop/maas/navitia-golang" //"gitlab.scity.coop/maas/navitia-golang"
"gitlab.scity.coop/maas/navitia-golang/types" //"gitlab.scity.coop/maas/navitia-golang/types"
"google.golang.org/protobuf/types/known/emptypb"
"google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/structpb"
"google.golang.org/protobuf/types/known/timestamppb"
) )
var Depart any var Depart any
var Arrive any var Arrive any
var SolidarityData models.SolidarityTransport
func (h *ApplicationHandler) JourneysSearch(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) JourneysSearch(w http.ResponseWriter, r *http.Request) {
r.ParseForm() r.ParseForm()
var ( var (
journeys_results *navitia.JourneyResults //journeys_results *navitia.JourneyResults
carpool_results any carpool_results any
vehicle_results []any vehicle_results []any
solidarity_results models.SolidarityTransport
) )
vehiclech := make(chan []any, 1) vehiclech := make(chan []any, 1)
navitiaCh := make(chan *navitia.JourneyResults, 1) //navitiaCh := make(chan *navitia.JourneyResults, 1)
carpoolCh := make(chan any, 1) carpoolCh := make(chan any, 1)
solidarityCh := make(chan models.SolidarityTransport, 1)
locTime, errTime := time.LoadLocation("Europe/Paris") locTime, errTime := time.LoadLocation("Europe/Paris")
if errTime != nil { if errTime != nil {
log.Panic().Err(errTime).Msg("Tried to load timezone location Europe/Paris. Error. Missing zones in container ?") fmt.Println("Loading timezone location Europe/Paris error : ")
fmt.Println("Missing zones in container ? ")
panic(errTime)
} }
departuredate := r.FormValue("departuredate") departuredate := r.FormValue("departuredate")
@@ -53,9 +67,11 @@ func (h *ApplicationHandler) JourneysSearch(w http.ResponseWriter, r *http.Reque
var ( var (
departuregeo *geojson.Feature departuregeo *geojson.Feature
destinationgeo *geojson.Feature destinationgeo *geojson.Feature
journeys *navitia.JourneyResults //journeys *navitia.JourneyResults
carpoolresults any carpoolresults any
vehicles = []any{} vehicles = []any{}
drivers []any
accounts []any
) )
if departuredate != "" && departuretime != "" && departure != "" && destination != "" { if departuredate != "" && departuretime != "" && departure != "" && destination != "" {
@@ -65,47 +81,47 @@ func (h *ApplicationHandler) JourneysSearch(w http.ResponseWriter, r *http.Reque
departuregeo, err = geojson.UnmarshalFeature([]byte(departure)) departuregeo, err = geojson.UnmarshalFeature([]byte(departure))
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
destinationgeo, err = geojson.UnmarshalFeature([]byte(destination)) destinationgeo, err = geojson.UnmarshalFeature([]byte(destination))
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
journeysRequest := func() { // journeysRequest := func() {
//TODO make it a library // //TODO make it a library
session, _ := navitia.NewCustom( // session, _ := navitia.NewCustom(
h.config.GetString("services.navitia.api_key"), // h.config.GetString("services.navitia.api_key"),
"https://api.navitia.io/v1", // "https://api.navitia.io/v1",
&http.Client{}) // &http.Client{})
if err != nil { // if err != nil {
log.Error().Err(err).Msg("") // fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) // w.WriteHeader(http.StatusBadRequest)
navitiaCh <- nil // navitiaCh <- nil
return // return
} // }
request := navitia.JourneyRequest{ // request := navitia.JourneyRequest{
From: types.ID(fmt.Sprintf("%f", departuregeo.Geometry.Point[0]) + ";" + fmt.Sprintf("%f", departuregeo.Geometry.Point[1])), // From: types.ID(fmt.Sprintf("%f", departuregeo.Geometry.Point[0]) + ";" + fmt.Sprintf("%f", departuregeo.Geometry.Point[1])),
To: types.ID(fmt.Sprintf("%f", destinationgeo.Geometry.Point[0]) + ";" + fmt.Sprintf("%f", destinationgeo.Geometry.Point[1])), // To: types.ID(fmt.Sprintf("%f", destinationgeo.Geometry.Point[0]) + ";" + fmt.Sprintf("%f", destinationgeo.Geometry.Point[1])),
Date: departuredatetime.Add(-2 * time.Hour), // Date: departuredatetime.Add(-2 * time.Hour),
DateIsArrival: false, //TODO // DateIsArrival: false, //TODO
} // }
journeys, err = session.Journeys(context.Background(), request) // journeys, err = session.Journeys(context.Background(), request)
if err != nil { // if err != nil {
log.Error().Err(err).Msg("") // fmt.Println(err)
// w.WriteHeader(http.StatusBadRequest) // // w.WriteHeader(http.StatusBadRequest)
// return // // return
} // }
navitiaCh <- journeys // navitiaCh <- journeys
} // }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//CARPOOL //CARPOOL
carpoolRequest := func() { carpoolRequest := func() {
@@ -114,7 +130,7 @@ func (h *ApplicationHandler) JourneysSearch(w http.ResponseWriter, r *http.Reque
client := &http.Client{} client := &http.Client{}
req, err := http.NewRequest("GET", carpoolrequest, nil) req, err := http.NewRequest("GET", carpoolrequest, nil)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
} }
req.URL.RawQuery = fmt.Sprintf( req.URL.RawQuery = fmt.Sprintf(
@@ -126,13 +142,13 @@ func (h *ApplicationHandler) JourneysSearch(w http.ResponseWriter, r *http.Reque
req.Header.Set("X-API-KEY", "123456") req.Header.Set("X-API-KEY", "123456")
resp, err := client.Do(req) resp, err := client.Do(req)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
} }
if err == nil && resp.StatusCode == http.StatusOK { if err == nil && resp.StatusCode == http.StatusOK {
err = json.NewDecoder(resp.Body).Decode(&carpoolresults) err = json.NewDecoder(resp.Body).Decode(&carpoolresults)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
} }
if carpoolresults == nil { if carpoolresults == nil {
@@ -151,7 +167,7 @@ func (h *ApplicationHandler) JourneysSearch(w http.ResponseWriter, r *http.Reque
} }
vehicleresp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), vehiclerequest) vehicleresp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), vehiclerequest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
} }
for _, vehicle := range vehicleresp.Vehicles { for _, vehicle := range vehicleresp.Vehicles {
@@ -162,15 +178,117 @@ func (h *ApplicationHandler) JourneysSearch(w http.ResponseWriter, r *http.Reque
} }
vehiclech <- vehicles vehiclech <- vehicles
} }
go journeysRequest()
///////////////////////////////////////////////////////////////////////////////////////////////////:::
//solidarity-service
solidarityRequest := func() {
timestamp := timestamppb.New(departuredatetime)
PassengerId := r.FormValue("passenger_id")
driverId := r.FormValue("driver_id")
id := uuid.New().String()
type Booking struct {
bookingData solidarity_service.CreateBookingSolidarityRequest
}
var BookingData Booking
accountsRequest, err := h.services.GRPC.SolidarityService.GetAllPassengers(context.TODO(), &emptypb.Empty{})
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusBadRequest)
}
for _, o := range accountsRequest.Passenger {
accounts = append(accounts, o)
}
cacheid := uuid.NewString()
h.cache.PutWithTTL(cacheid, accounts, 1*time.Hour)
request := solidarity_service.DriverJourneysRequest{
DepartureDate: timestamp,
Departure: &solidarity_service.Feature{
Lat: departuregeo.Geometry.Point[0],
Long: departuregeo.Geometry.Point[1],
Address: departure,
},
}
driversRequest, err := h.services.GRPC.SolidarityService.DriverJourneys(context.TODO(), &request)
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
for _, o := range driversRequest.DriverJourneys {
drivers = append(drivers, o)
}
if r.Method == "POST" {
BookingData.bookingData = solidarity_service.CreateBookingSolidarityRequest {
Booking : &solidarity_service.BookingSolidarityRequest {
Id: id,
DriverId: driverId,
PassengerId: PassengerId,
DepartureAddress: &solidarity_service.Feature{
Lat: departuregeo.Geometry.Point[0],
Long: departuregeo.Geometry.Point[1],
Address: departure,
},
DestinationAddress: &solidarity_service.Feature{
Lat: destinationgeo.Geometry.Point[0],
Long: destinationgeo.Geometry.Point[1],
Address: departure,
},
PickupDate : timestamp,
},
}
BookingData.bookingData.Booking.DriverId = driverId
BookingData.bookingData.Booking.Id = id
booking, err := h.services.GRPC.SolidarityService.CreateBookingSolidarity(context.TODO(), &BookingData.bookingData)
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
booking = booking
SolidarityData = models.SolidarityTransport{
Drivers: drivers,
Beneficiaries: accounts,
}
}
SolidarityData = models.SolidarityTransport{
Drivers: drivers,
Beneficiaries: accounts,
}
solidarityCh <- SolidarityData
}
//go journeysRequest()
go carpoolRequest() go carpoolRequest()
go vehicleRequest() go vehicleRequest()
go solidarityRequest()
carpool_results = <-carpoolCh carpool_results = <-carpoolCh
journeys_results = <-navitiaCh //journeys_results = <-navitiaCh
vehicle_results = <-vehiclech vehicle_results = <-vehiclech
} solidarity_results = <-solidarityCh
h.Renderer.JourneysSearch(w, r, carpool_results, journeys_results, vehicle_results, searched, departuregeo, destinationgeo, departuredate, departuretime) }
h.Renderer.JourneysSearch(w, r, carpool_results, vehicle_results, searched, departuregeo, destinationgeo, departuredate, departuretime, solidarity_results) //journeys_results,
} }
type GroupsModule []groupstorage.Group type GroupsModule []groupstorage.Group
@@ -189,7 +307,7 @@ func (h *ApplicationHandler) GroupsGestion(w http.ResponseWriter, r *http.Reques
resp, err := h.services.GRPC.GroupsManagement.GetGroups(context.TODO(), request) resp, err := h.services.GRPC.GroupsManagement.GetGroups(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -240,7 +358,7 @@ func (h *ApplicationHandler) CreateGroup(w http.ResponseWriter, r *http.Request)
respbeneficiary, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), requestbeneficiary) respbeneficiary, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), requestbeneficiary)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -257,14 +375,14 @@ func (h *ApplicationHandler) CreateGroup(w http.ResponseWriter, r *http.Request)
departurgeo, err = geojson.UnmarshalFeature([]byte(departure)) departurgeo, err = geojson.UnmarshalFeature([]byte(departure))
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
dstinationgeo, err = geojson.UnmarshalFeature([]byte(destination)) dstinationgeo, err = geojson.UnmarshalFeature([]byte(destination))
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@@ -285,14 +403,14 @@ func (h *ApplicationHandler) CreateGroup(w http.ResponseWriter, r *http.Request)
if r.FormValue("name") == "" { if r.FormValue("name") == "" {
log.Error().Msg("invalid name") fmt.Println("invalid name")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
if r.FormValue("number") == "" { if r.FormValue("number") == "" {
log.Error().Msg("invalid number of personne") fmt.Println("invalid number of personne")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@@ -329,7 +447,7 @@ func (h *ApplicationHandler) CreateGroup(w http.ResponseWriter, r *http.Request)
data, err := structpb.NewValue(dataMap) data, err := structpb.NewValue(dataMap)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -344,7 +462,7 @@ func (h *ApplicationHandler) CreateGroup(w http.ResponseWriter, r *http.Request)
_, err = h.services.GRPC.GroupsManagement.AddGroup(context.TODO(), request_organization) _, err = h.services.GRPC.GroupsManagement.AddGroup(context.TODO(), request_organization)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -356,7 +474,7 @@ func (h *ApplicationHandler) CreateGroup(w http.ResponseWriter, r *http.Request)
} }
accountsBeneficaire, err := h.beneficiaries(r) accountsBeneficaire, err := h.beneficiaries(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@@ -375,7 +493,7 @@ func (h *ApplicationHandler) DisplayGroupCovoiturage(w http.ResponseWriter, r *h
resp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), request) resp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -412,7 +530,7 @@ func (h *ApplicationHandler) DisplayGroupCovoiturage(w http.ResponseWriter, r *h
respbeneficiary, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), requestbeneficiary) respbeneficiary, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), requestbeneficiary)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -427,7 +545,7 @@ func (h *ApplicationHandler) DisplayGroupCovoiturage(w http.ResponseWriter, r *h
_, err = h.services.GRPC.GroupsManagement.Subscribe(context.TODO(), subscribe) _, err = h.services.GRPC.GroupsManagement.Subscribe(context.TODO(), subscribe)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -453,7 +571,7 @@ func (h *ApplicationHandler) DisplayGroupCovoiturage(w http.ResponseWriter, r *h
id := uuid.NewString() id := uuid.NewString()
data, err := structpb.NewValue(dataMap) data, err := structpb.NewValue(dataMap)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -469,7 +587,7 @@ func (h *ApplicationHandler) DisplayGroupCovoiturage(w http.ResponseWriter, r *h
_, err = h.services.GRPC.GroupsManagement.AddGroupMember(context.TODO(), request_organizatio) _, err = h.services.GRPC.GroupsManagement.AddGroupMember(context.TODO(), request_organizatio)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -484,7 +602,7 @@ func (h *ApplicationHandler) DisplayGroupCovoiturage(w http.ResponseWriter, r *h
// } // }
// s, err := h.services.GRPC.GroupsManagement.GetGroupsBatchMember(context.TODO(), grp) // s, err := h.services.GRPC.GroupsManagement.GetGroupsBatchMember(context.TODO(), grp)
// if err != nil { // if err != nil {
// log.Error().Err(err).Msg("") // fmt.Println(err)
// w.WriteHeader(http.StatusInternalServerError) // w.WriteHeader(http.StatusInternalServerError)
// return // return
// } // }
@@ -498,10 +616,12 @@ func (h *ApplicationHandler) DisplayGroupCovoiturage(w http.ResponseWriter, r *h
//////////find all groups to store the adresse passenger/////// //////////find all groups to store the adresse passenger///////
///////////try to optimise the code //////////////////////////// ///////////try to optimise the code ////////////////////////////
groups, _ := h.services.GetGroupsMemberMap(resp.Group.ToStorageType().ID) groups, _ := h.services.GetGroupsMemberMap(resp.Group.ToStorageType().ID)
//fmt.Println(groups)
var number string = strconv.Itoa(len(resp.Group.Members)) var number string = strconv.Itoa(len(resp.Group.Members))
/////////////////////
accountsBeneficaire, err := h.beneficiaries(r) accountsBeneficaire, err := h.beneficiaries(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@@ -524,7 +644,7 @@ func (h *ApplicationHandler) UpdateGroupCovoiturage(w http.ResponseWriter, r *ht
resp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), request) resp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -537,7 +657,7 @@ func (h *ApplicationHandler) UpdateGroupCovoiturage(w http.ResponseWriter, r *ht
ressp, err := h.services.GRPC.GroupsManagement.GetGroupMember(context.TODO(), reequest) ressp, err := h.services.GRPC.GroupsManagement.GetGroupMember(context.TODO(), reequest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -547,7 +667,7 @@ func (h *ApplicationHandler) UpdateGroupCovoiturage(w http.ResponseWriter, r *ht
_, errr := h.services.GRPC.GroupsManagement.UnsubscribeMember(context.TODO(), req) _, errr := h.services.GRPC.GroupsManagement.UnsubscribeMember(context.TODO(), req)
if errr != nil { if errr != nil {
log.Error().Err(errr).Msg("Issue in groups management service - InsubscribeMember") fmt.Println(errr)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -564,7 +684,7 @@ func (h *ApplicationHandler) UpdateGroupCovoiturage(w http.ResponseWriter, r *ht
_, err := h.services.GRPC.GroupsManagement.Unsubscribe(context.TODO(), reequest) _, err := h.services.GRPC.GroupsManagement.Unsubscribe(context.TODO(), reequest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }

View File

@@ -12,7 +12,6 @@ import (
groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi" groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi"
mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi" mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/rs/zerolog/log"
"google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/structpb"
) )
@@ -36,7 +35,7 @@ func (h *ApplicationHandler) MemberDisplay(w http.ResponseWriter, r *http.Reques
resp, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), request) resp, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -55,7 +54,7 @@ func (h *ApplicationHandler) MemberDisplay(w http.ResponseWriter, r *http.Reques
res, err := h.services.GRPC.GroupsManagement.GetGroupsBatch(context.TODO(), reques) res, err := h.services.GRPC.GroupsManagement.GetGroupsBatch(context.TODO(), reques)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -78,14 +77,14 @@ func (h *ApplicationHandler) MemberUpdate(w http.ResponseWriter, r *http.Request
dataMap, err := parseUserForm(r) dataMap, err := parseUserForm(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
data, err := structpb.NewValue(dataMap) data, err := structpb.NewValue(dataMap)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -101,7 +100,7 @@ func (h *ApplicationHandler) MemberUpdate(w http.ResponseWriter, r *http.Request
resp, err := h.services.GRPC.MobilityAccounts.UpdateData(context.TODO(), request) resp, err := h.services.GRPC.MobilityAccounts.UpdateData(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -117,7 +116,7 @@ func (h *ApplicationHandler) MemberUpdate(w http.ResponseWriter, r *http.Request
resp, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), request) resp, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -161,7 +160,7 @@ func (h *ApplicationHandler) MembersList(w http.ResponseWriter, r *http.Request)
accounts, err := h.services.GetAccounts() accounts, err := h.services.GetAccounts()
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -175,7 +174,7 @@ func (h *ApplicationHandler) MembersList(w http.ResponseWriter, r *http.Request)
resp, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), request) resp, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -196,7 +195,7 @@ func (h *ApplicationHandler) MembersList(w http.ResponseWriter, r *http.Request)
res, err := h.services.GRPC.GroupsManagement.GetGroupsBatch(context.TODO(), reques) res, err := h.services.GRPC.GroupsManagement.GetGroupsBatch(context.TODO(), reques)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }

View File

@@ -0,0 +1,260 @@
package application
import (
"context"
"encoding/json"
"fmt"
"net/http"
"strconv"
"time"
mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
solidarity_service "git.coopgo.io/sbouaram/solidarity-service/servers/grpc/proto"
"github.com/google/uuid"
"github.com/gorilla/mux"
geojson "github.com/paulmach/go.geojson"
"google.golang.org/protobuf/types/known/emptypb"
"google.golang.org/protobuf/types/known/structpb"
"google.golang.org/protobuf/types/known/timestamppb"
)
var BookingData Booking
type Booking struct {
bookingData solidarity_service.CreateBookingSolidarityRequest
}
//List les conducteurs disponibles + Créer une réservation
func (h *ApplicationHandler) DriversJourney(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" && r.FormValue("date") != ""{
DepartureAddress := r.FormValue("departure");
DestinationAddress := r.FormValue("destination");
PickupDate := r.FormValue("date");
layout := "2006-01-02T15:04"
dateParsed, err := time.Parse(layout, PickupDate)
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
var (
departuregeo *geojson.Feature
destinationgeo *geojson.Feature
)
timestamp := timestamppb.New(dateParsed)
if PickupDate != "" && DepartureAddress != "" && DestinationAddress != "" {
// searched = true
var err error
departuregeo, err = geojson.UnmarshalFeature([]byte(DepartureAddress))
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusBadRequest)
return
}
destinationgeo, err = geojson.UnmarshalFeature([]byte(DestinationAddress))
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusBadRequest)
return
}
}
request := solidarity_service.DriverJourneysRequest{
DepartureDate: timestamp,
Departure: &solidarity_service.Feature{
Lat: departuregeo.Geometry.Point[0],
Long: departuregeo.Geometry.Point[1],
Address: DepartureAddress,
},
}
drivers, err := h.services.GRPC.SolidarityService.DriverJourneys(context.TODO(), &request)
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
BookingData.bookingData = solidarity_service.CreateBookingSolidarityRequest {
Booking : &solidarity_service.BookingSolidarityRequest {
DepartureAddress: &solidarity_service.Feature{
Lat: departuregeo.Geometry.Point[0],
Long: departuregeo.Geometry.Point[1],
Address: DepartureAddress,
},
DestinationAddress: &solidarity_service.Feature{
Lat: destinationgeo.Geometry.Point[0],
Long: destinationgeo.Geometry.Point[1],
Address: DepartureAddress,
},
PickupDate : timestamp,
},
}
h.Renderer.SolidarityServiceListAvailableDrivers(w, r, drivers, &BookingData.bookingData)
} else if r.Method == "POST" {
vars := mux.Vars(r)
beneficiaryID := vars["id"]
driverId := r.FormValue("driver_id")
id := uuid.New().String()
BookingData.bookingData.Booking.DriverId = driverId
BookingData.bookingData.Booking.PassengerId= beneficiaryID
BookingData.bookingData.Booking.Id = id
booking, err := h.services.GRPC.SolidarityService.CreateBookingSolidarity(context.TODO(), &BookingData.bookingData)
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
h.Renderer.SolidarityServiceBooking(w, r, booking)
}else {
h.Renderer.CreateBookingHome(w, r)
}
}
func (h *ApplicationHandler) SolidarityService(w http.ResponseWriter, r *http.Request) {
accounts, err := h.services.GRPC.SolidarityService.GetAllPassengers(context.TODO(), &emptypb.Empty{})
drivers, err := h.services.GRPC.SolidarityService.GetAllDrivers(context.TODO(), &emptypb.Empty{})
bookings, err := h.services.GRPC.SolidarityService.GetAllBookingsSolidarity(context.TODO(), &emptypb.Empty{})
parcourmobAccounts, err := h.beneficiaries(r)
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusBadRequest)
}
cacheid := uuid.NewString()
h.cache.PutWithTTL(cacheid, accounts, 1*time.Hour)
h.Renderer.SolidarityService(w, r, accounts, drivers, parcourmobAccounts, bookings ,cacheid)
}
func (h *ApplicationHandler) CreateDriver(w http.ResponseWriter, r *http.Request) {
if r.Method== "POST" {
dataMap, err := parseBeneficiariesForm(r)
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusBadRequest)
return
}
data, err := structpb.NewValue(dataMap)
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
userRequest := &mobilityaccounts.RegisterRequest{
Account: &mobilityaccounts.Account{
Namespace: "silvermobi",
Data: data.GetStructValue(),
},
}
resp, err := h.services.GRPC.MobilityAccounts.Register(context.TODO(), userRequest)
address := resp.Account.Data.GetFields()["address"].GetStructValue();
geometry := address.GetFields()["geometry"].GetStructValue();
coordinates:= geometry.GetFields()["coordinates"].GetListValue();
if len(coordinates.GetValues()) < 2{
fmt.Printf("Erreur lors de la récupération des coordonées : %v", err)
return
}
radiusStr := r.PostFormValue("radius")
radius, err := strconv.Atoi(radiusStr)
if err != nil {
fmt.Printf("Erreur lors de la conversion de radius : %v", err)
radius = 0
}
availabilitiesJSON := r.PostFormValue("availabilities")
var availabilities []solidarity_service.RegularAvailabilitySlot
jsonerr:= json.Unmarshal([]byte(availabilitiesJSON), &availabilities)
if jsonerr != nil {
fmt.Printf("Erreur lors de la conversion de availabilitiesJSON : %v", err)
}
driverRequest := solidarity_service.DriverRegularAvailabilities {
DriverRequest : &solidarity_service.DriverRequest {
DriverAddress: &solidarity_service.Feature{
Lat: coordinates.GetValues()[0].GetNumberValue(),
Long: coordinates.GetValues()[1].GetNumberValue(),
Address: "********",
},
DriverRadius: int32(radius),
Driver: &solidarity_service.User{
Id: resp.Account.Id,
Alias: r.PostFormValue("alias"),
FirstName: r.PostFormValue("first_name"),
LastName: r.PostFormValue("last_name"),
Grade: 1,
Picture: "h.png",
Gender: r.PostFormValue("gender"),
VerifiedIdentity: true, ///////// a Modifier !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
},
Preferences: &solidarity_service.Preferences{
Smoking: false,
Animals: false,
Music: false,
IsTalker: false,
LuggageSize: 100,
},
Car: &solidarity_service.Car{
Model: r.PostFormValue("model"),
Brand: r.PostFormValue("brand"),
},
},
DriverAvailabilities: []*solidarity_service.RegularAvailabilitySlot{},
}
for _, slot := range availabilities{
driverRequest.DriverAvailabilities = append( driverRequest.DriverAvailabilities, &solidarity_service.RegularAvailabilitySlot{
DayOfWeek: slot.DayOfWeek,
StartTime: slot.StartTime,
EndTime: slot.EndTime,
})
}
driverResponse, err := h.services.GRPC.SolidarityService.SetDriverRegularAvailabilities(context.TODO(), &driverRequest)
if err != nil {
fmt.Printf("erreur lors de la création du conducteur: ", err)
radius = 0
}
fmt.Println("driver: ", driverResponse)
}
h.Renderer.CreateDriver(w, r)
}

View File

@@ -1,11 +1,10 @@
package application package application
import ( import (
"fmt"
"net/http" "net/http"
"git.coopgo.io/coopgo-apps/parcoursmob/utils/identification" "git.coopgo.io/coopgo-apps/parcoursmob/utils/identification"
"git.coopgo.io/coopgo-platform/emailing"
"github.com/rs/zerolog/log"
) )
type Message struct { type Message struct {
@@ -16,29 +15,23 @@ func (h *ApplicationHandler) SupportSend(w http.ResponseWriter, r *http.Request)
c := r.Context().Value(identification.ClaimsKey) c := r.Context().Value(identification.ClaimsKey)
if c == nil { if c == nil {
log.Error().Msg("no current user claims") fmt.Println("no current user claims")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
current_user_claims := c.(map[string]any) current_user_claims := c.(map[string]any)
comment := r.PostFormValue(("comment")) comment := r.PostFormValue(("comment"))
if r.Method == "POST" { if r.Method == "POST" {
user_email := current_user_claims["email"].(string)
data := map[string]any{ data := map[string]any{
"key": comment, "key": comment,
"user": user_email, "user": current_user_claims["email"],
} }
log.Debug().Str("user_email", user_email).Msg("Sending message") if err := h.emailing.Send("support.request", "support@parcoursmob.fr", data); err != nil {
fmt.Println(err)
if err := h.emailing.Send("support.request", "support@parcoursmob.fr", data, emailing.WithReplyTo(user_email), emailing.WithTLSOpportunistic()); err != nil {
log.Error().Err(err).Msg("error sending email")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return
} }
http.Redirect(w, r, "/app/", http.StatusFound) http.Redirect(w, r, "/app/", http.StatusFound)
return return

View File

@@ -11,18 +11,15 @@ import (
"git.coopgo.io/coopgo-apps/parcoursmob/utils/identification" "git.coopgo.io/coopgo-apps/parcoursmob/utils/identification"
"git.coopgo.io/coopgo-apps/parcoursmob/utils/sorting" "git.coopgo.io/coopgo-apps/parcoursmob/utils/sorting"
filestorage "git.coopgo.io/coopgo-apps/parcoursmob/utils/storage" filestorage "git.coopgo.io/coopgo-apps/parcoursmob/utils/storage"
diags "git.coopgo.io/coopgo-platform/diags/grpcapi"
diagsstorage "git.coopgo.io/coopgo-platform/diags/storage"
fleets "git.coopgo.io/coopgo-platform/fleets/grpcapi" fleets "git.coopgo.io/coopgo-platform/fleets/grpcapi"
fleetsstorage "git.coopgo.io/coopgo-platform/fleets/storage" fleetsstorage "git.coopgo.io/coopgo-platform/fleets/storage"
groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi" groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi"
"git.coopgo.io/coopgo-platform/groups-management/storage" "git.coopgo.io/coopgo-platform/groups-management/storage"
mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi" mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage" mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage"
"github.com/coreos/go-oidc/v3/oidc" "github.com/coreos/go-oidc"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/rs/zerolog/log"
"google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/structpb"
"google.golang.org/protobuf/types/known/timestamppb" "google.golang.org/protobuf/types/known/timestamppb"
) )
@@ -34,7 +31,7 @@ func (h *ApplicationHandler) VehiclesManagementOverview(w http.ResponseWriter, r
} }
resp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), request) resp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
} }
@@ -63,11 +60,9 @@ func (h *ApplicationHandler) VehiclesManagementOverview(w http.ResponseWriter, r
} }
} }
driversMap, _ := h.services.GetBeneficiariesMap()
sort.Sort(sorting.VehiclesByLicencePlate(vehicles)) sort.Sort(sorting.VehiclesByLicencePlate(vehicles))
sort.Sort(sorting.BookingsByStartdate(bookings)) sort.Sort(sorting.BookingsByStartdate(bookings))
h.Renderer.VehiclesManagementOverview(w, r, vehicles, vehicles_map, driversMap, bookings) h.Renderer.VehiclesManagementOverview(w, r, vehicles, vehicles_map, bookings)
} }
func (h *ApplicationHandler) VehiclesManagementBookingsList(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) VehiclesManagementBookingsList(w http.ResponseWriter, r *http.Request) {
@@ -77,7 +72,7 @@ func (h *ApplicationHandler) VehiclesManagementBookingsList(w http.ResponseWrite
} }
resp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), request) resp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
} }
@@ -102,9 +97,7 @@ func (h *ApplicationHandler) VehiclesManagementBookingsList(w http.ResponseWrite
cacheid := uuid.NewString() cacheid := uuid.NewString()
h.cache.PutWithTTL(cacheid, bookings, 1*time.Hour) h.cache.PutWithTTL(cacheid, bookings, 1*time.Hour)
driversMap, _ := h.services.GetBeneficiariesMap() h.Renderer.VehiclesManagementBookingsList(w, r, vehicles_map, bookings, cacheid)
h.Renderer.VehiclesManagementBookingsList(w, r, vehicles_map, driversMap, bookings, cacheid)
} }
func (h *ApplicationHandler) VehiclesFleetAdd(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) VehiclesFleetAdd(w http.ResponseWriter, r *http.Request) {
@@ -118,7 +111,7 @@ func (h *ApplicationHandler) VehiclesFleetAdd(w http.ResponseWriter, r *http.Req
group := g.(storage.Group) group := g.(storage.Group)
if err := r.ParseForm(); err != nil { if err := r.ParseForm(); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@@ -131,7 +124,7 @@ func (h *ApplicationHandler) VehiclesFleetAdd(w http.ResponseWriter, r *http.Req
var address map[string]any var address map[string]any
err := json.Unmarshal([]byte(v), &address) err := json.Unmarshal([]byte(v), &address)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -144,15 +137,13 @@ func (h *ApplicationHandler) VehiclesFleetAdd(w http.ResponseWriter, r *http.Req
dataMap["licence_plate"] = v dataMap["licence_plate"] = v
} }
if v := r.FormValue("automatic"); v != "" { if v := r.FormValue("automatic"); v != "" {
fmt.Println(v)
dataMap["automatic"] = (v == "on") dataMap["automatic"] = (v == "on")
} }
if v := r.FormValue("kilometers"); v != "" {
dataMap["kilometers"] = v
}
data, err := structpb.NewValue(dataMap) data, err := structpb.NewValue(dataMap)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -172,7 +163,7 @@ func (h *ApplicationHandler) VehiclesFleetAdd(w http.ResponseWriter, r *http.Req
_, err = h.services.GRPC.Fleets.AddVehicle(context.TODO(), request) _, err = h.services.GRPC.Fleets.AddVehicle(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -195,37 +186,12 @@ func (h *ApplicationHandler) VehiclesFleetDisplay(w http.ResponseWriter, r *http
resp, err := h.services.GRPC.Fleets.GetVehicle(context.TODO(), request) resp, err := h.services.GRPC.Fleets.GetVehicle(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
diag := []diagsstorage.Diag{} h.Renderer.VehiclesFleetDisplay(w, r, resp.Vehicle.ToStorageType())
diagsrequest := &diags.GetDiagsRequest{
Namespaces: []string{"parcoursmob_vehicles"},
}
diagsresp, err := h.services.GRPC.Diags.GetDiags(context.TODO(), diagsrequest)
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
for _, d := range diagsresp.Diags {
diagData := d.Data.AsMap()
if vehicle, ok := diagData["vehicle"].(string); ok && vehicle == vehicleid {
diag = append(diag, d.ToStorageType())
}
}
diagsAny := make([]any, len(diag))
for i, d := range diag {
diagsAny[i] = d
}
h.Renderer.VehiclesFleetDisplay(w, r, resp.Vehicle.ToStorageType(), diagsAny)
} }
func filterVehicle(r *http.Request, v *fleets.Vehicle) bool { func filterVehicle(r *http.Request, v *fleets.Vehicle) bool {
@@ -251,7 +217,7 @@ func (h ApplicationHandler) VehicleManagementBookingDisplay(w http.ResponseWrite
booking, err := h.services.GetBooking(bookingid) booking, err := h.services.GetBooking(bookingid)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -299,7 +265,7 @@ func (h ApplicationHandler) VehicleManagementBookingDisplay(w http.ResponseWrite
_, err := h.services.GRPC.Fleets.UpdateBooking(context.TODO(), request) _, err := h.services.GRPC.Fleets.UpdateBooking(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -316,7 +282,7 @@ func (h ApplicationHandler) VehicleManagementBookingDisplay(w http.ResponseWrite
beneficiaryresp, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), beneficiaryrequest) beneficiaryresp, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), beneficiaryrequest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -330,7 +296,7 @@ func (h ApplicationHandler) VehicleManagementBookingDisplay(w http.ResponseWrite
groupresp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), grouprequest) groupresp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), grouprequest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -345,7 +311,7 @@ func (h ApplicationHandler) VehicleManagementBookingDisplay(w http.ResponseWrite
alternativeresp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), alternativerequest) alternativeresp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), alternativerequest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
} }
alternatives := []any{} alternatives := []any{}
@@ -357,32 +323,7 @@ func (h ApplicationHandler) VehicleManagementBookingDisplay(w http.ResponseWrite
documents := h.filestorage.List(filestorage.PREFIX_BOOKINGS + "/" + bookingid) documents := h.filestorage.List(filestorage.PREFIX_BOOKINGS + "/" + bookingid)
file_types_map := h.config.GetStringMapString("storage.files.file_types") file_types_map := h.config.GetStringMapString("storage.files.file_types")
diag := []diagsstorage.Diag{} h.Renderer.VehicleManagementBookingDisplay(w, r, booking, booking.Vehicle, beneficiary, groupresp.Group.ToStorageType(), documents, file_types_map, alternatives)
diagsrequest := &diags.GetDiagsRequest{
Namespaces: []string{"parcoursmob_bookings"},
}
diagsresp, err := h.services.GRPC.Diags.GetDiags(context.TODO(), diagsrequest)
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
for _, d := range diagsresp.Diags {
diagData := d.Data.AsMap()
if booking, ok := diagData["booking"].(string); ok && booking == bookingid {
diag = append(diag, d.ToStorageType())
}
}
diagsAny := make([]any, len(diag))
for i, d := range diag {
diagsAny[i] = d
}
h.Renderer.VehicleManagementBookingDisplay(w, r, booking, booking.Vehicle, beneficiary, groupresp.Group.ToStorageType(), documents, file_types_map, alternatives, diagsAny)
} }
func (h ApplicationHandler) VehicleManagementBookingChangeVehicle(w http.ResponseWriter, r *http.Request) { func (h ApplicationHandler) VehicleManagementBookingChangeVehicle(w http.ResponseWriter, r *http.Request) {
@@ -395,7 +336,7 @@ func (h ApplicationHandler) VehicleManagementBookingChangeVehicle(w http.Respons
booking, err := h.services.GetBooking(bookingid) booking, err := h.services.GetBooking(bookingid)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -410,7 +351,7 @@ func (h ApplicationHandler) VehicleManagementBookingChangeVehicle(w http.Respons
_, err = h.services.GRPC.Fleets.UpdateBooking(context.TODO(), request) _, err = h.services.GRPC.Fleets.UpdateBooking(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -422,7 +363,7 @@ func (h ApplicationHandler) VehicleManagementBookingChangeVehicle(w http.Respons
func (h ApplicationHandler) VehiclesFleetMakeUnavailable(w http.ResponseWriter, r *http.Request) { // Get Group func (h ApplicationHandler) VehiclesFleetMakeUnavailable(w http.ResponseWriter, r *http.Request) { // Get Group
g := r.Context().Value(identification.GroupKey) g := r.Context().Value(identification.GroupKey)
if g == nil { if g == nil {
log.Error().Msg("no current group") fmt.Println("no current group")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -431,7 +372,7 @@ func (h ApplicationHandler) VehiclesFleetMakeUnavailable(w http.ResponseWriter,
// Get current user ID // Get current user ID
u := r.Context().Value(identification.IdtokenKey) u := r.Context().Value(identification.IdtokenKey)
if u == nil { if u == nil {
log.Error().Msg("no current user") fmt.Println("no current user")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -440,7 +381,7 @@ func (h ApplicationHandler) VehiclesFleetMakeUnavailable(w http.ResponseWriter,
// Get current user claims // Get current user claims
c := r.Context().Value(identification.ClaimsKey) c := r.Context().Value(identification.ClaimsKey)
if c == nil { if c == nil {
log.Error().Msg("no current user claims") fmt.Println("no current user claims")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -475,7 +416,7 @@ func (h ApplicationHandler) VehiclesFleetMakeUnavailable(w http.ResponseWriter,
datapb, err := structpb.NewStruct(data) datapb, err := structpb.NewStruct(data)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -494,7 +435,7 @@ func (h ApplicationHandler) VehiclesFleetMakeUnavailable(w http.ResponseWriter,
_, err = h.services.GRPC.Fleets.CreateBooking(context.TODO(), request) _, err = h.services.GRPC.Fleets.CreateBooking(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@@ -502,6 +443,30 @@ func (h ApplicationHandler) VehiclesFleetMakeUnavailable(w http.ResponseWriter,
http.Redirect(w, r, fmt.Sprintf("/app/vehicles-management/fleet/%s", vehicleid), http.StatusFound) http.Redirect(w, r, fmt.Sprintf("/app/vehicles-management/fleet/%s", vehicleid), http.StatusFound)
} }
// func (h *ApplicationHandler) UnbookingVehicles(w http.ResponseWriter, r *http.Request) {
// request := &fleets.GetVehiclesRequest{
// Namespaces: []string{"parcoursmob"},
// }
// resp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), request)
// if err != nil {
// fmt.Println(err)
// w.WriteHeader(http.StatusInternalServerError)
// }
// vehicles := []fleetsstorage.Vehicle{}
// fmt.Println(resp.Vehicles[0].Bookings)
// for i, vehicle := range resp.Vehicles {
// if len(resp.Vehicles[i].Bookings) == 0 {
// v := vehicle.ToStorageType()
// vehicles = append(vehicles, v)
// }
// }
// // if len(resp.Vehicle.ToStorageType().Bookings) == 0 {
// // h.Renderer.UnbookingVehicles(w, r, resp.Vehicle.ToStorageType())
// // }
// // fmt.Println(resp.Vehicle.ToStorageType().Bookings)
// fmt.Println(vehicles)
// h.Renderer.UnbookingVehicles(w, r, vehicles)
// }
func (h *ApplicationHandler) UnbookingVehicle(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) UnbookingVehicle(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r) vars := mux.Vars(r)
bookingid := vars["bookingid"] bookingid := vars["bookingid"]
@@ -512,7 +477,7 @@ func (h *ApplicationHandler) UnbookingVehicle(w http.ResponseWriter, r *http.Req
resp, err := h.services.GRPC.Fleets.GetBooking(context.TODO(), request) resp, err := h.services.GRPC.Fleets.GetBooking(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -522,14 +487,14 @@ func (h *ApplicationHandler) UnbookingVehicle(w http.ResponseWriter, r *http.Req
current_group, err := h.currentGroup(r) current_group, err := h.currentGroup(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
current_user_token, current_user_claims, err := h.currentUser(r) current_user_token, current_user_claims, err := h.currentUser(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -569,7 +534,7 @@ func (h *ApplicationHandler) UnbookingVehicle(w http.ResponseWriter, r *http.Req
datapb, err := structpb.NewStruct(data) datapb, err := structpb.NewStruct(data)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -592,7 +557,7 @@ func (h *ApplicationHandler) UnbookingVehicle(w http.ResponseWriter, r *http.Req
_, err := h.services.GRPC.Fleets.UpdateBooking(context.TODO(), request) _, err := h.services.GRPC.Fleets.UpdateBooking(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -614,7 +579,7 @@ func (h *ApplicationHandler) VehiclesFleetUpdate(w http.ResponseWriter, r *http.
resp, err := h.services.GRPC.Fleets.GetVehicle(context.TODO(), request) resp, err := h.services.GRPC.Fleets.GetVehicle(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -625,7 +590,7 @@ func (h *ApplicationHandler) VehiclesFleetUpdate(w http.ResponseWriter, r *http.
if r.Method == "POST" { if r.Method == "POST" {
fmt.Print(r.FormValue("vehicle_type")) fmt.Print(r.FormValue("vehicle_type"))
if err := r.ParseForm(); err != nil { if err := r.ParseForm(); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@@ -637,7 +602,7 @@ func (h *ApplicationHandler) VehiclesFleetUpdate(w http.ResponseWriter, r *http.
var address map[string]any var address map[string]any
err := json.Unmarshal([]byte(v), &address) err := json.Unmarshal([]byte(v), &address)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -649,16 +614,14 @@ func (h *ApplicationHandler) VehiclesFleetUpdate(w http.ResponseWriter, r *http.
if v := r.FormValue("licence_plate"); v != "" { if v := r.FormValue("licence_plate"); v != "" {
dataMap["licence_plate"] = v dataMap["licence_plate"] = v
} }
if v := r.FormValue("kilometers"); v != "" {
dataMap["kilometers"] = v
}
if v := r.FormValue("automatic"); v != "" { if v := r.FormValue("automatic"); v != "" {
fmt.Println(v)
dataMap["automatic"] = (v == "on") dataMap["automatic"] = (v == "on")
} }
data, err := structpb.NewValue(dataMap) data, err := structpb.NewValue(dataMap)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -676,7 +639,7 @@ func (h *ApplicationHandler) VehiclesFleetUpdate(w http.ResponseWriter, r *http.
resp, err := h.services.GRPC.Fleets.UpdateVehicle(context.TODO(), request) resp, err := h.services.GRPC.Fleets.UpdateVehicle(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }

View File

@@ -12,8 +12,6 @@ import (
"git.coopgo.io/coopgo-apps/parcoursmob/utils/identification" "git.coopgo.io/coopgo-apps/parcoursmob/utils/identification"
"git.coopgo.io/coopgo-apps/parcoursmob/utils/sorting" "git.coopgo.io/coopgo-apps/parcoursmob/utils/sorting"
filestorage "git.coopgo.io/coopgo-apps/parcoursmob/utils/storage" filestorage "git.coopgo.io/coopgo-apps/parcoursmob/utils/storage"
diags "git.coopgo.io/coopgo-platform/diags/grpcapi"
diagsstorage "git.coopgo.io/coopgo-platform/diags/storage"
fleets "git.coopgo.io/coopgo-platform/fleets/grpcapi" fleets "git.coopgo.io/coopgo-platform/fleets/grpcapi"
"git.coopgo.io/coopgo-platform/fleets/storage" "git.coopgo.io/coopgo-platform/fleets/storage"
groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi" groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi"
@@ -22,13 +20,13 @@ import (
mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage" mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/rs/zerolog/log"
"google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/structpb"
"google.golang.org/protobuf/types/known/timestamppb" "google.golang.org/protobuf/types/known/timestamppb"
) )
func (h ApplicationHandler) VehiclesSearch(w http.ResponseWriter, r *http.Request) { func (h ApplicationHandler) VehiclesSearch(w http.ResponseWriter, r *http.Request) {
r.ParseForm() r.ParseForm()
fmt.Println("invoked")
var beneficiary mobilityaccountsstorage.Account var beneficiary mobilityaccountsstorage.Account
beneficiarydocuments := []filestorage.FileInfo{} beneficiarydocuments := []filestorage.FileInfo{}
@@ -44,7 +42,7 @@ func (h ApplicationHandler) VehiclesSearch(w http.ResponseWriter, r *http.Reques
administrators := []string{} administrators := []string{}
if r.FormValue("beneficiaryid") != "" && startdate.After(time.Now()) && enddate.After(startdate) { if r.FormValue("beneficiaryid") != "" {
// Handler form // Handler form
searched = true searched = true
@@ -54,7 +52,7 @@ func (h ApplicationHandler) VehiclesSearch(w http.ResponseWriter, r *http.Reques
respbeneficiary, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), requestbeneficiary) respbeneficiary, err := h.services.GRPC.MobilityAccounts.GetAccount(context.TODO(), requestbeneficiary)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -73,7 +71,7 @@ func (h ApplicationHandler) VehiclesSearch(w http.ResponseWriter, r *http.Reques
resp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), request) resp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
} }
@@ -81,7 +79,9 @@ func (h ApplicationHandler) VehiclesSearch(w http.ResponseWriter, r *http.Reques
v := vehicle.ToStorageType() v := vehicle.ToStorageType()
if r.FormValue("type") == "Voiture" && automatic { if r.FormValue("type") == "Voiture" && automatic {
fmt.Println(v.Data["automatic"])
if auto, ok := v.Data["automatic"].(bool); !ok || !auto { if auto, ok := v.Data["automatic"].(bool); !ok || !auto {
fmt.Println(v.Data["automatic"])
continue continue
} }
} }
@@ -105,7 +105,7 @@ func (h ApplicationHandler) VehiclesSearch(w http.ResponseWriter, r *http.Reques
accounts, err := h.beneficiaries(r) accounts, err := h.beneficiaries(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@@ -116,7 +116,7 @@ func (h ApplicationHandler) VehiclesSearch(w http.ResponseWriter, r *http.Reques
Groupids: administrators, Groupids: administrators,
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -136,16 +136,17 @@ func (h ApplicationHandler) VehiclesSearch(w http.ResponseWriter, r *http.Reques
} }
func (h ApplicationHandler) Book(w http.ResponseWriter, r *http.Request) { func (h ApplicationHandler) Book(w http.ResponseWriter, r *http.Request) {
fmt.Println("Book")
current_group, err := h.currentGroup(r) current_group, err := h.currentGroup(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
current_user_token, current_user_claims, err := h.currentUser(r) current_user_token, current_user_claims, err := h.currentUser(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -158,7 +159,7 @@ func (h ApplicationHandler) Book(w http.ResponseWriter, r *http.Request) {
Vehicleid: vehicleid, Vehicleid: vehicleid,
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte("Vehicle not found")) w.Write([]byte("Vehicle not found"))
w.Write([]byte(err.Error())) w.Write([]byte(err.Error()))
@@ -187,7 +188,7 @@ func (h ApplicationHandler) Book(w http.ResponseWriter, r *http.Request) {
} }
datapb, err := structpb.NewStruct(data) datapb, err := structpb.NewStruct(data)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -212,7 +213,7 @@ func (h ApplicationHandler) Book(w http.ResponseWriter, r *http.Request) {
if existing_file == "" { if existing_file == "" {
file, header, err := r.FormFile("doc-" + v) file, header, err := r.FormFile("doc-" + v)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
w.Write([]byte("Document manquant : " + v)) w.Write([]byte("Document manquant : " + v))
return return
@@ -227,7 +228,7 @@ func (h ApplicationHandler) Book(w http.ResponseWriter, r *http.Request) {
} }
if err := h.filestorage.Put(file, filestorage.PREFIX_BOOKINGS, fmt.Sprintf("%s/%s_%s", booking.Id, fileid, header.Filename), header.Size, metadata); err != nil { if err := h.filestorage.Put(file, filestorage.PREFIX_BOOKINGS, fmt.Sprintf("%s/%s_%s", booking.Id, fileid, header.Filename), header.Size, metadata); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -235,7 +236,7 @@ func (h ApplicationHandler) Book(w http.ResponseWriter, r *http.Request) {
path := strings.Split(existing_file, "/") path := strings.Split(existing_file, "/")
if err := h.filestorage.Copy(existing_file, fmt.Sprintf("%s/%s/%s", filestorage.PREFIX_BOOKINGS, booking.Id, path[len(path)-1])); err != nil { if err := h.filestorage.Copy(existing_file, fmt.Sprintf("%s/%s/%s", filestorage.PREFIX_BOOKINGS, booking.Id, path[len(path)-1])); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -244,15 +245,15 @@ func (h ApplicationHandler) Book(w http.ResponseWriter, r *http.Request) {
_, err = h.services.GRPC.Fleets.CreateBooking(context.TODO(), request) _, err = h.services.GRPC.Fleets.CreateBooking(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
// NOTIFY GROUP MEMBERS //NOTIFY GROUP MEMBERS
members, _, err := h.groupmembers(vehicle.Vehicle.Administrators[0]) members, _, err := h.groupmembers(vehicle.Vehicle.Administrators[0])
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
} else { } else {
for _, m := range members { for _, m := range members {
if email, ok := m.Data["email"].(string); ok { if email, ok := m.Data["email"].(string); ok {
@@ -264,6 +265,7 @@ func (h ApplicationHandler) Book(w http.ResponseWriter, r *http.Request) {
} }
http.Redirect(w, r, fmt.Sprintf("/app/vehicles/bookings/%s", booking.Id), http.StatusFound) http.Redirect(w, r, fmt.Sprintf("/app/vehicles/bookings/%s", booking.Id), http.StatusFound)
} }
func (h ApplicationHandler) VehicleBookingDisplay(w http.ResponseWriter, r *http.Request) { func (h ApplicationHandler) VehicleBookingDisplay(w http.ResponseWriter, r *http.Request) {
@@ -275,7 +277,7 @@ func (h ApplicationHandler) VehicleBookingDisplay(w http.ResponseWriter, r *http
} }
resp, err := h.services.GRPC.Fleets.GetBooking(context.TODO(), request) resp, err := h.services.GRPC.Fleets.GetBooking(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -299,7 +301,7 @@ func (h ApplicationHandler) VehicleBookingDisplay(w http.ResponseWriter, r *http
groupresp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), grouprequest) groupresp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), grouprequest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -307,35 +309,11 @@ func (h ApplicationHandler) VehicleBookingDisplay(w http.ResponseWriter, r *http
documents := h.filestorage.List(filestorage.PREFIX_BOOKINGS + "/" + bookingid) documents := h.filestorage.List(filestorage.PREFIX_BOOKINGS + "/" + bookingid)
file_types_map := h.config.GetStringMapString("storage.files.file_types") file_types_map := h.config.GetStringMapString("storage.files.file_types")
diag := []diagsstorage.Diag{} h.Renderer.VehicleBookingDisplay(w, r, booking, booking.Vehicle, beneficiaryresp.Account.ToStorageType(), groupresp.Group.ToStorageType(), documents, file_types_map)
diagsrequest := &diags.GetDiagsRequest{
Namespaces: []string{"parcoursmob_bookings"},
}
diagsresp, err := h.services.GRPC.Diags.GetDiags(context.TODO(), diagsrequest)
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
for _, d := range diagsresp.Diags {
diagData := d.Data.AsMap()
if booking, ok := diagData["booking"].(string); ok && booking == bookingid {
diag = append(diag, d.ToStorageType())
}
}
diagsAny := make([]any, len(diag))
for i, d := range diag {
diagsAny[i] = d
}
h.Renderer.VehicleBookingDisplay(w, r, booking, booking.Vehicle, beneficiaryresp.Account.ToStorageType(), groupresp.Group.ToStorageType(), documents, file_types_map, diagsAny)
} }
func (h ApplicationHandler) VehiclesBookingsList(w http.ResponseWriter, r *http.Request) { func (h ApplicationHandler) VehiclesBookingsList(w http.ResponseWriter, r *http.Request) {
g := r.Context().Value(identification.GroupKey) g := r.Context().Value(identification.GroupKey)
if g == nil { if g == nil {
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
@@ -347,7 +325,7 @@ func (h ApplicationHandler) VehiclesBookingsList(w http.ResponseWriter, r *http.
request := &fleets.GetBookingsRequest{} request := &fleets.GetBookingsRequest{}
resp, err := h.services.GRPC.Fleets.GetBookings(context.TODO(), request) resp, err := h.services.GRPC.Fleets.GetBookings(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
return return
} }
@@ -371,6 +349,9 @@ func (h ApplicationHandler) VehiclesBookingsList(w http.ResponseWriter, r *http.
vehicles, _ := h.services.GetVehiclesMap() vehicles, _ := h.services.GetVehiclesMap()
groups, _ := h.services.GetGroupsMap() groups, _ := h.services.GetGroupsMap()
// fmt.Println("bookings : ", bookings)
// fmt.Println("vehicles : ", vehicles)
// fmt.Println("groups : ", groups)
h.Renderer.VehicleBookingsList(w, r, bookings, vehicles, groups) h.Renderer.VehicleBookingsList(w, r, bookings, vehicles, groups)
} }
@@ -379,21 +360,22 @@ func (h *ApplicationHandler) BookingDocumentDownload(w http.ResponseWriter, r *h
bookingid := vars["bookingid"] bookingid := vars["bookingid"]
document := vars["document"] document := vars["document"]
log.Debug().Str("booking id", bookingid).Str("document", document).Msg("Document and booking ID") fmt.Println(fmt.Sprintf("%s/%s", bookingid, document))
file, info, err := h.filestorage.Get(filestorage.PREFIX_BOOKINGS, fmt.Sprintf("%s/%s", bookingid, document)) file, info, err := h.filestorage.Get(filestorage.PREFIX_BOOKINGS, fmt.Sprintf("%s/%s", bookingid, document))
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
w.Header().Set("Content-Type", info.ContentType) w.Header().Set("Content-Type", info.ContentType)
if _, err = io.Copy(w, file); err != nil { if _, err = io.Copy(w, file); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
http.Redirect(w, r, fmt.Sprintf("/app/vehicles/bookings/%s", bookingid), http.StatusFound) http.Redirect(w, r, fmt.Sprintf("/app/vehicles/bookings/%s", bookingid), http.StatusFound)
} }

View File

@@ -2,10 +2,10 @@ package auth
import ( import (
"context" "context"
"fmt"
"net/http" "net/http"
groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi" groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi"
"github.com/rs/zerolog/log"
) )
func (h *AuthHandler) Groups(w http.ResponseWriter, r *http.Request) { func (h *AuthHandler) Groups(w http.ResponseWriter, r *http.Request) {
@@ -42,7 +42,7 @@ func (h *AuthHandler) Groups(w http.ResponseWriter, r *http.Request) {
err = idtoken.Claims(&claims) err = idtoken.Claims(&claims)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
} }
g := claims["groups"] g := claims["groups"]
@@ -65,7 +65,7 @@ func (h *AuthHandler) Groups(w http.ResponseWriter, r *http.Request) {
resp, err := h.services.GRPC.GroupsManagement.GetGroupsBatch(context.TODO(), request) resp, err := h.services.GRPC.GroupsManagement.GetGroupsBatch(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }

View File

@@ -4,12 +4,12 @@ import (
"context" "context"
"crypto/rand" "crypto/rand"
"encoding/base64" "encoding/base64"
"fmt"
"io" "io"
"net/http" "net/http"
"time" "time"
"git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi" "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
"github.com/rs/zerolog/log"
) )
func (h *AuthHandler) LostPasswordInit(w http.ResponseWriter, r *http.Request) { func (h *AuthHandler) LostPasswordInit(w http.ResponseWriter, r *http.Request) {
@@ -22,14 +22,14 @@ func (h *AuthHandler) LostPasswordInit(w http.ResponseWriter, r *http.Request) {
Namespace: "parcoursmob", Namespace: "parcoursmob",
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
http.Redirect(w, r, "/app/", http.StatusFound) http.Redirect(w, r, "/app/", http.StatusFound)
return return
} }
b := make([]byte, 16) b := make([]byte, 16)
if _, err := io.ReadFull(rand.Reader, b); err != nil { if _, err := io.ReadFull(rand.Reader, b); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -44,7 +44,7 @@ func (h *AuthHandler) LostPasswordInit(w http.ResponseWriter, r *http.Request) {
h.cache.PutWithTTL("retrieve-password/"+key, passwordretrieval, 72*time.Hour) h.cache.PutWithTTL("retrieve-password/"+key, passwordretrieval, 72*time.Hour)
if err := h.emailing.Send("auth.retrieve_password", email, passwordretrieval); err != nil { if err := h.emailing.Send("auth.retrieve_password", email, passwordretrieval); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -62,7 +62,7 @@ func (h *AuthHandler) LostPasswordRecover(w http.ResponseWriter, r *http.Request
key := r.FormValue("key") key := r.FormValue("key")
recover, err := h.cache.Get("retrieve-password/" + key) recover, err := h.cache.Get("retrieve-password/" + key)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
h.Renderer.LostPasswordRecoverKO(w, r, key) h.Renderer.LostPasswordRecoverKO(w, r, key)
return return
} }
@@ -81,13 +81,13 @@ func (h *AuthHandler) LostPasswordRecover(w http.ResponseWriter, r *http.Request
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
} }
err = h.cache.Delete("retrieve-password/" + key) err = h.cache.Delete("retrieve-password/" + key)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
} }
http.Redirect(w, r, "/app/", http.StatusFound) http.Redirect(w, r, "/app/", http.StatusFound)

View File

@@ -7,7 +7,6 @@ import (
mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi" mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
ma "git.coopgo.io/coopgo-platform/mobility-accounts/storage" ma "git.coopgo.io/coopgo-platform/mobility-accounts/storage"
"github.com/rs/zerolog/log"
) )
func (h *AuthHandler) Onboarding(w http.ResponseWriter, r *http.Request) { func (h *AuthHandler) Onboarding(w http.ResponseWriter, r *http.Request) {
@@ -16,7 +15,7 @@ func (h *AuthHandler) Onboarding(w http.ResponseWriter, r *http.Request) {
key := r.FormValue("key") key := r.FormValue("key")
onboarding, err := h.cache.Get("onboarding/" + key) onboarding, err := h.cache.Get("onboarding/" + key)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
h.Renderer.AuthOnboardingKO(w, r, key) h.Renderer.AuthOnboardingKO(w, r, key)
return return
} }
@@ -25,7 +24,7 @@ func (h *AuthHandler) Onboarding(w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" { if r.Method == "POST" {
if r.FormValue("password") == "" { if r.FormValue("password") == "" {
log.Error().Msg("Password is empty") fmt.Println("password is empty !")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -59,7 +58,7 @@ func (h *AuthHandler) Onboarding(w http.ResponseWriter, r *http.Request) {
acc, err := mobilityaccounts.AccountFromStorageType(account) acc, err := mobilityaccounts.AccountFromStorageType(account)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -71,14 +70,14 @@ func (h *AuthHandler) Onboarding(w http.ResponseWriter, r *http.Request) {
_, err = h.services.GRPC.MobilityAccounts.Register(context.TODO(), request) _, err = h.services.GRPC.MobilityAccounts.Register(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
err = h.cache.Delete("onboarding/" + key) err = h.cache.Delete("onboarding/" + key)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
} }
http.Redirect(w, r, "/app/", http.StatusFound) http.Redirect(w, r, "/app/", http.StatusFound)

View File

@@ -3,9 +3,6 @@ package exports
import ( import (
"context" "context"
"fmt" "fmt"
"net/http"
"sort"
"git.coopgo.io/coopgo-apps/parcoursmob/utils/sorting" "git.coopgo.io/coopgo-apps/parcoursmob/utils/sorting"
agenda "git.coopgo.io/coopgo-platform/agenda/grpcapi" agenda "git.coopgo.io/coopgo-platform/agenda/grpcapi"
agendastorage "git.coopgo.io/coopgo-platform/agenda/storage" agendastorage "git.coopgo.io/coopgo-platform/agenda/storage"
@@ -14,8 +11,9 @@ import (
accounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi" accounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
accountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage" accountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/rs/zerolog/log"
"github.com/xuri/excelize/v2" "github.com/xuri/excelize/v2"
"net/http"
"sort"
) )
func (h *ExportsHandler) Agenda(filter string) func(w http.ResponseWriter, r *http.Request) { func (h *ExportsHandler) Agenda(filter string) func(w http.ResponseWriter, r *http.Request) {
@@ -26,7 +24,7 @@ func (h *ExportsHandler) Agenda(filter string) func(w http.ResponseWriter, r *ht
Namespaces: []string{"parcoursmob_dispositifs"}, Namespaces: []string{"parcoursmob_dispositifs"},
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -61,7 +59,7 @@ func (h *ExportsHandler) Agenda(filter string) func(w http.ResponseWriter, r *ht
Accountids: beneficiaries_ids, Accountids: beneficiaries_ids,
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -84,7 +82,7 @@ func (h *ExportsHandler) Agenda(filter string) func(w http.ResponseWriter, r *ht
Id: eventId, Id: eventId,
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -109,7 +107,7 @@ func (h *ExportsHandler) Agenda(filter string) func(w http.ResponseWriter, r *ht
Accountids: beneficiaries_ids, Accountids: beneficiaries_ids,
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -132,7 +130,7 @@ func (h *ExportsHandler) generateExcel(events []agendastorage.Event, groups map[
f := excelize.NewFile() f := excelize.NewFile()
defer func() { defer func() {
if err := f.Close(); err != nil { if err := f.Close(); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
} }
}() }()
f.SetCellValue("Sheet1", "A1", "Evénement") f.SetCellValue("Sheet1", "A1", "Evénement")

View File

@@ -12,7 +12,6 @@ import (
groupsstorage "git.coopgo.io/coopgo-platform/groups-management/storage" groupsstorage "git.coopgo.io/coopgo-platform/groups-management/storage"
accounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi" accounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
accountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage" accountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage"
"github.com/rs/zerolog/log"
"github.com/xuri/excelize/v2" "github.com/xuri/excelize/v2"
) )
@@ -25,7 +24,7 @@ func (h *ExportsHandler) Bookings(w http.ResponseWriter, r *http.Request) {
} }
reesp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), reequest) reesp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), reequest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -35,6 +34,7 @@ func (h *ExportsHandler) Bookings(w http.ResponseWriter, r *http.Request) {
for _, vehicle := range reesp.Vehicles { for _, vehicle := range reesp.Vehicles {
v := vehicle.ToStorageType() v := vehicle.ToStorageType()
fmt.Println(v)
for _, b := range v.Bookings { for _, b := range v.Bookings {
bookings = append(bookings, b) bookings = append(bookings, b)
@@ -45,13 +45,14 @@ func (h *ExportsHandler) Bookings(w http.ResponseWriter, r *http.Request) {
} }
groups := map[string]groupsstorage.Group{} groups := map[string]groupsstorage.Group{}
admingroups, err := h.services.GRPC.GroupsManagement.GetGroups(context.TODO(), &groupsmanagement.GetGroupsRequest{ admingroups, err := h.services.GRPC.GroupsManagement.GetGroups(context.TODO(), &groupsmanagement.GetGroupsRequest{
Namespaces: []string{"parcoursmob_organizations"}, Namespaces: []string{"parcoursmob_organizations"},
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -64,7 +65,7 @@ func (h *ExportsHandler) Bookings(w http.ResponseWriter, r *http.Request) {
Accountids: beneficiaries_ids, Accountids: beneficiaries_ids,
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@@ -79,7 +80,7 @@ func (h *ExportsHandler) Bookings(w http.ResponseWriter, r *http.Request) {
f := excelize.NewFile() f := excelize.NewFile()
defer func() { defer func() {
if err := f.Close(); err != nil { if err := f.Close(); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
} }
}() }()
@@ -126,7 +127,7 @@ func (h *ExportsHandler) Bookings(w http.ResponseWriter, r *http.Request) {
// filter by group // filter by group
g := r.Context().Value(identification.GroupKey) g := r.Context().Value(identification.GroupKey)
group := g.(groupsstorage.Group) group := g.(groupsstorage.Group)
if bookedbygroup != group.ID { if bookedbygroup != group.ID {
continue continue
} }

98
main.go
View File

@@ -1,13 +1,11 @@
package main package main
import ( import (
"fmt"
"log"
"net/http" "net/http"
"os"
"time" "time"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"git.coopgo.io/coopgo-apps/parcoursmob/handlers/api" "git.coopgo.io/coopgo-apps/parcoursmob/handlers/api"
"git.coopgo.io/coopgo-apps/parcoursmob/handlers/application" "git.coopgo.io/coopgo-apps/parcoursmob/handlers/application"
"git.coopgo.io/coopgo-apps/parcoursmob/handlers/auth" "git.coopgo.io/coopgo-apps/parcoursmob/handlers/auth"
@@ -20,44 +18,37 @@ import (
) )
func main() { func main() {
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
cfg, err := ReadConfig() cfg, err := ReadConfig()
if err != nil { if err != nil {
log.Fatal().Err(err).Msg("cannot read config") panic(err)
return
} }
var ( var (
address = cfg.GetString("server.listen") //address = cfg.GetString("server.listen")
service_name = cfg.GetString("service_name") service_name = cfg.GetString("service_name")
templates_public_dir = cfg.GetString("templates.public_dir") templates_public_dir = cfg.GetString("templates.public_dir")
dev_env = cfg.GetBool("dev_env") dev_env = cfg.GetBool("dev_env")
) )
if dev_env {
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
}
svc, err := services.NewServicesHandler(cfg) svc, err := services.NewServicesHandler(cfg)
if err != nil { if err != nil {
log.Panic().Err(err).Msg("Error creating services handler") panic(err)
} }
fmt.Println(cfg)
kv, err := cache.NewKVHandler(cfg) kv, err := cache.NewKVHandler(cfg)
if err != nil { if err != nil {
log.Panic().Err(err).Msg("Error creating KV handler") panic(err)
} }
filestorage, _ := cache.NewFileStorage(cfg) filestorage, err := cache.NewFileStorage(cfg)
idp, err := identification.NewIdentificationProvider(cfg, svc, kv) idp, err := identification.NewIdentificationProvider(cfg, svc, kv)
if err != nil { if err != nil {
log.Panic().Err(err).Msg("Error creating identification provider") panic(err)
} }
emailing, err := renderer.NewEmailingHandler(cfg) emailing, err := renderer.NewEmailingHandler(cfg)
if err != nil { if err != nil {
log.Panic().Err(err).Msg("Error creating emailing handler") panic(err)
} }
apiHandler, _ := api.NewAPIHandler(cfg, idp, svc, kv) apiHandler, _ := api.NewAPIHandler(cfg, idp, svc, kv)
@@ -65,6 +56,11 @@ func main() {
exportsHandler, _ := exports.NewExportsHandler(cfg, svc, emailing) exportsHandler, _ := exports.NewExportsHandler(cfg, svc, emailing)
authHandler, _ := auth.NewAuthHandler(cfg, idp, svc, kv, emailing) authHandler, _ := auth.NewAuthHandler(cfg, idp, svc, kv, emailing)
fmt.Println("Running", service_name, ":")
if dev_env {
fmt.Printf("\033]0;%s\007", service_name)
}
r := mux.NewRouter() r := mux.NewRouter()
r.PathPrefix("/public/").Handler(http.StripPrefix("/public/", http.FileServer(http.Dir(templates_public_dir)))) r.PathPrefix("/public/").Handler(http.StripPrefix("/public/", http.FileServer(http.Dir(templates_public_dir))))
@@ -77,14 +73,6 @@ func main() {
r.HandleFunc("/auth/groups/switch", authHandler.GroupSwitch) r.HandleFunc("/auth/groups/switch", authHandler.GroupSwitch)
r.HandleFunc("/", redirectApp) r.HandleFunc("/", redirectApp)
if dev_env {
r.Use(trackPage)
}
calendars_router := r.PathPrefix("/api/calendars").Subrouter()
calendars_router.HandleFunc("/global.ics", apiHandler.CalendarGlobal)
calendars_router.HandleFunc("/organizations/{groupid}.ics", apiHandler.CalendarOrganizations)
api_router := r.PathPrefix("/api").Subrouter() api_router := r.PathPrefix("/api").Subrouter()
api_router.HandleFunc("/", apiHandler.NotFound) api_router.HandleFunc("/", apiHandler.NotFound)
api_router.HandleFunc("/geo/autocomplete", apiHandler.GeoAutocomplete) api_router.HandleFunc("/geo/autocomplete", apiHandler.GeoAutocomplete)
@@ -149,12 +137,18 @@ func main() {
application.HandleFunc("/support/", applicationHandler.SupportSend) application.HandleFunc("/support/", applicationHandler.SupportSend)
/*********************** CODE GROUP **************************/ /*********************** CODE GROUP **************************/
//=================================silvermobi====================================
application.HandleFunc("/solidarity_service/", applicationHandler.SolidarityService)
application.HandleFunc("/solidarity_service/create/{id}", applicationHandler.DriversJourney)
application.HandleFunc("/solidarity_service/driver/create", applicationHandler.CreateDriver)
appGroup := application.PathPrefix("/group_module").Subrouter() appGroup := application.PathPrefix("/group_module").Subrouter()
appGroup.HandleFunc("/", applicationHandler.Groups) appGroup.HandleFunc("/", applicationHandler.Groups)
appGroup.HandleFunc("/groups", applicationHandler.CreateGroupModule) appGroup.HandleFunc("/groups", applicationHandler.CreateGroupModule)
appGroup.HandleFunc("/groups/{groupid}", applicationHandler.DisplayGroupModule) appGroup.HandleFunc("/groups/{groupid}", applicationHandler.DisplayGroupModule)
// TODO Subrouters with middlewares checking security for each module ? //TODO Subrouters with middlewares checking security for each module ?
application.Use(idp.Middleware) application.Use(idp.Middleware)
application.Use(idp.GroupsMiddleware) application.Use(idp.GroupsMiddleware)
@@ -164,7 +158,7 @@ func main() {
appAdmin.HandleFunc("/groups/{groupid}", applicationHandler.AdministrationGroupDisplay) appAdmin.HandleFunc("/groups/{groupid}", applicationHandler.AdministrationGroupDisplay)
appAdmin.HandleFunc("/groups/{groupid}/invite-admin", applicationHandler.AdministrationGroupInviteAdmin) appAdmin.HandleFunc("/groups/{groupid}/invite-admin", applicationHandler.AdministrationGroupInviteAdmin)
appAdmin.HandleFunc("/groups/{groupid}/invite-member", applicationHandler.AdministrationGroupInviteMember) appAdmin.HandleFunc("/groups/{groupid}/invite-member", applicationHandler.AdministrationGroupInviteMember)
// add statistiques //add statistiques
appAdmin.HandleFunc("/stats/vehicles", applicationHandler.AdminStatVehicles) appAdmin.HandleFunc("/stats/vehicles", applicationHandler.AdminStatVehicles)
appAdmin.HandleFunc("/stats/bookings", applicationHandler.AdminStatBookings) appAdmin.HandleFunc("/stats/bookings", applicationHandler.AdminStatBookings)
appAdmin.HandleFunc("/stats/beneficaires", applicationHandler.AdminStatBeneficaires) appAdmin.HandleFunc("/stats/beneficaires", applicationHandler.AdminStatBeneficaires)
@@ -174,38 +168,6 @@ func main() {
application.HandleFunc("/agenda/{eventid}/{subscribeid}/delete", applicationHandler.AgendaDeleteSubscribeEvent) application.HandleFunc("/agenda/{eventid}/{subscribeid}/delete", applicationHandler.AgendaDeleteSubscribeEvent)
application.HandleFunc("/agenda/{eventid}/history", applicationHandler.AgendaHistoryEvent) application.HandleFunc("/agenda/{eventid}/history", applicationHandler.AgendaHistoryEvent)
///////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////Add documents in event////////////////////////
application.HandleFunc("/agenda/{eventid}/documents", applicationHandler.EventDocuments)
application.HandleFunc("/agenda/{eventid}/documents/{document}", applicationHandler.EventDocumentDownload)
////////////////////////////////////////////////////////////////
//////////////////Diag in event////////////////////////
// application.HandleFunc("/agenda/{eventid}/create-diag", applicationHandler.DiagsCreateDiag)
application.HandleFunc("/agenda/{eventid}/diags", applicationHandler.DiagsHome)
application.HandleFunc("/agenda/{eventid}/diags/{diagid}", applicationHandler.DiagsDisplayDiag)
application.HandleFunc("/agenda/{eventid}/diags/history", applicationHandler.DiagsHistory)
application.HandleFunc("/agenda/{eventid}/diags/{diagid}/history", applicationHandler.DiagsHistoryDiag)
////////////////////////////////////////////////////////////////
//////////////////Diag in benefeciaries////////////////////////
application.HandleFunc("/beneficiaries/{beneficiaryid}/create-diag", applicationHandler.BeneficiariesCreateDiag)
application.HandleFunc("/beneficiaries/{beneficiaryid}/diags/{diagid}", applicationHandler.DiagsDisplayDiag)
////////////////////////////////////////////////////////////////
//////////////////Diag in vehicules////////////////////////
application.HandleFunc("/vehicles-management/fleet/{vehicleid}/create-diag", applicationHandler.VehiclesCreateDiag)
application.HandleFunc("/vehicles-management/fleet/{vehicleid}/diags", applicationHandler.DiagsHome)
application.HandleFunc("/vehicles-management/fleet/{vehicleid}/diags/{diagid}", applicationHandler.DiagsDisplayDiag)
////////////////////////////////////////////////////////////////
//////////////////Diag in bookings////////////////////////
application.HandleFunc("/vehicles-management/bookings/{bookingid}/create-diag", applicationHandler.BookingsCreateDiag)
application.HandleFunc("/vehicles/bookings/{vehicleid}/diags", applicationHandler.DiagsHome)
application.HandleFunc("/vehicles/bookings/{bookingid}/create-diag", applicationHandler.VehicleBookingsCreateDiag)
//////////////////Diags////////////////////////
application.HandleFunc("/diags/", applicationHandler.DiagsHome)
application.HandleFunc("/diags/{diagid}/documents", applicationHandler.DiagsDocuments)
application.HandleFunc("/diags/{diagid}/documents/{document}", applicationHandler.DiagsDocumentDownload)
application.HandleFunc("/diags/{diagid}", applicationHandler.DiagsDisplayDiag)
application.HandleFunc("/diags/{diagid}/update", applicationHandler.DiagUpdate)
application.HandleFunc("/diags/{diagid}/delete", applicationHandler.DiagDelete)
// application.HandleFunc("/diags/history", applicationHandler.DiagsHistory)
export := r.PathPrefix("/exports").Subrouter() export := r.PathPrefix("/exports").Subrouter()
export.HandleFunc("/fleets/bookings", exportsHandler.Bookings) export.HandleFunc("/fleets/bookings", exportsHandler.Bookings)
@@ -217,23 +179,15 @@ func main() {
srv := &http.Server{ srv := &http.Server{
Handler: r, Handler: r,
Addr: address, Addr: "0.0.0.0:9000",
WriteTimeout: 15 * time.Second, WriteTimeout: 15 * time.Second,
ReadTimeout: 15 * time.Second, ReadTimeout: 15 * time.Second,
} }
log.Info().Str("service_name", service_name).Str("address", address).Msg("Running HTTP server") log.Fatal(srv.ListenAndServe())
log.Fatal().Err(srv.ListenAndServe())
} }
func redirectApp(w http.ResponseWriter, r *http.Request) { func redirectApp(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "/app/", http.StatusFound) http.Redirect(w, r, "/app/", http.StatusFound)
} }
func trackPage(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Trace().Str("requested_uri", r.RequestURI).Msg("New request")
next.ServeHTTP(w, r.WithContext(r.Context()))
})
}

BIN
parcoursmob Executable file

Binary file not shown.

View File

@@ -30,31 +30,22 @@ func (renderer *Renderer) AgendaHistory(w http.ResponseWriter, r *http.Request,
renderer.Render("agenda history", w, r, files, state) renderer.Render("agenda history", w, r, files, state)
} }
func (renderer *Renderer) AgendaCreateEvent(w http.ResponseWriter, r *http.Request, events_file_types []string, file_types_map map[string]string, documents any) { func (renderer *Renderer) AgendaCreateEvent(w http.ResponseWriter, r *http.Request) {
files := renderer.ThemeConfig.GetStringSlice("views.agenda.create_event.files") files := renderer.ThemeConfig.GetStringSlice("views.agenda.create_event.files")
state := NewState(r, renderer.ThemeConfig, agendaMenu) state := NewState(r, renderer.ThemeConfig, agendaMenu)
state.ViewState = map[string]any{
"events_file_types": events_file_types,
"file_types_map": file_types_map,
"documents": documents,
}
renderer.Render("agenda create event", w, r, files, state) renderer.Render("agenda create event", w, r, files, state)
} }
func (renderer *Renderer) AgendaDisplayEvent(w http.ResponseWriter, r *http.Request, event any, group any, events_file_types []string, file_types_map map[string]string, documents any, subscribers map[string]any, beneficiaries any) { func (renderer *Renderer) AgendaDisplayEvent(w http.ResponseWriter, r *http.Request, event any, group any, subscribers map[string]any, beneficiaries any) {
files := renderer.ThemeConfig.GetStringSlice("views.agenda.display_event.files") files := renderer.ThemeConfig.GetStringSlice("views.agenda.display_event.files")
state := NewState(r, renderer.ThemeConfig, agendaMenu) state := NewState(r, renderer.ThemeConfig, agendaMenu)
state.ViewState = map[string]any{ state.ViewState = map[string]any{
"event": event, "event": event,
"group": group, "group": group,
"events_file_types": events_file_types, "subscribers": subscribers,
"file_types_map": file_types_map, "beneficiaries": beneficiaries,
"documents": documents,
"subscribers": subscribers,
"beneficiaries": beneficiaries,
} }
renderer.Render("agenda create event", w, r, files, state) renderer.Render("agenda create event", w, r, files, state)
@@ -109,18 +100,3 @@ func (renderer *Renderer) AgendaDeleteEvent(w http.ResponseWriter, r *http.Reque
renderer.Render("event_deleteEvent", w, r, files, state) renderer.Render("event_deleteEvent", w, r, files, state)
} }
////////Event documents////////////////////////
// func (renderer *Renderer) EventDocuments(w http.ResponseWriter, r *http.Request, event any, documents []any) {
// files := renderer.ThemeConfig.GetStringSlice("views.agenda.event_files.files")
// state := NewState(r, renderer.ThemeConfig, agendaMenu)
// state.ViewState = map[string]any{
// "event": event,
// "documents": documents,
// "eventid": event.(map[string]any)["id"],
// "eventtitle": event.(map[string]any)["title"],
// }
// renderer.Render("event_files", w, r, files, state)
// }

View File

@@ -7,6 +7,7 @@ import (
fleetsstorage "git.coopgo.io/coopgo-platform/fleets/storage" fleetsstorage "git.coopgo.io/coopgo-platform/fleets/storage"
mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage" mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage"
solidarity_service "git.coopgo.io/sbouaram/solidarity-service/servers/grpc/proto"
) )
const beneficiariesMenu = "beneficiaries" const beneficiariesMenu = "beneficiaries"
@@ -15,6 +16,16 @@ type BeneficiariesListState struct {
Count int `json:"count"` Count int `json:"count"`
CacheId string `json:"cache_id"` CacheId string `json:"cache_id"`
Beneficiaries []mobilityaccountsstorage.Account `json:"beneficiaries"` Beneficiaries []mobilityaccountsstorage.Account `json:"beneficiaries"`
BeneficiariesSolidarity *solidarity_service.GetAllPassengersResponse `json:"beneficiariessolidarity"`
}
type BeneficiarySolidarityState struct {
Count int `json:"count"`
CacheId string `json:"cache_id"`
Beneficiaries []mobilityaccountsstorage.Account `json:"beneficiaries"`
BeneficiarySolidarity *solidarity_service.GetPassengerResponse `json:"beneficiarysolidarity"`
BookingSolidarity *solidarity_service.GetBookingsByStatusResponse `json:"bookingsolidarity"`
} }
func (s BeneficiariesListState) JSON() template.JS { func (s BeneficiariesListState) JSON() template.JS {
@@ -23,18 +34,30 @@ func (s BeneficiariesListState) JSON() template.JS {
} }
func (s BeneficiariesListState) JSONWithLimits(a int, b int) template.JS { func (s BeneficiariesListState) JSONWithLimits(a int, b int) template.JS {
if b < len(s.Beneficiaries) { if b < len(s.Beneficiaries) {
s.Beneficiaries = s.Beneficiaries[a:b] s.Beneficiaries = s.Beneficiaries[a:b]
} }
return s.JSON() return s.JSON()
} }
func (renderer *Renderer) BeneficiariesList(w http.ResponseWriter, r *http.Request, accounts []mobilityaccountsstorage.Account, cacheid string) { func (s BeneficiarySolidarityState) JSON() template.JS {
result, _ := json.Marshal(s)
return template.JS(result)
}
func (s BeneficiarySolidarityState) JSONWithLimits(a int, b int) template.JS {
if b < 5 {
s.Beneficiaries = s.Beneficiaries[a:b]
}
return s.JSON()
}
func (renderer *Renderer) BeneficiariesList(w http.ResponseWriter, r *http.Request, accounts []mobilityaccountsstorage.Account,cacheid string) {
files := renderer.ThemeConfig.GetStringSlice("views.beneficiaries.list.files") files := renderer.ThemeConfig.GetStringSlice("views.beneficiaries.list.files")
state := NewState(r, renderer.ThemeConfig, beneficiariesMenu) state := NewState(r, renderer.ThemeConfig, beneficiariesMenu)
state.ViewState = BeneficiariesListState{ state.ViewState = BeneficiariesListState{
Count: len(accounts), Count: len(accounts),
CacheId: cacheid, CacheId: cacheid,
Beneficiaries: accounts, Beneficiaries: accounts,
} }
@@ -53,7 +76,7 @@ type BeneficiariesDisplayState struct {
Beneficiary any Beneficiary any
} }
func (renderer *Renderer) BeneficiaryDisplay(w http.ResponseWriter, r *http.Request, beneficiary any, bookings []fleetsstorage.Booking, organizations []any, beneficiaries_file_types []string, file_types_map map[string]string, documents any, event interface{}, diags []any) { func (renderer *Renderer) BeneficiaryDisplay(w http.ResponseWriter, r *http.Request, beneficiary any, bookings []fleetsstorage.Booking, organizations []any, beneficiaries_file_types []string, file_types_map map[string]string, documents any, event interface{}, solidarity_bookings_list []any) {
files := renderer.ThemeConfig.GetStringSlice("views.beneficiaries.display.files") files := renderer.ThemeConfig.GetStringSlice("views.beneficiaries.display.files")
state := NewState(r, renderer.ThemeConfig, beneficiariesMenu) state := NewState(r, renderer.ThemeConfig, beneficiariesMenu)
state.ViewState = map[string]any{ state.ViewState = map[string]any{
@@ -63,8 +86,8 @@ func (renderer *Renderer) BeneficiaryDisplay(w http.ResponseWriter, r *http.Requ
"file_types_map": file_types_map, "file_types_map": file_types_map,
"documents": documents, "documents": documents,
"organizations": organizations, "organizations": organizations,
"event": event, "event": event,
"diags": diags, "bookingSolidarity" : solidarity_bookings_list,
} }
renderer.Render("beneficiaries_display", w, r, files, state) renderer.Render("beneficiaries_display", w, r, files, state)
} }

View File

@@ -4,12 +4,11 @@ import (
"net/http" "net/http"
agendastorage "git.coopgo.io/coopgo-platform/agenda/storage" agendastorage "git.coopgo.io/coopgo-platform/agenda/storage"
fleetstorage "git.coopgo.io/coopgo-platform/fleets/storage"
) )
const dashboardMenu = "dashboard" const dashboardMenu = "dashboard"
func (renderer *Renderer) Dashboard(w http.ResponseWriter, r *http.Request, accounts []any, nbaccounts int, count_members int, events []agendastorage.Event, fleets []fleetstorage.Booking) { func (renderer *Renderer) Dashboard(w http.ResponseWriter, r *http.Request, accounts []any, nbaccounts int, count_members int, events []agendastorage.Event) {
files := renderer.ThemeConfig.GetStringSlice("views.dashboard.files") files := renderer.ThemeConfig.GetStringSlice("views.dashboard.files")
state := NewState(r, renderer.ThemeConfig, dashboardMenu) state := NewState(r, renderer.ThemeConfig, dashboardMenu)
state.ViewState = map[string]any{ state.ViewState = map[string]any{
@@ -19,7 +18,6 @@ func (renderer *Renderer) Dashboard(w http.ResponseWriter, r *http.Request, acco
}, },
"count_members": count_members, "count_members": count_members,
"events": events, "events": events,
"fleets": fleets,
} }
renderer.Render("dashboard", w, r, files, state) renderer.Render("dashboard", w, r, files, state)

View File

@@ -1,115 +0,0 @@
package renderer
import (
"net/http"
diagsstorage "git.coopgo.io/coopgo-platform/diags/storage"
)
const diagsMenu = "diags"
func (renderer *Renderer) DiagsHome(w http.ResponseWriter, r *http.Request, diags []diagsstorage.Diag, groups map[string]any) {
files := renderer.ThemeConfig.GetStringSlice("views.diags.list.files")
state := NewState(r, renderer.ThemeConfig, diagsMenu)
state.ViewState = map[string]any{
"diags": diags,
"groups": groups,
}
renderer.Render("diags home", w, r, files, state)
}
func (renderer *Renderer) DiagsHistory(w http.ResponseWriter, r *http.Request, diags []diagsstorage.Diag) {
files := renderer.ThemeConfig.GetStringSlice("views.diags.history.files")
state := NewState(r, renderer.ThemeConfig, diagsMenu)
state.ViewState = map[string]any{
"diags": diags,
}
renderer.Render("diags history", w, r, files, state)
}
func (renderer *Renderer) BeneficiariesCreateDiag(w http.ResponseWriter, r *http.Request, beneficiary string, diags_file_types []string, file_types_map map[string]string, documents any) {
state := NewState(r, renderer.ThemeConfig, diagsMenu)
files := renderer.ThemeConfig.GetStringSlice("views.beneficiaries.create_diag.files")
state.ViewState = map[string]any{
"beneficiary": beneficiary,
"diags_file_types": diags_file_types,
"file_types_map": file_types_map,
"documents": documents,
}
renderer.Render("diag create for beneficiary", w, r, files, state)
}
func (renderer *Renderer) VehiclesCreateDiag(w http.ResponseWriter, r *http.Request, vehicle string) {
state := NewState(r, renderer.ThemeConfig, diagsMenu)
files := renderer.ThemeConfig.GetStringSlice("views.vehicles_management.create_vehicle_diag.files")
state.ViewState = map[string]any{
"vehicle": vehicle,
}
renderer.Render("diag create for vehicle", w, r, files, state)
}
func (renderer *Renderer) BookingsCreateDiag(w http.ResponseWriter, r *http.Request, booking string) {
state := NewState(r, renderer.ThemeConfig, diagsMenu)
files := renderer.ThemeConfig.GetStringSlice("views.vehicles_management.create_booking_diag.files")
state.ViewState = map[string]any{
"booking": booking,
}
renderer.Render("diag create for booking", w, r, files, state)
}
func (renderer *Renderer) VehicleBookingsCreateDiag(w http.ResponseWriter, r *http.Request, booking string) {
state := NewState(r, renderer.ThemeConfig, diagsMenu)
files := renderer.ThemeConfig.GetStringSlice("views.vehicles.create_booking_diag.files")
state.ViewState = map[string]any{
"booking": booking,
}
renderer.Render("diag create for booking", w, r, files, state)
}
func (renderer *Renderer) DiagsDisplayDiag(w http.ResponseWriter, r *http.Request, diag any, diags_file_types []string, file_types_map map[string]string, documents any) {
files := renderer.ThemeConfig.GetStringSlice("views.diags.display_diag.files")
state := NewState(r, renderer.ThemeConfig, diagsMenu)
state.ViewState = map[string]any{
"diag": diag,
"diags_file_types": diags_file_types,
"file_types_map": file_types_map,
"documents": documents,
}
renderer.Render("diags create diag", w, r, files, state)
}
func (renderer *Renderer) DiagsHistoryDiag(w http.ResponseWriter, r *http.Request, diag any) {
files := renderer.ThemeConfig.GetStringSlice("views.diags.history_diag.files")
state := NewState(r, renderer.ThemeConfig, diagsMenu)
state.ViewState = map[string]any{
"diag": diag,
}
renderer.Render("diags history diag", w, r, files, state)
}
func (renderer *Renderer) DiagUpdate(w http.ResponseWriter, r *http.Request, diag any) {
files := renderer.ThemeConfig.GetStringSlice("views.diags.update.files")
state := NewState(r, renderer.ThemeConfig, diagsMenu)
state.ViewState = map[string]any{
"diag": diag,
}
renderer.Render("diag_update", w, r, files, state)
}
func (renderer *Renderer) DiagDelete(w http.ResponseWriter, r *http.Request, diag any) {
files := renderer.ThemeConfig.GetStringSlice("views.diags.delete.files")
state := NewState(r, renderer.ThemeConfig, diagsMenu)
state.ViewState = map[string]any{
"diag": diag,
}
renderer.Render("diag_deleteDiag", w, r, files, state)
}

View File

@@ -25,6 +25,20 @@ func TimeFrom(d any) *time.Time {
return nil return nil
} }
func TimestampFrom(d any) *time.Time {
if date, ok := d.(time.Time); ok {
return &date
} else if date, ok := d.(string); ok {
datetime, err := time.Parse("2006-01-02T15:04:05Z", date)
if err != nil {
panic(err)
}
return &datetime
}
return nil
}
func TimeFormat(d any, f string) string { func TimeFormat(d any, f string) string {
date := TimeFrom(d) date := TimeFrom(d)
if date == nil { if date == nil {

View File

@@ -4,9 +4,10 @@ import (
"encoding/json" "encoding/json"
"html/template" "html/template"
"net/http" "net/http"
groupstorage "git.coopgo.io/coopgo-platform/groups-management/storage" groupstorage "git.coopgo.io/coopgo-platform/groups-management/storage"
mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage" mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage"
models "git.coopgo.io/coopgo-apps/parcoursmob/utils/models"
) )
const journeysMenu = "journeys" const journeysMenu = "journeys"
@@ -23,6 +24,7 @@ type BeneficiariesCovoiturageA struct {
Beneficiaries []any `json:"beneficiaries"` Beneficiaries []any `json:"beneficiaries"`
} }
func (s BeneficiariesCovoiturage) JSON() template.JS { func (s BeneficiariesCovoiturage) JSON() template.JS {
result, _ := json.Marshal(s) result, _ := json.Marshal(s)
return template.JS(result) return template.JS(result)
@@ -35,7 +37,7 @@ func (s BeneficiariesCovoiturage) JSONWithLimits(a int, b int) template.JS {
return s.JSON() return s.JSON()
} }
func (renderer *Renderer) JourneysSearch(w http.ResponseWriter, r *http.Request, carpools any, transitjourneys any, vehicles []any, searched bool, departure any, destination any, departuredate string, departuretime string) { func (renderer *Renderer) JourneysSearch(w http.ResponseWriter, r *http.Request, carpools any, vehicles []any, searched bool, departure any, destination any, departuredate string, departuretime string, solidarity_results models.SolidarityTransport ) { //transitjourneys any,
files := renderer.ThemeConfig.GetStringSlice("views.journeys.search.files") files := renderer.ThemeConfig.GetStringSlice("views.journeys.search.files")
state := NewState(r, renderer.ThemeConfig, journeysMenu) state := NewState(r, renderer.ThemeConfig, journeysMenu)
state.ViewState = map[string]any{ state.ViewState = map[string]any{
@@ -44,11 +46,11 @@ func (renderer *Renderer) JourneysSearch(w http.ResponseWriter, r *http.Request,
"departuretime": departuretime, "departuretime": departuretime,
"departure": departure, "departure": departure,
"destination": destination, "destination": destination,
"journeys": transitjourneys, //"journeys": transitjourneys,
"carpools": carpools, "carpools": carpools,
"vehicles": vehicles, "vehicles": vehicles,
"solidarity_results": solidarity_results,
} }
renderer.Render("journeys", w, r, files, state) renderer.Render("journeys", w, r, files, state)
} }

View File

@@ -9,8 +9,7 @@ import (
"git.coopgo.io/coopgo-apps/parcoursmob/utils/identification" "git.coopgo.io/coopgo-apps/parcoursmob/utils/identification"
"git.coopgo.io/coopgo-platform/emailing" "git.coopgo.io/coopgo-platform/emailing"
"git.coopgo.io/coopgo-platform/groups-management/storage" "git.coopgo.io/coopgo-platform/groups-management/storage"
"github.com/coreos/go-oidc/v3/oidc" "github.com/coreos/go-oidc"
"github.com/rs/zerolog/log"
"github.com/spf13/viper" "github.com/spf13/viper"
) )
@@ -67,7 +66,7 @@ func (renderer *Renderer) Render(name string, w http.ResponseWriter, r *http.Req
err := t.ExecuteTemplate(w, "main", state) err := t.ExecuteTemplate(w, "main", state)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
} }
} }
@@ -96,7 +95,7 @@ func (renderer *Renderer) RenderNoLayout(name string, w http.ResponseWriter, r *
t = template.Must(t.ParseFiles(prefixed_files...)) t = template.Must(t.ParseFiles(prefixed_files...))
err := t.ExecuteTemplate(w, "main", state) err := t.ExecuteTemplate(w, "main", state)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
} }
} }
@@ -252,12 +251,12 @@ func NewState(r *http.Request, themeConfig *viper.Viper, menuState string) Rende
Icon: "hero:outline/user-group", Icon: "hero:outline/user-group",
}) })
} }
if modules["diags"] != nil && modules["diags"].(bool) { if modules["solidarity_service"] != nil && modules["solidarity_service"].(bool) {
ls.MenuItems = append(ls.MenuItems, MenuItem{ ls.MenuItems = append(ls.MenuItems, MenuItem{
Title: "Diagnostics", Title: "Transport solidaire",
Link: "/app/diags/", Link: "/app/solidarity_service/",
Active: menuState == diagsMenu, Active: menuState == solidarityserviceMenu,
Icon: "hero:outline/document-text", Icon: "hero:outline/map",
}) })
} }
return RenderState{ return RenderState{

View File

@@ -0,0 +1,127 @@
package renderer
import (
"encoding/json"
"html/template"
"net/http"
mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage"
solidarity_service "git.coopgo.io/sbouaram/solidarity-service/servers/grpc/proto"
)
const solidarityserviceMenu = "solidarity_service"
type SolidarityListState struct {
Count int `json:"count"`
CacheId string `json:"cache_id"`
BeneficiariesSolidarity *solidarity_service.GetAllPassengersResponse `json:"beneficiariessolidarity"`
Drivers *solidarity_service.DriverJourneysResponse `json:"drivers"`
Bookings *solidarity_service.GetAllBookingsSolidarityResponse `json:"bookings"`
Beneficiaries []mobilityaccountsstorage.Account `json:"beneficiaries"`
}
type BeneficiariesSolidarityListState struct {
Count int `json:"count"`
CacheId string `json:"cache_id"`
BeneficiariesSolidarity *solidarity_service.GetAllPassengersResponse `json:"beneficiariessolidarity"`
Drivers *solidarity_service.GetAllDriversResponse `json:"drivers"`
Bookings *solidarity_service.GetAllBookingsSolidarityResponse `json:"bookings"`
Beneficiaries []mobilityaccountsstorage.Account `json:"beneficiaries"`
}
type SolidarityBookingsState struct {
Bookings *solidarity_service.CreateBookingSolidarityResponse `json:"bookings"`
Beneficiaries []mobilityaccountsstorage.Account `json:"beneficiaries"`
BeneficiariesSolidarity *solidarity_service.GetAllPassengersResponse `json:"beneficiariessolidarity"`
}
func (s BeneficiariesSolidarityListState) JSON() template.JS {
result, _ := json.Marshal(s)
return template.JS(result)
}
func (s BeneficiariesSolidarityListState) JSONWithLimits(a int, b int) template.JS {
if b < 5 {
s.Beneficiaries = s.Beneficiaries[a:b]
}
return s.JSON()
}
func (s SolidarityListState) JSON() template.JS {
result, _ := json.Marshal(s)
return template.JS(result)
}
func (s SolidarityListState) JSONWithLimits(a int, b int) template.JS {
if b < 5 {
s.Beneficiaries = s.Beneficiaries[a:b]
}
return s.JSON()
}
func (s SolidarityBookingsState) JSON() template.JS {
result, _ := json.Marshal(s)
return template.JS(result)
}
func (s SolidarityBookingsState) JSONWithLimits(a int, b int) template.JS {
if b < 5 {
s.Beneficiaries = s.Beneficiaries[a:b]
}
return s.JSON()
}
func (renderer *Renderer) SolidarityService(w http.ResponseWriter, r *http.Request, accounts *solidarity_service.GetAllPassengersResponse, drivers *solidarity_service.GetAllDriversResponse, parcourmobAccounts []mobilityaccountsstorage.Account, bookings *solidarity_service.GetAllBookingsSolidarityResponse, cacheid string) {
files := renderer.ThemeConfig.GetStringSlice("views.solidarity_service.list.files")
state := NewState(r, renderer.ThemeConfig, solidarityserviceMenu)
state.ViewState = BeneficiariesSolidarityListState{
Count: len(parcourmobAccounts),
CacheId: cacheid,
Beneficiaries: parcourmobAccounts,
BeneficiariesSolidarity: accounts,
Drivers: drivers,
Bookings: bookings,
}
renderer.Render("solidarity_service", w, r, files, state)
}
func (renderer *Renderer) CreateBookingHome(w http.ResponseWriter, r *http.Request ) {
files := renderer.ThemeConfig.GetStringSlice("views.solidarity_service.create.files")
state := NewState(r, renderer.ThemeConfig, solidarityserviceMenu)
renderer.Render("solidarity_service", w, r, files, state)
}
func (renderer *Renderer) SolidarityServiceBooking(w http.ResponseWriter, r *http.Request, bookings *solidarity_service.CreateBookingSolidarityResponse) {
files := renderer.ThemeConfig.GetStringSlice("views.solidarity_service.create.files")
state := NewState(r, renderer.ThemeConfig, solidarityserviceMenu)
state.ViewState = SolidarityBookingsState{
Bookings: bookings,
}
renderer.Render("solidarity_service", w, r, files, state)
}
func (renderer *Renderer) SolidarityServiceListAvailableDrivers(w http.ResponseWriter, r *http.Request, drivers *solidarity_service.DriverJourneysResponse, booking *solidarity_service.CreateBookingSolidarityRequest) {
files := renderer.ThemeConfig.GetStringSlice("views.solidarity_service.create.files")
state := NewState(r, renderer.ThemeConfig, solidarityserviceMenu)
state.ViewState = SolidarityListState{
Drivers: drivers,
}
renderer.Render("solidarity_service", w, r, files, state)
}
func (renderer *Renderer) CreateDriver(w http.ResponseWriter, r *http.Request) {
files := renderer.ThemeConfig.GetStringSlice("views.solidarity_service.create_driver.files")
state := NewState(r, renderer.ThemeConfig, solidarityserviceMenu)
renderer.Render("solidarity_service", w, r, files, state)
}

View File

@@ -5,31 +5,28 @@ import (
filestorage "git.coopgo.io/coopgo-apps/parcoursmob/utils/storage" filestorage "git.coopgo.io/coopgo-apps/parcoursmob/utils/storage"
fleetsstorage "git.coopgo.io/coopgo-platform/fleets/storage" fleetsstorage "git.coopgo.io/coopgo-platform/fleets/storage"
mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage"
) )
const vehiclesmanagementMenu = "vehicles_management" const vehiclesmanagementMenu = "vehicles_management"
func (renderer *Renderer) VehiclesManagementOverview(w http.ResponseWriter, r *http.Request, vehicles []fleetsstorage.Vehicle, vehicles_map map[string]fleetsstorage.Vehicle, driversMap map[string]mobilityaccountsstorage.Account, bookings []fleetsstorage.Booking) { func (renderer *Renderer) VehiclesManagementOverview(w http.ResponseWriter, r *http.Request, vehicles []fleetsstorage.Vehicle, vehicles_map map[string]fleetsstorage.Vehicle, bookings []fleetsstorage.Booking) {
files := renderer.ThemeConfig.GetStringSlice("views.vehicles_management.overview.files") files := renderer.ThemeConfig.GetStringSlice("views.vehicles_management.overview.files")
state := NewState(r, renderer.ThemeConfig, vehiclesmanagementMenu) state := NewState(r, renderer.ThemeConfig, vehiclesmanagementMenu)
state.ViewState = map[string]any{ state.ViewState = map[string]any{
"vehicles": vehicles, "vehicles": vehicles,
"bookings": bookings, "bookings": bookings,
"vehicles_map": vehicles_map, "vehicles_map": vehicles_map,
"drivers_map": driversMap,
} }
renderer.Render("fleet overview", w, r, files, state) renderer.Render("fleet overview", w, r, files, state)
} }
func (renderer *Renderer) VehiclesManagementBookingsList(w http.ResponseWriter, r *http.Request, vehiclesMap map[string]fleetsstorage.Vehicle, driversMap map[string]mobilityaccountsstorage.Account, bookings []fleetsstorage.Booking, cacheid string) { func (renderer *Renderer) VehiclesManagementBookingsList(w http.ResponseWriter, r *http.Request, vehicles_map map[string]fleetsstorage.Vehicle, bookings []fleetsstorage.Booking, cacheid string) {
files := renderer.ThemeConfig.GetStringSlice("views.vehicles_management.bookings_list.files") files := renderer.ThemeConfig.GetStringSlice("views.vehicles_management.bookings_list.files")
state := NewState(r, renderer.ThemeConfig, vehiclesmanagementMenu) state := NewState(r, renderer.ThemeConfig, vehiclesmanagementMenu)
state.ViewState = map[string]any{ state.ViewState = map[string]any{
"bookings": bookings, "bookings": bookings,
"vehicles_map": vehiclesMap, "vehicles_map": vehicles_map,
"drivers_map": driversMap,
"cacheid": cacheid, "cacheid": cacheid,
} }
@@ -46,12 +43,11 @@ func (renderer *Renderer) VehiclesFleetAdd(w http.ResponseWriter, r *http.Reques
renderer.Render("fleet add vehicle", w, r, files, state) renderer.Render("fleet add vehicle", w, r, files, state)
} }
func (renderer *Renderer) VehiclesFleetDisplay(w http.ResponseWriter, r *http.Request, vehicle any, diags []any) { func (renderer *Renderer) VehiclesFleetDisplay(w http.ResponseWriter, r *http.Request, vehicle any) {
files := renderer.ThemeConfig.GetStringSlice("views.vehicles_management.fleet_display.files") files := renderer.ThemeConfig.GetStringSlice("views.vehicles_management.fleet_display.files")
state := NewState(r, renderer.ThemeConfig, vehiclesmanagementMenu) state := NewState(r, renderer.ThemeConfig, vehiclesmanagementMenu)
state.ViewState = map[string]any{ state.ViewState = map[string]any{
"vehicle": vehicle, "vehicle": vehicle,
"diags": diags,
} }
renderer.Render("fleet display vehicle", w, r, files, state) renderer.Render("fleet display vehicle", w, r, files, state)
@@ -68,7 +64,7 @@ func (renderer *Renderer) VehiclesFleetUpdate(w http.ResponseWriter, r *http.Req
renderer.Render("fleet display vehicle", w, r, files, state) renderer.Render("fleet display vehicle", w, r, files, state)
} }
func (renderer *Renderer) VehicleManagementBookingDisplay(w http.ResponseWriter, r *http.Request, booking any, vehicle any, beneficiary any, group any, documents []filestorage.FileInfo, file_types_map map[string]string, alternative_vehicles []any, diags []any) { func (renderer *Renderer) VehicleManagementBookingDisplay(w http.ResponseWriter, r *http.Request, booking any, vehicle any, beneficiary any, group any, documents []filestorage.FileInfo, file_types_map map[string]string, alternative_vehicles []any) {
files := renderer.ThemeConfig.GetStringSlice("views.vehicles_management.booking_display.files") files := renderer.ThemeConfig.GetStringSlice("views.vehicles_management.booking_display.files")
state := NewState(r, renderer.ThemeConfig, vehiclesmanagementMenu) state := NewState(r, renderer.ThemeConfig, vehiclesmanagementMenu)
state.ViewState = map[string]any{ state.ViewState = map[string]any{
@@ -79,7 +75,6 @@ func (renderer *Renderer) VehicleManagementBookingDisplay(w http.ResponseWriter,
"documents": documents, "documents": documents,
"file_types_map": file_types_map, "file_types_map": file_types_map,
"alternative_vehicles": alternative_vehicles, "alternative_vehicles": alternative_vehicles,
"diags": diags,
} }
renderer.Render("vehicles search", w, r, files, state) renderer.Render("vehicles search", w, r, files, state)
@@ -94,4 +89,4 @@ func (renderer *Renderer) UnbookingVehicle(w http.ResponseWriter, r *http.Reques
renderer.Render("vehicule unbooking", w, r, files, state) renderer.Render("vehicule unbooking", w, r, files, state)
} }

View File

@@ -52,7 +52,7 @@ func (renderer *Renderer) VehiclesSearch(w http.ResponseWriter, r *http.Request,
renderer.Render("vehicles search", w, r, files, state) renderer.Render("vehicles search", w, r, files, state)
} }
func (renderer *Renderer) VehicleBookingDisplay(w http.ResponseWriter, r *http.Request, booking any, vehicle any, beneficiary any, group any, documents []filestorage.FileInfo, file_types_map map[string]string, diags []any) { func (renderer *Renderer) VehicleBookingDisplay(w http.ResponseWriter, r *http.Request, booking any, vehicle any, beneficiary any, group any, documents []filestorage.FileInfo, file_types_map map[string]string) {
files := renderer.ThemeConfig.GetStringSlice("views.vehicles.booking_display.files") files := renderer.ThemeConfig.GetStringSlice("views.vehicles.booking_display.files")
state := NewState(r, renderer.ThemeConfig, vehiclesMenu) state := NewState(r, renderer.ThemeConfig, vehiclesMenu)
state.ViewState = map[string]any{ state.ViewState = map[string]any{
@@ -62,7 +62,6 @@ func (renderer *Renderer) VehicleBookingDisplay(w http.ResponseWriter, r *http.R
"group": group, "group": group,
"documents": documents, "documents": documents,
"file_types_map": file_types_map, "file_types_map": file_types_map,
"diags": diags,
} }
renderer.Render("vehicles search", w, r, files, state) renderer.Render("vehicles search", w, r, files, state)

View File

@@ -1,14 +1,8 @@
package services package services
import ( import (
"context"
"fmt"
"time"
agenda "git.coopgo.io/coopgo-platform/agenda/grpcapi" agenda "git.coopgo.io/coopgo-platform/agenda/grpcapi"
"git.coopgo.io/coopgo-platform/agenda/storage"
"google.golang.org/grpc" "google.golang.org/grpc"
"google.golang.org/protobuf/types/known/timestamppb"
) )
type AgendaService struct { type AgendaService struct {
@@ -27,39 +21,3 @@ func NewAgendaService(dial string) (*AgendaService, error) {
AgendaClient: client, AgendaClient: client,
}, nil }, nil
} }
func (s *ServicesHandler) GetAgendaEvents() ([]AgendaEvent, error) {
resp, err := s.GRPC.Agenda.GetEvents(context.TODO(), &agenda.GetEventsRequest{
Namespaces: []string{"parcoursmob_dispositifs"},
Mindate: timestamppb.New(time.Now().Add(-24 * time.Hour)),
})
if err != nil {
return nil, err
}
groups, err := s.GetGroupsMap()
if err != nil {
return nil, fmt.Errorf("error in groups request : %w", err)
}
events := []AgendaEvent{}
for _, e := range resp.Events {
newEvent := AgendaEvent{
Event: e.ToStorageType(),
}
for _, o := range e.Owners {
newEvent.OwnersGroups = append(newEvent.OwnersGroups, GroupsManagementGroup{Group: groups[o]})
}
events = append(events, newEvent)
}
return events, nil
}
// Enriched types
type AgendaEvent struct {
OwnersGroups []GroupsManagementGroup
storage.Event
}

View File

@@ -1,55 +0,0 @@
package services
import (
"context"
// "time"
diags "git.coopgo.io/coopgo-platform/diags/grpcapi"
"git.coopgo.io/coopgo-platform/diags/storage"
"google.golang.org/grpc"
// "google.golang.org/protobuf/types/known/timestamppb"
)
type DiagsService struct {
diags.DiagsClient
}
func NewDiagsService(dial string) (*DiagsService, error) {
conn, err := grpc.Dial(dial, grpc.WithInsecure())
client := diags.NewDiagsClient(conn)
if err != nil {
return nil, err
}
return &DiagsService{
DiagsClient: client,
}, nil
}
func (s *ServicesHandler) GetDiagsDiags() ([]DiagsDiag, error) {
resp, err := s.GRPC.Diags.GetDiags(context.TODO(), &diags.GetDiagsRequest{
Namespaces: []string{"parcoursmob_beneficiaires", "parcoursmob_diagnostiques"},
})
if err != nil {
return nil, err
}
diags := []DiagsDiag{}
for _, e := range resp.Diags {
newDiag := DiagsDiag{
Diag: e.ToStorageType(),
}
diags = append(diags, newDiag)
}
return diags, nil
}
// Enriched types
type DiagsDiag struct {
OwnersGroups []GroupsManagementGroup
storage.Diag
}

View File

@@ -2,12 +2,12 @@ package services
import ( import (
"context" "context"
"fmt"
"sort" "sort"
"git.coopgo.io/coopgo-apps/parcoursmob/utils/sorting" "git.coopgo.io/coopgo-apps/parcoursmob/utils/sorting"
fleets "git.coopgo.io/coopgo-platform/fleets/grpcapi" fleets "git.coopgo.io/coopgo-platform/fleets/grpcapi"
"git.coopgo.io/coopgo-platform/fleets/storage" "git.coopgo.io/coopgo-platform/fleets/storage"
"github.com/rs/zerolog/log"
"google.golang.org/grpc" "google.golang.org/grpc"
) )
@@ -62,7 +62,7 @@ func (s *ServicesHandler) GetVehiclesMap() (vehicles map[string]storage.Vehicle,
} }
resp, err := s.GRPC.Fleets.GetVehicles(context.TODO(), request) resp, err := s.GRPC.Fleets.GetVehicles(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
} else { } else {
for _, vehicle := range resp.Vehicles { for _, vehicle := range resp.Vehicles {
vehicles[vehicle.Id] = vehicle.ToStorageType() vehicles[vehicle.Id] = vehicle.ToStorageType()

View File

@@ -41,7 +41,7 @@ func (s *ServicesHandler) GetGroupsMap() (groups map[string]storage.Group, err e
return return
} }
// //////////////////////////////optimize the code////////////////////////////////////// ////////////////////////////////optimize the code//////////////////////////////////////
func (s *ServicesHandler) GetGroupsMemberMap(id string) (groups map[string]any, err error) { func (s *ServicesHandler) GetGroupsMemberMap(id string) (groups map[string]any, err error) {
groups = map[string]any{} groups = map[string]any{}
@@ -56,23 +56,3 @@ func (s *ServicesHandler) GetGroupsMemberMap(id string) (groups map[string]any,
} }
return return
} }
func (s *ServicesHandler) GetGroup(groupid string) (*storage.Group, error) {
groupresp, err := s.GRPC.GroupsManagement.GetGroup(context.TODO(), &groupsmanagement.GetGroupRequest{
Id: groupid,
Namespace: "parcoursmob_organizations",
})
if err != nil {
return nil, err
}
group := groupresp.Group.ToStorageType()
return &group, nil
}
// Enriched types
type GroupsManagementGroup struct {
storage.Group
}

View File

@@ -42,22 +42,6 @@ func (s *ServicesHandler) GetBeneficiaries() (accounts []storage.Account, err er
return return
} }
func (s *ServicesHandler) GetBeneficiariesMap() (accounts map[string]storage.Account, err error) {
accounts = map[string]storage.Account{}
request := &mobilityaccounts.GetAccountsRequest{
Namespaces: []string{"parcoursmob_beneficiaries"},
}
resp, err := s.GRPC.MobilityAccounts.GetAccounts(context.TODO(), request)
if err == nil {
for _, v := range resp.Accounts {
accounts[v.Id] = v.ToStorageType()
}
}
return
}
func (s *ServicesHandler) GetAccounts() (accounts []storage.Account, err error) { func (s *ServicesHandler) GetAccounts() (accounts []storage.Account, err error) {
accounts = []storage.Account{} accounts = []storage.Account{}
request := &mobilityaccounts.GetAccountsRequest{ request := &mobilityaccounts.GetAccountsRequest{

View File

@@ -5,8 +5,11 @@ import (
fleets "git.coopgo.io/coopgo-platform/fleets/grpcapi" fleets "git.coopgo.io/coopgo-platform/fleets/grpcapi"
groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi" groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi"
mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi" mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
diags "git.coopgo.io/coopgo-platform/diags/grpcapi" routing "git.coopgo.io/coopgo-platform/routing-service"
solidarityservice "git.coopgo.io/sbouaram/solidarity-service/servers/grpc/proto"
"github.com/spf13/viper" "github.com/spf13/viper"
"github.com/rs/zerolog/log"
) )
type ServicesHandler struct { type ServicesHandler struct {
@@ -14,11 +17,13 @@ type ServicesHandler struct {
} }
type GRPCServices struct { type GRPCServices struct {
MobilityAccounts mobilityaccounts.MobilityAccountsClient MobilityAccounts mobilityaccounts.MobilityAccountsClient
GroupsManagement groupsmanagement.GroupsManagementClient GroupsManagement groupsmanagement.GroupsManagementClient
Fleets fleets.FleetsClient Fleets fleets.FleetsClient
Agenda agenda.AgendaClient Agenda agenda.AgendaClient
Diags diags.DiagsClient SolidarityService solidarityservice.SolidarityServiceClient
Routing routing.RoutingService
} }
func NewServicesHandler(cfg *viper.Viper) (*ServicesHandler, error) { func NewServicesHandler(cfg *viper.Viper) (*ServicesHandler, error) {
@@ -27,7 +32,9 @@ func NewServicesHandler(cfg *viper.Viper) (*ServicesHandler, error) {
groupsManagementDial = cfg.GetString("services.grpc.groupsmanagement.dial") groupsManagementDial = cfg.GetString("services.grpc.groupsmanagement.dial")
fleetsDial = cfg.GetString("services.grpc.fleets.dial") fleetsDial = cfg.GetString("services.grpc.fleets.dial")
agendaDial = cfg.GetString("services.grpc.agenda.dial") agendaDial = cfg.GetString("services.grpc.agenda.dial")
diagsDial = cfg.GetString("services.grpc.diags.dial") solidarityDial = cfg.GetString("services.grpc.solidarityservice.dial")
routing_service_type = cfg.GetString("routing.type")
valhalla_base_url = cfg.GetString("routing.valhalla.base_url")
) )
mobilityAccounts, err := NewMobilityAccountService(mobilityAccountsDial) mobilityAccounts, err := NewMobilityAccountService(mobilityAccountsDial)
if err != nil { if err != nil {
@@ -49,8 +56,16 @@ func NewServicesHandler(cfg *viper.Viper) (*ServicesHandler, error) {
return nil, err return nil, err
} }
diagsSvc, err := NewDiagsService(diagsDial) solidarityService, err := NewSolidarityService(solidarityDial)
if err != nil { if err != nil {
return nil , err
}
routing, err := routing.NewRoutingService(routing_service_type, valhalla_base_url)
if err != nil {
log.Fatal().Err(err).Msg("Could not initiate the routing service")
return nil, err return nil, err
} }
@@ -60,7 +75,8 @@ func NewServicesHandler(cfg *viper.Viper) (*ServicesHandler, error) {
GroupsManagement: groupsManagement, GroupsManagement: groupsManagement,
Fleets: fleetsSvc, Fleets: fleetsSvc,
Agenda: agendaSvc, Agenda: agendaSvc,
Diags: diagsSvc, SolidarityService: solidarityService,
Routing: routing,
}, },
}, nil }, nil
} }

View File

@@ -0,0 +1,23 @@
package services
import (
solidarityservice "git.coopgo.io/sbouaram/solidarity-service/servers/grpc/proto"
"google.golang.org/grpc"
)
type SolidarityService struct {
solidarityservice.SolidarityServiceClient
}
func NewSolidarityService(silvermobiDial string) (*SolidarityService, error) {
conn, err := grpc.Dial(silvermobiDial, grpc.WithInsecure())
client := solidarityservice.NewSolidarityServiceClient(conn)
if err != nil {
return nil, err
}
return &SolidarityService{
SolidarityServiceClient: client,
}, nil
}

View File

@@ -6,7 +6,6 @@ import (
"net/http" "net/http"
groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi" groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi"
"github.com/rs/zerolog/log"
) )
const GroupKey ContextKey = "group" const GroupKey ContextKey = "group"
@@ -20,6 +19,7 @@ func (p *IdentificationProvider) GroupsMiddleware(next http.Handler) http.Handle
o, ok := session.Values["organization"] o, ok := session.Values["organization"]
if !ok || o == nil { if !ok || o == nil {
fmt.Println("no organization")
http.Redirect(w, r, "/auth/groups/", http.StatusFound) http.Redirect(w, r, "/auth/groups/", http.StatusFound)
return return
} }
@@ -29,7 +29,7 @@ func (p *IdentificationProvider) GroupsMiddleware(next http.Handler) http.Handle
claimgroups, ok := claims["groups"].([]any) claimgroups, ok := claims["groups"].([]any)
if !ok { if !ok {
log.Error().Msg("cast issue") fmt.Println("cast issue")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }

View File

@@ -4,14 +4,14 @@ import (
"context" "context"
"crypto/rand" "crypto/rand"
"encoding/base64" "encoding/base64"
"fmt"
"io" "io"
"net/http" "net/http"
"git.coopgo.io/coopgo-apps/parcoursmob/services" "git.coopgo.io/coopgo-apps/parcoursmob/services"
"git.coopgo.io/coopgo-apps/parcoursmob/utils/storage" "git.coopgo.io/coopgo-apps/parcoursmob/utils/storage"
"github.com/coreos/go-oidc/v3/oidc" "github.com/coreos/go-oidc"
"github.com/gorilla/sessions" "github.com/gorilla/sessions"
"github.com/rs/zerolog/log"
"github.com/spf13/viper" "github.com/spf13/viper"
"golang.org/x/oauth2" "golang.org/x/oauth2"
) )
@@ -40,27 +40,7 @@ func NewIdentificationProvider(cfg *viper.Viper, services *services.ServicesHand
provider, err := oidc.NewProvider(context.Background(), providerURL) provider, err := oidc.NewProvider(context.Background(), providerURL)
if err != nil { if err != nil {
var ( return nil, err
issuerUrl = cfg.GetString("identification.oidc.provider_config.issuer_url")
authUrl = cfg.GetString("identification.oidc.provider_config.auth_url")
tokenUrl = cfg.GetString("identification.oidc.provider_config.token_url")
userInfoUrl = cfg.GetString("identification.oidc.provider_config.user_info_url")
jwksUrl = cfg.GetString("identification.oidc.provider_config.jwks_url")
algorithms = []string{"RS256"}
)
if issuerUrl == "" || authUrl == "" || tokenUrl == "" || jwksUrl == "" {
return nil, err
}
providerConfig := oidc.ProviderConfig{
IssuerURL: issuerUrl,
AuthURL: authUrl,
TokenURL: tokenUrl,
UserInfoURL: userInfoUrl,
JWKSURL: jwksUrl,
Algorithms: algorithms,
}
provider = providerConfig.NewProvider(context.Background())
} }
oauth2Config := oauth2.Config{ oauth2Config := oauth2.Config{
@@ -91,18 +71,18 @@ func (p *IdentificationProvider) Middleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
session, err := p.SessionsStore.Get(r, "parcoursmob_session") session, err := p.SessionsStore.Get(r, "parcoursmob_session")
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
} }
if session.Values["idtoken"] == nil || session.Values["idtoken"] == "" { if session.Values["idtoken"] == nil || session.Values["idtoken"] == "" {
state, err := newState() state, err := newState()
if err != nil { if err != nil {
panic(err) panic(err)
} }
session.Values["state"] = state session.Values["state"] = state
session.Save(r, w) session.Save(r, w)
url := p.OAuth2Config.AuthCodeURL(state) http.Redirect(w, r, p.OAuth2Config.AuthCodeURL(state), http.StatusFound)
http.Redirect(w, r, url, http.StatusFound)
return return
} }
@@ -122,7 +102,7 @@ func (p *IdentificationProvider) Middleware(next http.Handler) http.Handler {
err = idtoken.Claims(&claims) err = idtoken.Claims(&claims)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
} }
ctx := context.WithValue(r.Context(), IdtokenKey, idtoken) ctx := context.WithValue(r.Context(), IdtokenKey, idtoken)

7
utils/models/models.go Normal file
View File

@@ -0,0 +1,7 @@
package internal
type SolidarityTransport struct {
Drivers []any
Beneficiaries []any
}

View File

@@ -1,12 +1,12 @@
package profilepictures package profilepictures
import ( import (
"fmt"
"image" "image"
"image/color" "image/color"
"image/draw" "image/draw"
"github.com/fogleman/gg" "github.com/fogleman/gg"
"github.com/rs/zerolog/log"
"golang.org/x/image/font" "golang.org/x/image/font"
"golang.org/x/image/math/fixed" "golang.org/x/image/math/fixed"
) )
@@ -21,7 +21,7 @@ func DefaultProfilePicture(initials string) *image.RGBA {
ff, err := gg.LoadFontFace("themes/default/web/fonts/bitter.ttf", 150.0) ff, err := gg.LoadFontFace("themes/default/web/fonts/bitter.ttf", 150.0)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return img return img
} }

View File

@@ -8,7 +8,6 @@ import (
"fmt" "fmt"
"time" "time"
"github.com/rs/zerolog/log"
"github.com/spf13/viper" "github.com/spf13/viper"
clientv3 "go.etcd.io/etcd/client/v3" clientv3 "go.etcd.io/etcd/client/v3"
"go.etcd.io/etcd/client/v3/namespace" "go.etcd.io/etcd/client/v3/namespace"
@@ -75,8 +74,9 @@ func NewEtcdHandler(cfg *viper.Viper) (*EtcdHandler, error) {
Password: password, Password: password,
DialTimeout: 5 * time.Second, DialTimeout: 5 * time.Second,
}) })
fmt.Println(endpoints,prefix,username,password)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return nil, err return nil, err
} }
@@ -93,7 +93,7 @@ func NewEtcdHandler(cfg *viper.Viper) (*EtcdHandler, error) {
func (s *EtcdHandler) Put(k string, v any) error { func (s *EtcdHandler) Put(k string, v any) error {
data, err := s.serializer.Serialize(v) data, err := s.serializer.Serialize(v)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return err return err
} }
// _, err = s.Client.KV.Put(context.TODO(), k, data.String()) // _, err = s.Client.KV.Put(context.TODO(), k, data.String())
@@ -101,7 +101,7 @@ func (s *EtcdHandler) Put(k string, v any) error {
_, err = s.Client.KV.Put(ctx, k, string(data)) _, err = s.Client.KV.Put(ctx, k, string(data))
cancel() cancel()
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return err return err
} }
return nil return nil
@@ -110,13 +110,13 @@ func (s *EtcdHandler) Put(k string, v any) error {
func (s *EtcdHandler) PutWithTTL(k string, v any, duration time.Duration) error { func (s *EtcdHandler) PutWithTTL(k string, v any, duration time.Duration) error {
lease, err := s.Client.Lease.Grant(context.TODO(), int64(duration.Seconds())) lease, err := s.Client.Lease.Grant(context.TODO(), int64(duration.Seconds()))
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return err return err
} }
data, err := s.serializer.Serialize(v) data, err := s.serializer.Serialize(v)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return err return err
} }
// _, err = s.Client.KV.Put(context.TODO(), k, data.String(), clientv3.WithLease(lease.ID)) // _, err = s.Client.KV.Put(context.TODO(), k, data.String(), clientv3.WithLease(lease.ID))
@@ -125,7 +125,7 @@ func (s *EtcdHandler) PutWithTTL(k string, v any, duration time.Duration) error
cancel() cancel()
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return err return err
} }
return nil return nil
@@ -136,14 +136,14 @@ func (s *EtcdHandler) Get(k string) (any, error) {
resp, err := s.Client.KV.Get(ctx, k) resp, err := s.Client.KV.Get(ctx, k)
cancel() cancel()
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return nil, err return nil, err
} }
for _, v := range resp.Kvs { for _, v := range resp.Kvs {
var data any var data any
err := s.serializer.Deserialize([]byte(v.Value), &data) err := s.serializer.Deserialize([]byte(v.Value), &data)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return nil, err return nil, err
} }
// We return directly as we want to last revision of value // We return directly as we want to last revision of value
@@ -157,7 +157,7 @@ func (s *EtcdHandler) Delete(k string) error {
_, err := s.Client.KV.Delete(ctx, k) _, err := s.Client.KV.Delete(ctx, k)
cancel() cancel()
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return err return err
} }
return nil return nil

View File

@@ -10,8 +10,6 @@ import (
const ( const (
PREFIX_BENEFICIARIES = "beneficiaries" PREFIX_BENEFICIARIES = "beneficiaries"
PREFIX_BOOKINGS = "fleets_bookings" PREFIX_BOOKINGS = "fleets_bookings"
PREFIX_AGENDA = "event_files"
PREFIX_DIAGS = "diags"
) )
type FileInfo struct { type FileInfo struct {

View File

@@ -2,12 +2,12 @@ package storage
import ( import (
"context" "context"
"fmt"
"io" "io"
"strings" "strings"
"github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials" "github.com/minio/minio-go/v7/pkg/credentials"
"github.com/rs/zerolog/log"
"github.com/spf13/viper" "github.com/spf13/viper"
) )
@@ -23,7 +23,7 @@ func NewMinioStorageHandler(cfg *viper.Viper) (*MinioStorageHandler, error) {
Secure: cfg.GetBool("storage.files.minio.use_ssl"), Secure: cfg.GetBool("storage.files.minio.use_ssl"),
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return nil, err return nil, err
} }
@@ -53,13 +53,13 @@ func (s *MinioStorageHandler) List(prefix string) []FileInfo {
for object := range objectCh { for object := range objectCh {
if object.Err != nil { if object.Err != nil {
log.Error().Str("prefix", prefix).Err(object.Err).Msg("Error listing files for prefix") fmt.Println("Error : ", object.Err)
continue continue
} }
objinfo, err := s.Client.StatObject(context.Background(), s.BucketName, object.Key, minio.StatObjectOptions{}) objinfo, err := s.Client.StatObject(context.Background(), s.BucketName, object.Key, minio.StatObjectOptions{})
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
continue continue
} }
@@ -82,12 +82,12 @@ func (s *MinioStorageHandler) List(prefix string) []FileInfo {
func (s *MinioStorageHandler) Get(prefix string, file string) (io.Reader, *FileInfo, error) { func (s *MinioStorageHandler) Get(prefix string, file string) (io.Reader, *FileInfo, error) {
object, err := s.Client.GetObject(context.Background(), s.BucketName, prefix+"/"+file, minio.GetObjectOptions{}) object, err := s.Client.GetObject(context.Background(), s.BucketName, prefix+"/"+file, minio.GetObjectOptions{})
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return nil, nil, err return nil, nil, err
} }
objinfo, err := s.Client.StatObject(context.Background(), s.BucketName, prefix+"/"+file, minio.StatObjectOptions{}) objinfo, err := s.Client.StatObject(context.Background(), s.BucketName, prefix+"/"+file, minio.StatObjectOptions{})
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return nil, nil, err return nil, nil, err
} }
@@ -117,7 +117,7 @@ func (s *MinioStorageHandler) Copy(src string, dst string) error {
_, err := s.Client.CopyObject(context.Background(), dstOpts, srcOpts) _, err := s.Client.CopyObject(context.Background(), dstOpts, srcOpts)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return err return err
} }
return nil return nil

View File

@@ -11,7 +11,6 @@ import (
"github.com/gorilla/securecookie" "github.com/gorilla/securecookie"
"github.com/gorilla/sessions" "github.com/gorilla/sessions"
"github.com/rs/zerolog/log"
) )
// Amount of time for cookies/kv keys to expire. // Amount of time for cookies/kv keys to expire.
@@ -77,7 +76,7 @@ func (s *SessionStore) Save(r *http.Request, w http.ResponseWriter, session *ses
// Marked for deletion. // Marked for deletion.
if session.Options.MaxAge <= 0 { if session.Options.MaxAge <= 0 {
if err := s.delete(r.Context(), session); err != nil { if err := s.delete(r.Context(), session); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return err return err
} }
http.SetCookie(w, sessions.NewCookie(session.Name(), "", session.Options)) http.SetCookie(w, sessions.NewCookie(session.Name(), "", session.Options))
@@ -88,13 +87,13 @@ func (s *SessionStore) Save(r *http.Request, w http.ResponseWriter, session *ses
} }
if err := s.save(r.Context(), session); err != nil { if err := s.save(r.Context(), session); err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return err return err
} }
encoded, err := securecookie.EncodeMulti(session.Name(), session.ID, s.Codecs...) encoded, err := securecookie.EncodeMulti(session.Name(), session.ID, s.Codecs...)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") fmt.Println(err)
return err return err
} }
http.SetCookie(w, sessions.NewCookie(session.Name(), encoded, session.Options)) http.SetCookie(w, sessions.NewCookie(session.Name(), encoded, session.Options))
@@ -105,11 +104,13 @@ func (s *SessionStore) Save(r *http.Request, w http.ResponseWriter, session *ses
// save stores the session in kv. // save stores the session in kv.
func (s *SessionStore) save(ctx context.Context, session *sessions.Session) error { func (s *SessionStore) save(ctx context.Context, session *sessions.Session) error {
m := make(map[string]interface{}, len(session.Values)) m := make(map[string]interface{}, len(session.Values))
fmt.Println(m)
for k, v := range session.Values { for k, v := range session.Values {
fmt.Println(v)
ks, ok := k.(string) ks, ok := k.(string)
if !ok { if !ok {
err := fmt.Errorf("non-string key value, cannot serialize session: %v", k) err := fmt.Errorf("non-string key value, cannot serialize session: %v", k)
log.Error().Err(err).Msg("") fmt.Println(err)
return err return err
} }
m[ks] = v m[ks] = v