Compare commits

...

55 Commits

Author SHA1 Message Date
Nicolas CARON 0a690cadf1 Add check in Diags home if its the same groupID
Build and Push Docker Image / build_and_push (push) Failing after 1m49s Details
2025-02-12 10:42:26 +01:00
Nicolas CARON d0fc96f8bb Add documents on diags
Build and Push Docker Image / build_and_push (push) Failing after 1m51s Details
2025-02-10 16:17:20 +01:00
Nicolas CARON 023f5c735d add Diagdate 2025-02-10 12:47:41 +01:00
Nicolas CARON a1adc028df edit DiagsHistory in diags handlers
Build and Push Docker Image / build_and_push (push) Failing after 1m37s Details
2024-12-18 16:00:38 +01:00
Nicolas CARON c7ac48d373 add namespace parcoursmob_bookings on diags handlers 2024-12-17 10:33:17 +01:00
Nicolas CARON f862440fd4 add namespace parcoursmob_bookings on diags handlers 2024-12-17 10:32:35 +01:00
Nicolas CARON 08cfe11814 Add VehicleBookingsCreateDiag - second route to create a diag in reservation
Build and Push Docker Image / build_and_push (push) Failing after 1m40s Details
2024-12-16 14:42:00 +01:00
Nicolas CARON 1f265ba4bd Add BookingsCreateDiag 2024-12-16 12:37:40 +01:00
Nicolas CARON 1162f2faf2 Add VehiclesCreateDiag 2024-12-10 16:14:43 +01:00
Nicolas CARON 7665fc75a0 Edit diags handlers 2024-12-04 18:21:29 +01:00
Nicolas CARON 42f33a17dd Add module diags in menu 2024-12-04 17:27:38 +01:00
Nicolas CARON 064cb2df16 Edit beneficiaries handler to show diags related to a beneficiary 2024-12-04 16:16:30 +01:00
Nicolas CARON 1c4371b121 Edit beneficiaries handlers to show diags 2024-12-04 14:11:49 +01:00
Nicolas CARON a2a3ac5ffe add diags services 2024-12-04 09:23:45 +01:00
Nicolas CARON e81399eef4 Add diags 2024-12-02 08:58:40 +01:00
Nicolas CARON cfb9a645dd add diags services 2024-11-27 15:54:33 +01:00
Arnaud Delcasse d46f62d92a fix issues in groups members management
Build and Push Docker Image / build_and_push (push) Failing after 1m26s Details
2024-11-21 23:11:59 +01:00
Arnaud Delcasse dd30d7959b Add ICS calendars (global and organizations)
Build and Push Docker Image / build_and_push (push) Failing after 1m24s Details
2024-11-21 00:54:52 +01:00
Arnaud Delcasse 5f12bed2d4 Add beneficiaries informations to bookings list
Build and Push Docker Image / build_and_push (push) Failing after 1m25s Details
2024-11-19 15:53:40 +01:00
Arnaud Delcasse 2f760733af Add ReplyTo header when sending email tu support
Build and Push Docker Image / build_and_push (push) Failing after 1m41s Details
2024-11-19 15:21:31 +01:00
Arnaud Delcasse 1df56a4f83 Remove all fmr.Println and add zerolog logging
Build and Push Docker Image / build_and_push (push) Failing after 1m42s Details
2024-11-11 20:07:00 +01:00
Arnaud Delcasse a8acc9950a Remove all fmr.Println and add zerolog logging
Build and Push Docker Image / build_and_push (push) Failing after 1m52s Details
2024-11-11 19:50:17 +01:00
Arnaud Delcasse a51f077358 resolve conflict
Build and Push Docker Image / build_and_push (push) Failing after 1m46s Details
2024-11-04 17:29:19 +01:00
Arnaud Delcasse 4fc08a35de Allow insecure HTTP for OIDC only in local in development mode 2024-11-04 17:24:02 +01:00
Nicolas CARON eaf866154e Update package git.coopgo.io
Build and Push Docker Image / build_and_push (push) Failing after 1m41s Details
2024-11-04 10:58:30 +01:00
Nicolas CARON 06f42947b9 run 'go mod tidy'
Build and Push Docker Image / build_and_push (push) Failing after 1m1s Details
2024-11-04 10:45:59 +01:00
Nicolas CARON acb5232b94 run 'go mod tidy'
Build and Push Docker Image / build_and_push (push) Failing after 55s Details
2024-11-04 10:43:24 +01:00
Nicolas CARON 8de170a009 add bookings on dashboard & kilometers on vehicles management
Build and Push Docker Image / build_and_push (push) Failing after 59s Details
2024-10-29 12:08:24 +01:00
Nicolas CARON a0557b0971 edit go.mod - comments all replace
Build and Push Docker Image / build_and_push (push) Failing after 58s Details
2024-10-28 10:05:31 +01:00
Nicolas CARON b4c59c7408 edit agenda handlers - delete logs
Build and Push Docker Image / build_and_push (push) Failing after 2m8s Details
2024-10-23 10:39:11 +02:00
Nicolas CARON 334351a0cf renderer agenda.go & handler agendo.go 2024-10-22 12:09:46 +02:00
Nicolas CARON 7184f4735c edit agenda handlers 2024-10-15 10:51:15 +02:00
Nicolas CARON 434be30074 add logical to add docs in event 2024-10-09 18:21:45 +02:00
Arnaud Delcasse 498b12de18 fix dependencies in go.mod
Build and Push Docker Image / build_and_push (push) Failing after 54s Details
2024-05-20 17:25:31 +02:00
Nicolas CARON b77403c674 test actions
Build and Push Docker Image / build_and_push (push) Failing after 53s Details
2024-04-10 09:18:24 +02:00
Nicolas CARON f7cb9f1116 test actions
Build and Push Docker Image / build_and_push (push) Failing after 26s Details
2024-04-05 12:22:22 +02:00
Nicolas CARON 2aec61e520 Merge branch 'dev' of https://git.coopgo.io/coopgo-apps/parcoursmob into dev 2024-04-04 12:24:59 +02:00
Nicolas CARON 73586aa61a add .gitea/worflows/build.yml 2024-04-04 12:24:21 +02:00
mfrigo a636b54a94 [+] Correction for véhicule partages 2023-12-08 13:29:25 +01:00
mfrigo 7c73c1d233 Merge branch 'dev' of https://git.coopgo.io/coopgo-apps/parcoursmob into dev 2023-11-24 17:06:12 +01:00
mfrigo 7a31b0ceb2 [+] merge main.go 2023-11-24 17:04:10 +01:00
mfrigo 2274f8d6d0 [+] bug fix regarding booking-list 2023-11-24 16:27:34 +01:00
mfrigo 4229c13b6b Implemented functional "Actions réalisées"
- Added events and vehicles inside it
- Included dates, characteristics, and names of events/vehicles
- Introduced color-coded badges to indicate the status of events/vehicles (ongoing or not)
2023-10-23 09:45:57 +02:00
mfrigo 100ffbe05a delete themes.zip 2023-09-06 13:32:49 +02:00
mfrigo 0f50b5e678 [+] adding in beneficiary-events the agenda-widget 2023-09-06 13:28:02 +02:00
sbouaram 0e00a839a3 agenda dispositifs exports 2023-05-30 09:06:48 +02:00
sbouaram c354bece5f refactoring groupcache 2023-05-19 10:58:37 +02:00
sbouaram 6299a6c7be cache refactoring 2023-05-19 10:06:30 +02:00
sbouaram 718c39de00 refactoring 2023-05-16 08:40:05 +02:00
sbouaram 9f66851529 adding groupcache 2023-05-15 14:49:00 +02:00
sbouaram aa13d60ca6 AdministrationGroupInviteMember 2023-04-25 04:37:20 -04:00
sbouaram d169566cd1 administration create group 2023-04-24 05:36:57 -04:00
root b54961b619 handlers/administration goroutines 2023-04-20 19:14:00 +03:00
root c34d08ff70 go routines /handlers/application/journeys 2023-04-20 15:28:27 +03:00
root 46a72e1aef api/cache 2023-04-20 13:14:25 +03:00
82 changed files with 2503 additions and 1239 deletions

View File

@ -0,0 +1,81 @@
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}}

8
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/parcoursmob.iml" filepath="$PROJECT_DIR$/.idea/parcoursmob.iml" />
</modules>
</component>
</project>

9
.idea/parcoursmob.iml Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="Go" enabled="true" />
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

7
.idea/vcs.xml Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
<mapping directory="$PROJECT_DIR$/themes" vcs="Git" />
</component>
</project>

0
Dockerfile Normal file → Executable file
View File

0
README.md Normal file → Executable file
View File

0
config.go Normal file → Executable file
View File

115
go.mod Normal file → Executable file
View File

@ -1,6 +1,6 @@
module git.coopgo.io/coopgo-apps/parcoursmob module git.coopgo.io/coopgo-apps/parcoursmob
go 1.18 go 1.22.8
// replace git.coopgo.io/coopgo-platform/mobility-accounts => ../../coopgo-platform/mobility-accounts/ // replace git.coopgo.io/coopgo-platform/mobility-accounts => ../../coopgo-platform/mobility-accounts/
@ -13,101 +13,114 @@ go 1.18
// 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.11.0
github.com/google/uuid v1.3.0 github.com/google/uuid v1.6.0
github.com/gorilla/mux v1.8.0 github.com/gorilla/mux v1.8.0
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.13.0 github.com/spf13/viper v1.19.0
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.4 go.etcd.io/etcd/client/v3 v3.5.12
golang.org/x/image v0.5.0 golang.org/x/image v0.5.0
golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 golang.org/x/oauth2 v0.23.0
google.golang.org/grpc v1.48.0 google.golang.org/grpc v1.68.0
google.golang.org/protobuf v1.28.1 google.golang.org/protobuf v1.35.2
) )
require ( require (
git.coopgo.io/coopgo-platform/agenda v0.0.0-20230310121901-ef3add576f86 git.coopgo.io/coopgo-platform/agenda v1.0.0
git.coopgo.io/coopgo-platform/emailing v0.0.0-20221017030337-c71888d90c15 git.coopgo.io/coopgo-platform/emailing v0.0.0-20241119141913-9836b30191c1
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-20230329105908-a76c0412a386
github.com/arran4/golang-ical v0.3.1
github.com/coreos/go-oidc/v3 v3.11.0
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/ory/viper v1.7.5 github.com/rs/zerolog v1.33.0
github.com/xuri/excelize/v2 v2.7.1 github.com/xuri/excelize/v2 v2.7.1
) )
require ( require (
github.com/cespare/xxhash v1.1.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // 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/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.3.2 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect
github.com/dgraph-io/ristretto v0.0.3 // indirect
github.com/dustin/go-humanize v1.0.0 // indirect github.com/dustin/go-humanize v1.0.0 // indirect
github.com/fsnotify/fsnotify v1.5.4 // 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-playground/locales v0.14.0 // indirect github.com/go-playground/locales v0.14.0 // indirect
github.com/go-playground/universal-translator v0.18.0 // indirect github.com/go-playground/universal-translator v0.18.0 // 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.2 // indirect github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.1 // indirect github.com/golang/snappy v0.0.4 // 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/json-iterator/go v1.1.12 // indirect github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.15.9 // indirect github.com/klauspost/compress v1.17.7 // indirect
github.com/klauspost/cpuid/v2 v2.1.0 // indirect github.com/klauspost/cpuid/v2 v2.1.0 // indirect
github.com/leodido/go-urn v1.2.1 // indirect github.com/leodido/go-urn v1.2.1 // indirect
github.com/magiconair/properties v1.8.6 // indirect github.com/lib/pq v1.10.9 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mb0/wkt v0.0.0-20170420051526-a30afd545ee1 // indirect github.com/mb0/wkt v0.0.0-20170420051526-a30afd545ee1 // indirect
github.com/minio/md5-simd v1.1.2 // indirect github.com/minio/md5-simd v1.1.2 // indirect
github.com/minio/sha256-simd v1.0.0 // indirect github.com/minio/sha256-simd v1.0.0 // indirect
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect
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.0.0-20171201202039-1bf9dbcd8cbe // indirect github.com/montanaflynn/stats v0.7.1 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/pelletier/go-toml/v2 v2.0.5 // 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.4.0 // indirect github.com/rs/xid v1.5.0 // indirect
github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 // indirect github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 // indirect
github.com/sirupsen/logrus v1.9.0 // indirect github.com/sergi/go-diff v1.1.0 // indirect
github.com/spf13/afero v1.8.2 // indirect github.com/sirupsen/logrus v1.9.3 // indirect
github.com/spf13/cast v1.5.0 // indirect github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/jwalterweatherman v1.1.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.4.1 // indirect github.com/subosito/gotenv v1.6.0 // indirect
github.com/tidwall/pretty v1.1.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/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.1.1 // indirect github.com/xdg-go/scram v1.1.2 // indirect
github.com/xdg-go/stringprep v1.0.3 // 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-20181117223130-1be2e3e5546d // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
go.etcd.io/etcd/api/v3 v3.5.4 // indirect github.com/zclconf/go-cty v1.8.0 // indirect
go.etcd.io/etcd/client/pkg/v3 v3.5.4 // indirect go.etcd.io/etcd/api/v3 v3.5.12 // indirect
go.mongodb.org/mongo-driver v1.10.1 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.12 // indirect
go.uber.org/atomic v1.7.0 // indirect go.mongodb.org/mongo-driver v1.17.1 // indirect
go.uber.org/multierr v1.6.0 // indirect go.uber.org/atomic v1.9.0 // indirect
go.uber.org/zap v1.17.0 // indirect go.uber.org/multierr v1.9.0 // indirect
golang.org/x/crypto v0.8.0 // indirect go.uber.org/zap v1.21.0 // indirect
golang.org/x/net v0.9.0 // indirect golang.org/x/crypto v0.28.0 // indirect
golang.org/x/sync v0.1.0 // indirect golang.org/x/net v0.29.0 // indirect
golang.org/x/sys v0.7.0 // indirect golang.org/x/sync v0.8.0 // indirect
golang.org/x/text v0.9.0 // indirect golang.org/x/sys v0.27.0 // indirect
google.golang.org/appengine v1.6.7 // indirect golang.org/x/text v0.19.0 // indirect
google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // 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.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
) )

813
go.sum

File diff suppressed because it is too large Load Diff

0
handlers/api/api.go Normal file → Executable file
View File

81
handlers/api/cache.go Normal file → Executable file
View File

@ -2,50 +2,69 @@ 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"
) )
func (h APIHandler) GetCache(w http.ResponseWriter, r *http.Request) { func (h APIHandler) GetCache(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r) vars := mux.Vars(r)
cacheid := vars["cacheid"] cacheid := vars["cacheid"]
// Use a channel to synchronize the goroutines
d, err := h.cache.Get(cacheid) ch := make(chan []byte)
if err != nil { // Fetch data from cache asynchronously
fmt.Println(err) go func() {
w.WriteHeader(http.StatusNotFound) d, err := h.cache.Get(cacheid)
return if err != nil {
} log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusNotFound)
result := d ch <- nil
return
if data, ok := d.([]any); ok {
if limitsmin, ok := r.URL.Query()["limits.min"]; ok {
min, _ := strconv.Atoi(limitsmin[0])
if limitsmax, ok := r.URL.Query()["limits.max"]; ok {
max, _ := strconv.Atoi(limitsmax[0])
if max > len(data) {
result = data[min:]
} else {
result = data[min:max]
}
} else {
result = data[min:]
}
} }
var data []any
if val, ok := d.([]any); ok {
data = val
} else {
data = []any{d}
}
j := toJSON(data, w, r)
ch <- j // Signal that the data has been fetched successfully
close(ch)
}()
// wait for the JSON marshaling goroutine to finish
j := <-ch
if j == nil {
return // Stop processing if an error occurred
} }
// Send the JSON response to the client
j, err := json.Marshal(result)
if err != nil {
w.WriteHeader(http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
w.Write(j) w.Write(j)
<-ch
}
func toJSON(data []any, w http.ResponseWriter, r *http.Request) []byte {
result := data
if limitsmin, ok := r.URL.Query()["limits.min"]; ok {
min, _ := strconv.Atoi(limitsmin[0])
if limitsmax, ok := r.URL.Query()["limits.max"]; ok {
max, _ := strconv.Atoi(limitsmax[0])
if max > len(data) {
result = data[min:]
} else {
result = data[min:max]
}
} else {
result = data[min:]
}
}
j, err := json.Marshal(result)
if err != nil {
w.WriteHeader(http.StatusNotFound)
return nil
}
return j
} }

120
handlers/api/calendars.go Normal file
View File

@ -0,0 +1,120 @@
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()))
}

6
handlers/api/export.go Normal file → Executable file
View File

@ -8,6 +8,7 @@ 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
@ -48,7 +49,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 {
fmt.Println(err) log.Error().Err(err).Msg("Error getting cache")
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
return return
} }
@ -56,7 +57,6 @@ 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:
fmt.Println(prefix+k, " : ", v) // log.Trace().Str("key", prefix+k).Any("value", v).Msg("")
dest[prefix+k] = v dest[prefix+k] = v
} }
} }

6
handlers/api/geo.go Normal file → Executable file
View File

@ -3,13 +3,12 @@ package api
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"io/ioutil" "io"
"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"]
@ -29,8 +28,7 @@ func (h *APIHandler) GeoAutocomplete(w http.ResponseWriter, r *http.Request) {
defer resp.Body.Close() defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body) body, err := io.ReadAll(resp.Body)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }

13
handlers/api/oidc.go Normal file → Executable file
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 {
fmt.Println("Exchange error") log.Error().Err(err).Msg("Exchange error")
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -18,15 +18,14 @@ 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 {
fmt.Println("issue retrieving token") log.Error().Msg("Cannot retrieve ID 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 {
fmt.Println("not able to verify token") log.Error().Err(err).Msg("Not able to verify token")
fmt.Println(err)
w.WriteHeader(http.StatusUnauthorized) w.WriteHeader(http.StatusUnauthorized)
return return
} }
@ -42,7 +41,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 {
fmt.Println(err) log.Error().Err(err).Msg("Cannot save session")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }

284
handlers/application/administration.go Normal file → Executable file
View File

@ -8,6 +8,7 @@ import (
"io" "io"
"net/http" "net/http"
"sort" "sort"
"sync"
"time" "time"
"git.coopgo.io/coopgo-apps/parcoursmob/utils/identification" "git.coopgo.io/coopgo-apps/parcoursmob/utils/identification"
@ -23,83 +24,95 @@ 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"
) )
func (h *ApplicationHandler) Administration(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) Administration(w http.ResponseWriter, r *http.Request) {
var (
accounts, err := h.services.GetAccounts() wg sync.WaitGroup
if err != nil { accounts, beneficiaries []mobilityaccountsstorage.Account
fmt.Println(err) bookings []fleetsstorage.Booking
w.WriteHeader(http.StatusInternalServerError) accountsErr, beneficiariesErr, bookingsErr, groupsResponseErr, eventsResponseErr, groupsBatchErr error
return groups = []groupstorage.Group{}
} responses = []agendastorage.Event{}
groupsResponse *groupsmanagement.GetGroupsResponse
beneficiaries, err := h.services.GetBeneficiaries() eventsResponse *agenda.GetEventsResponse
if err != nil { groupids = []string{}
fmt.Println(err) groupsBatchResponse *groupsmanagement.GetGroupsBatchResponse
w.WriteHeader(http.StatusInternalServerError) )
return // Retrieve accounts in a goroutine
} wg.Add(1)
go func() {
bookings, err := h.services.GetBookings() defer wg.Done()
if err != nil { accounts, accountsErr = h.services.GetAccounts()
fmt.Println(err) }()
w.WriteHeader(http.StatusInternalServerError) // Retrieve beneficiaries in a goroutine
return wg.Add(1)
} go func() {
defer wg.Done()
request := &groupsmanagement.GetGroupsRequest{ beneficiaries, beneficiariesErr = h.services.GetBeneficiaries()
Namespaces: []string{"parcoursmob_organizations"}, }()
} // Retrieve bookings in a goroutine
wg.Add(1)
resp, err := h.services.GRPC.GroupsManagement.GetGroups(context.TODO(), request) go func() {
if err != nil { defer wg.Done()
fmt.Println(err) bookings, bookingsErr = h.services.GetBookings()
w.WriteHeader(http.StatusInternalServerError) }()
return // Retrieve groupsRequest in a goroutine
} wg.Add(1)
go func() {
var groups = []groupstorage.Group{} defer wg.Done()
request := &groupsmanagement.GetGroupsRequest{
for _, group := range resp.Groups { Namespaces: []string{"parcoursmob_organizations"},
g := group.ToStorageType()
groups = append(groups, g)
}
sort.Sort(sorting.GroupsByName(groups))
////////////////////////////////////add event////////////////////////////////////////////
rresp, err := h.services.GRPC.Agenda.GetEvents(context.TODO(), &agenda.GetEventsRequest{
Namespaces: []string{"parcoursmob_dispositifs"},
})
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
responses := []agendastorage.Event{}
groupids := []string{}
for _, e := range rresp.Events {
groupids = append(groupids, e.Owners...)
responses = append(responses, e.ToStorageType())
}
sort.Sort(sorting.EventsByStartdate(responses))
groupsresp, err := h.services.GRPC.GroupsManagement.GetGroupsBatch(context.TODO(), &groupsmanagement.GetGroupsBatchRequest{
Groupids: groupids,
})
groupps := map[string]any{}
if err == nil {
for _, g := range groupsresp.Groups {
groupps[g.Id] = g.ToStorageType()
} }
groupsResponse, groupsResponseErr = h.services.GRPC.GroupsManagement.GetGroups(context.TODO(), request)
for _, group := range groupsResponse.Groups {
g := group.ToStorageType()
groups = append(groups, g)
}
sort.Sort(sorting.GroupsByName(groups))
}()
// Retrieve Events in a goroutine
wg.Add(1)
go func() {
defer wg.Done()
eventsResponse, eventsResponseErr = h.services.GRPC.Agenda.GetEvents(context.TODO(), &agenda.GetEventsRequest{
Namespaces: []string{"parcoursmob_dispositifs"},
})
for _, e := range eventsResponse.Events {
groupids = append(groupids, e.Owners...)
responses = append(responses, e.ToStorageType())
}
sort.Sort(sorting.EventsByStartdate(responses))
}()
wg.Add(1)
// Retrieve groupsBatch in a goroutine
go func() {
defer wg.Done()
groupsBatchResponse, groupsBatchErr = h.services.GRPC.GroupsManagement.GetGroupsBatch(context.TODO(), &groupsmanagement.GetGroupsBatchRequest{
Groupids: groupids,
})
groupps := map[string]any{}
if groupsBatchErr == nil {
for _, g := range groupsBatchResponse.Groups {
groupps[g.Id] = g.ToStorageType()
}
}
}()
wg.Wait()
if accountsErr != nil || beneficiariesErr != nil || bookingsErr != nil || groupsResponseErr != nil || eventsResponseErr != nil {
log.Error().
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)
return
} }
h.Renderer.Administration(w, r, accounts, beneficiaries, groups, bookings, responses) h.Renderer.Administration(w, r, accounts, beneficiaries, groups, bookings, responses)
} }
@ -109,7 +122,7 @@ func (h *ApplicationHandler) AdministrationCreateGroup(w http.ResponseWriter, r
if r.FormValue("name") == "" { if r.FormValue("name") == "" {
fmt.Println("invalid name") log.Error().Str("name", r.FormValue("name")).Msg("Invalid name")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -136,7 +149,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 {
fmt.Println(err) log.Error().Err(err).Msg("Cannot create PB struct from data map")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -155,22 +168,23 @@ func (h *ApplicationHandler) AdministrationCreateGroup(w http.ResponseWriter, r
Namespace: "parcoursmob_roles", Namespace: "parcoursmob_roles",
}, },
} }
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 {
fmt.Println(err) log.Error().Err(err).Msg("Issue in Groups management service - AddGroup")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
}()
// Create the admin role for the organization // Create the admin role for the organization
_, err = h.services.GRPC.GroupsManagement.AddGroup(context.TODO(), request_role) go func() {
if err != nil { _, err = h.services.GRPC.GroupsManagement.AddGroup(context.TODO(), request_role)
fmt.Println(err) if err != nil {
w.WriteHeader(http.StatusInternalServerError) log.Error().Err(err).Msg("Issue in Groups management service - AddGroup")
return w.WriteHeader(http.StatusInternalServerError)
} return
}
}()
http.Redirect(w, r, fmt.Sprintf("/app/administration/groups/%s", groupid), http.StatusFound) http.Redirect(w, r, fmt.Sprintf("/app/administration/groups/%s", groupid), http.StatusFound)
return return
} }
@ -187,14 +201,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 {
fmt.Println(err) log.Error().Err(err).Msg("Issue in Groups management service - GetGroup")
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 {
fmt.Println(err) log.Error().Err(err).Msg("inssue retrieving group members")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -205,52 +219,49 @@ func (h *ApplicationHandler) AdministrationGroupDisplay(w http.ResponseWriter, r
func (h *ApplicationHandler) AdministrationGroupInviteAdmin(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) AdministrationGroupInviteAdmin(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r) vars := mux.Vars(r)
groupid := vars["groupid"] groupid := vars["groupid"]
var (
groupresp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), &groupsmanagement.GetGroupRequest{ groupresp *groupsmanagement.GetGroupResponse
accountresp *accounts.GetAccountUsernameResponse
err error
)
groupresp, err = h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), &groupsmanagement.GetGroupRequest{
Id: groupid, Id: groupid,
Namespace: "parcoursmob_organizations", Namespace: "parcoursmob_organizations",
}) })
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("Issue in Groups management service - GetGroup")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
r.ParseForm() r.ParseForm()
accountresp, err := h.services.GRPC.MobilityAccounts.GetAccountUsername(context.TODO(), &accounts.GetAccountUsernameRequest{ accountresp, err = h.services.GRPC.MobilityAccounts.GetAccountUsername(context.TODO(), &accounts.GetAccountUsernameRequest{
Username: r.FormValue("username"), Username: r.FormValue("username"),
Namespace: "parcoursmob", Namespace: "parcoursmob",
}) })
if err == nil { if err == nil {
log.Print("account exists")
// 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)
_, err = h.services.GRPC.MobilityAccounts.UpdateData( if _, err = h.services.GRPC.MobilityAccounts.UpdateData(context.TODO(), &accounts.UpdateDataRequest{Account: as}); err != nil {
context.TODO(), log.Error().Err(err).Msg("could not set groups to user account")
&accounts.UpdateDataRequest{ w.WriteHeader(http.StatusInternalServerError)
Account: as, return
}, }
)
fmt.Println(err)
data := map[string]any{ data := map[string]any{
"group": groupresp.Group.ToStorageType().Data["name"], "group": groupresp.Group.ToStorageType().Data["name"],
} }
if err := h.emailing.Send("onboarding.existing_administrator", r.FormValue("username"), data); err != nil { if err := h.emailing.Send("onboarding.existing_administrator", r.FormValue("username"), data); err != nil {
fmt.Println(err) log.Error().Err(err).Msg("Cannot send email")
} }
http.Redirect(w, r, fmt.Sprintf("/app/administration/groups/%s", groupid), http.StatusFound)
return
} else { } else {
// Onboard now administrator // Onboard now administrator
onboarding := map[string]any{ onboarding := map[string]any{
@ -261,7 +272,7 @@ func (h *ApplicationHandler) AdministrationGroupInviteAdmin(w http.ResponseWrite
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 {
fmt.Println(err) log.Error().Err(err).Msg("Issue creating random bytes")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -275,40 +286,29 @@ func (h *ApplicationHandler) AdministrationGroupInviteAdmin(w http.ResponseWrite
} }
if err := h.emailing.Send("onboarding.new_administrator", r.FormValue("username"), data); err != nil { if err := h.emailing.Send("onboarding.new_administrator", r.FormValue("username"), data); err != nil {
fmt.Println(err) log.Error().Err(err).Msg("Cannot send email")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
} }
http.Redirect(w, r, fmt.Sprintf("/app/administration/groups/%s", groupid), http.StatusFound) http.Redirect(w, r, fmt.Sprintf("/app/administration/groups/%s", groupid), http.StatusFound)
return
} }
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)
groupresp, err := h.services.GRPC.GroupsManagement.GetGroup(context.TODO(), &groupsmanagement.GetGroupRequest{
Id: groupid,
Namespace: "parcoursmob_organizations",
})
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("Issue in Groups management service - GetGroup")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
group := groupresp.Group.ToStorageType()
r.ParseForm() r.ParseForm()
accountresp, err := h.services.GRPC.MobilityAccounts.GetAccountUsername(context.TODO(), &accounts.GetAccountUsernameRequest{ accountresp, err := h.services.GRPC.MobilityAccounts.GetAccountUsername(context.TODO(), &accounts.GetAccountUsernameRequest{
Username: r.FormValue("username"), Username: r.FormValue("username"),
Namespace: "parcoursmob", Namespace: "parcoursmob",
}) })
if err == nil { if err == nil {
account := accountresp.Account.ToStorageType() account := accountresp.Account.ToStorageType()
account.Data["groups"] = append(account.Data["groups"].([]any), group.ID) account.Data["groups"] = append(account.Data["groups"].([]any), group.ID)
@ -321,21 +321,18 @@ func (h *ApplicationHandler) AdministrationGroupInviteMember(w http.ResponseWrit
Account: as, Account: as,
}, },
) )
fmt.Println(err)
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 {
fmt.Println(err) 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 // return
} else { } else {
// Onboard now administrator // Onboard new administrator
onboarding := map[string]any{ onboarding := map[string]any{
"username": r.FormValue("username"), "username": r.FormValue("username"),
"group": group.ID, "group": group.ID,
@ -344,28 +341,24 @@ func (h *ApplicationHandler) AdministrationGroupInviteMember(w http.ResponseWrit
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 {
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
key := base64.RawURLEncoding.EncodeToString(b) key := base64.RawURLEncoding.EncodeToString(b)
h.cache.PutWithTTL("onboarding/"+key, onboarding, 168*time.Hour) // 1 week TTL h.cache.PutWithTTL("onboarding/"+key, onboarding, 168*time.Hour) // 1 week TTL
data := map[string]any{ data := map[string]any{
"group": group.Data["name"], "group": group.Data["name"],
"key": key, "key": key,
} }
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 {
fmt.Println(err) log.Error().Err(err).Msg("error sending email onboarding.new_member")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return 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 {
@ -386,7 +379,6 @@ 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{
@ -394,7 +386,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 {
fmt.Println(err) log.Error().Err(err).Msg("Issue in Fleets service - GetVehicles")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
} }
@ -432,7 +424,7 @@ func (h ApplicationHandler) AdminStatVehicles(w http.ResponseWriter, r *http.Req
Groupids: administrators, Groupids: administrators,
}) })
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("Issue in Groups management service - GetGroupsBatch")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -448,7 +440,6 @@ 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{}
@ -457,7 +448,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 {
fmt.Println(err) log.Error().Err(err).Msg("Issue in Fleets service - GetVehicles")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -483,7 +474,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 {
fmt.Println(err) log.Error().Err(err).Msg("Issue in Groups management service - GetGroups")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -496,7 +487,7 @@ func (h ApplicationHandler) AdminStatBookings(w http.ResponseWriter, r *http.Req
Accountids: beneficiaries_ids, Accountids: beneficiaries_ids,
}) })
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("Issue in Mobility accounts service - GetAccountsBatch")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -525,7 +516,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 {
fmt.Println(err) log.Error().Err(err).Msg("Cannot get members")
return nil, nil, err return nil, nil, err
} }
} }
@ -551,7 +542,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 {
fmt.Println(err) log.Error().Err(err).Msg("Cannot get beneficiaries")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -564,9 +555,8 @@ 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 {
fmt.Println(err) log.Error().Err(err).Msg("Issue in Agenda service - GetEvents")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }

169
handlers/application/agenda.go Normal file → Executable file
View File

@ -4,6 +4,7 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io"
"net/http" "net/http"
"sort" "sort"
"strconv" "strconv"
@ -13,12 +14,15 @@ 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"
) )
@ -43,7 +47,7 @@ func (h *ApplicationHandler) AgendaHome(w http.ResponseWriter, r *http.Request)
}) })
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -78,7 +82,7 @@ func (h *ApplicationHandler) AgendaHistory(w http.ResponseWriter, r *http.Reques
}) })
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -119,11 +123,13 @@ func (h *ApplicationHandler) AgendaCreateEvent(w http.ResponseWriter, r *http.Re
eventForm, err := parseEventsForm(r) eventForm, err := parseEventsForm(r)
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("")
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,
}) })
@ -147,17 +153,52 @@ 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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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) {
@ -170,7 +211,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -181,7 +222,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -208,7 +249,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -237,19 +278,24 @@ func (h *ApplicationHandler) AgendaDisplayEvent(w http.ResponseWriter, r *http.R
} }
} }
h.Renderer.AgendaDisplayEvent(w, r, resp.Event.ToStorageType(), groupresp.Group.ToStorageType(), subscribers, accounts) documents := h.filestorage.List(filestorage.PREFIX_AGENDA + "/" + eventid)
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -257,7 +303,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -277,7 +323,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -290,7 +336,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -366,7 +412,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]
@ -376,7 +422,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -391,7 +437,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -422,7 +468,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -443,7 +489,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -473,7 +519,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -484,7 +530,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"]
@ -500,7 +546,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -522,14 +568,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -562,7 +608,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -583,18 +629,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
fmt.Println(mail) log.Debug().Str("mail", mail).Msg("Email content")
_, err := h.services.GRPC.Agenda.DeleteSubscription(context.TODO(), request) _, err := h.services.GRPC.Agenda.DeleteSubscription(context.TODO(), request)
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -605,7 +651,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)
@ -616,7 +662,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -627,7 +673,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -654,7 +700,6 @@ 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
} }
@ -685,3 +730,61 @@ 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)
}

2
handlers/application/application.go Normal file → Executable file
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" "github.com/coreos/go-oidc/v3/oidc"
"github.com/spf13/viper" "github.com/spf13/viper"
) )

235
handlers/application/beneficiaries.go Normal file → Executable file
View File

@ -8,7 +8,6 @@ import (
"fmt" "fmt"
"image/png" "image/png"
"io" "io"
"log"
"net/http" "net/http"
"sort" "sort"
"strconv" "strconv"
@ -20,13 +19,19 @@ import (
profilepictures "git.coopgo.io/coopgo-apps/parcoursmob/utils/profile-pictures" profilepictures "git.coopgo.io/coopgo-apps/parcoursmob/utils/profile-pictures"
"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"
agenda "git.coopgo.io/coopgo-platform/agenda/grpcapi"
agendastorage "git.coopgo.io/coopgo-platform/agenda/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"
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"
diags "git.coopgo.io/coopgo-platform/diags/grpcapi"
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"
) )
@ -41,11 +46,72 @@ type BeneficiariesForm struct {
Gender string `json:"gender"` Gender string `json:"gender"`
} }
type Event_Beneficiary interface {
Name() string
Date() time.Time
DateEnd() time.Time
Type() string
Db() string
ID() string
Icons() string
Status() int
}
type Event struct {
IDVal string
NameVal string
DateVal time.Time
DateEndVal time.Time
TypeVal string
DbVal string
Deleted bool
IconSet string
StatusVal int
}
func (e Event) Name() string {
return e.NameVal
}
func (e Event) Date() time.Time {
return e.DateVal
}
func (e Event) DateEnd() time.Time {
return e.DateEndVal
}
func (e Event) Type() string {
return e.TypeVal
}
func (e Event) ID() string {
return e.IDVal
}
func (e Event) Db() string {
return e.DbVal
}
func (e Event) Icons() string {
return e.IconSet
}
func (e Event) Status() int {
return e.StatusVal
}
func sortByDate(events []Event_Beneficiary) {
sort.Slice(events, func(i, j int) bool {
return events[i].Date().After(events[j].Date())
})
}
func (h *ApplicationHandler) BeneficiariesList(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) BeneficiariesList(w http.ResponseWriter, r *http.Request) {
accounts, err := h.beneficiaries(r) accounts, err := h.beneficiaries(r)
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -60,7 +126,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 {
fmt.Println("Create beneficiary : could not find group") log.Error().Msg("Create beneficiary : could not find group")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -71,14 +137,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -93,7 +159,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -106,7 +172,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -130,27 +196,142 @@ 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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
subscriptionrequest := &agenda.GetSubscriptionByUserRequest{
Subscriber: beneficiaryID,
}
subcriptionresp, err := h.services.GRPC.Agenda.GetSubscriptionByUser(context.TODO(), subscriptionrequest)
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
events := []agendastorage.Event{}
currentTime := time.Now().Truncate(24 * time.Hour)
for _, e := range subcriptionresp.Subscription {
eventresquest := &agenda.GetEventRequest{
Id: e.Eventid,
}
eventresp, err := h.services.GRPC.Agenda.GetEvent(context.TODO(), eventresquest)
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
events = append(events, eventresp.Event.ToStorageType())
}
sort.Sort(sorting.EventsByStartdate(events))
bookingsrequest := &fleets.GetDriverBookingsRequest{ bookingsrequest := &fleets.GetDriverBookingsRequest{
Driver: beneficiaryID, Driver: beneficiaryID,
} }
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
bookings := []any{} bookings := []fleetsstorage.Booking{}
for _, b := range bookingsresp.Bookings { for _, b := range bookingsresp.Bookings {
bookings = append(bookings, b.ToStorageType()) bookings = append(bookings, b.ToStorageType())
} }
var events_list []Event_Beneficiary
var status_event int
for _, e := range events {
if e.Startdate.After(currentTime) {
status_event = 1
} else if e.Startdate.Before(currentTime) && e.Enddate.After(currentTime) || e.Enddate.Equal(currentTime) {
status_event = 2
} else {
status_event = 3
}
event := Event{
NameVal: e.Name,
DateVal: e.Startdate,
DateEndVal: e.Enddate,
TypeVal: e.Type,
IDVal: e.ID,
DbVal: "/app/agenda/",
IconSet: "calendar",
StatusVal: status_event,
}
events_list = append(events_list, event)
}
var status_booking int
for _, b := range bookings {
if b.Enddate.After(currentTime) || b.Enddate.Equal(currentTime) {
GetVehiculeRequest := &fleets.GetVehicleRequest{
Vehicleid: b.Vehicleid,
}
GetVehiculeResp, err := h.services.GRPC.Fleets.GetVehicle(context.Background(), GetVehiculeRequest)
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
if b.Startdate.After(currentTime) {
status_booking = 1
} else if b.Startdate.Before(currentTime) && b.Enddate.After(currentTime) || b.Enddate.Equal(currentTime) {
status_booking = 2
} else {
status_booking = 3
}
event := Event{
NameVal: GetVehiculeResp.Vehicle.ToStorageType().Data["name"].(string),
DateVal: b.Startdate,
DateEndVal: b.Enddate,
TypeVal: "Réservation de véhicule",
IDVal: b.ID,
DbVal: "/app/vehicles-management/bookings/",
IconSet: "vehicle",
StatusVal: status_booking,
}
events_list = append(events_list, event)
}
}
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,
@ -158,7 +339,7 @@ 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 {
fmt.Println(err) log.Error().Err(err).Msg("")
} }
organizations := []any{} organizations := []any{}
@ -169,7 +350,11 @@ func (h *ApplicationHandler) BeneficiaryDisplay(w http.ResponseWriter, r *http.R
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")
h.Renderer.BeneficiaryDisplay(w, r, resp.Account.ToStorageType(), bookings, organizations, beneficiaries_file_types, file_types_map, documents) diagsAny := make([]any, len(diag))
for i, d := range diag {
diagsAny[i] = d
}
h.Renderer.BeneficiaryDisplay(w, r, resp.Account.ToStorageType(), bookings, organizations, beneficiaries_file_types, file_types_map, documents, events_list, diagsAny)
} }
func (h *ApplicationHandler) BeneficiaryUpdate(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) BeneficiaryUpdate(w http.ResponseWriter, r *http.Request) {
@ -180,14 +365,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -203,7 +388,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -219,7 +404,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -240,7 +425,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -253,13 +438,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.Println("unable to encode image.") log.Error().Err(err).Msg("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.Println("unable to write image.") log.Error().Err(err).Msg("unable to write image.")
} }
} }
@ -275,7 +460,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
return return
} }
defer file.Close() defer file.Close()
@ -287,8 +472,10 @@ 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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -304,14 +491,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -333,6 +520,8 @@ func filterAccount(r *http.Request, a *mobilityaccounts.Account) bool {
return true return true
} }
// func BeneficiariesEventList()
func (h *ApplicationHandler) beneficiaries(r *http.Request) ([]mobilityaccountsstorage.Account, error) { func (h *ApplicationHandler) beneficiaries(r *http.Request) ([]mobilityaccountsstorage.Account, error) {
var accounts = []mobilityaccountsstorage.Account{} var accounts = []mobilityaccountsstorage.Account{}
g := r.Context().Value(identification.GroupKey) g := r.Context().Value(identification.GroupKey)

28
handlers/application/dashboard.go Normal file → Executable file
View File

@ -2,7 +2,6 @@ package application
import ( import (
"context" "context"
"fmt"
"net/http" "net/http"
"sort" "sort"
@ -10,8 +9,11 @@ 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"
) )
@ -31,7 +33,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -54,7 +56,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -68,12 +70,26 @@ func (h *ApplicationHandler) Dashboard(w http.ResponseWriter, r *http.Request) {
Mindate: timestamppb.Now(), Mindate: timestamppb.Now(),
}) })
for _, e := range eventsresp.Events { if err == nil {
events = append(events, e.ToStorageType()) for _, e := range eventsresp.Events {
events = append(events, e.ToStorageType())
}
} }
sort.Sort(sorting.EventsByStartdate(events)) sort.Sort(sorting.EventsByStartdate(events))
h.Renderer.Dashboard(w, r, accounts, count, count_members, events) bookings := []fleetstorage.Booking{}
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

@ -0,0 +1,642 @@
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)
events_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(), events_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)
}

0
handlers/application/directory.go Normal file → Executable file
View File

14
handlers/application/group.go Normal file → Executable file
View File

@ -4,7 +4,6 @@ import (
"context" "context"
"crypto/rand" "crypto/rand"
"encoding/base64" "encoding/base64"
"fmt"
"io" "io"
"net/http" "net/http"
"time" "time"
@ -12,6 +11,7 @@ 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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -81,14 +81,16 @@ func (h *ApplicationHandler) GroupSettingsInviteMember(w http.ResponseWriter, r
}, },
) )
fmt.Println(err) if err != nil {
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
} }
http.Redirect(w, r, "/app/group/settings", http.StatusFound) http.Redirect(w, r, "/app/group/settings", http.StatusFound)
@ -103,7 +105,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -117,7 +119,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }

21
handlers/application/group_module.go Normal file → Executable file
View File

@ -14,6 +14,7 @@ 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,7 +46,7 @@ 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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -73,14 +74,12 @@ 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
} }
@ -96,7 +95,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -111,7 +110,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -145,7 +144,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -186,7 +185,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -201,7 +200,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -212,7 +211,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }

218
handlers/application/journeys.go Normal file → Executable file
View File

@ -17,6 +17,7 @@ import (
"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/structpb" "google.golang.org/protobuf/types/known/structpb"
@ -27,12 +28,17 @@ var Arrive any
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 (
journeys_results *navitia.JourneyResults
carpool_results any
vehicle_results []any
)
vehiclech := make(chan []any, 1)
navitiaCh := make(chan *navitia.JourneyResults, 1)
carpoolCh := make(chan any, 1)
locTime, errTime := time.LoadLocation("Europe/Paris") locTime, errTime := time.LoadLocation("Europe/Paris")
if errTime != nil { if errTime != nil {
fmt.Println("Loading timezone location Europe/Paris error : ") log.Panic().Err(errTime).Msg("Tried to load timezone location Europe/Paris. Error. Missing zones in container ?")
fmt.Println("Missing zones in container ? ")
panic(errTime)
} }
departuredate := r.FormValue("departuredate") departuredate := r.FormValue("departuredate")
@ -59,102 +65,112 @@ 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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TODO make it a library journeysRequest := func() {
session, _ := navitia.NewCustom( //TODO make it a library
h.config.GetString("services.navitia.api_key"), session, _ := navitia.NewCustom(
"https://api.navitia.io/v1", h.config.GetString("services.navitia.api_key"),
&http.Client{}) "https://api.navitia.io/v1",
if err != nil { &http.Client{})
fmt.Println(err)
w.WriteHeader(http.StatusBadRequest)
return
}
request := navitia.JourneyRequest{
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])),
Date: departuredatetime.Add(-2 * time.Hour),
DateIsArrival: false, //TODO
}
journeys, err = session.Journeys(context.Background(), request)
if err != nil {
fmt.Println(err)
// w.WriteHeader(http.StatusBadRequest)
// return
}
//CARPOOL
// carpoolrequest := fmt.Sprintf(
// "https://api.rdex.ridygo.fr/journeys.json?p[driver][state]=1&frequency=punctual&p[passenger][state]=0&p[from][latitude]=%f&p[from][longitude]=%f&p[to][latitude]=%f&p[to][longitude]=%f&p[outward][mindate]=%s&p[outward][maxdate]=%s",
// departuregeo.Geometry.Point[1], departuregeo.Geometry.Point[0],
// destinationgeo.Geometry.Point[1], destinationgeo.Geometry.Point[0],
// departuredatetime.Format("2006-01-02"), departuredatetime.Add(24*time.Hour).Format("2006-01-02"))
carpoolrequest := "https://api.rdex.ridygo.fr/journeys.json"
client := &http.Client{}
req, err := http.NewRequest("GET", carpoolrequest, nil)
if err != nil {
fmt.Println(err)
}
req.URL.RawQuery = fmt.Sprintf(
"p[driver][state]=1&frequency=punctual&p[passenger][state]=0&p[from][latitude]=%f&p[from][longitude]=%f&p[to][latitude]=%f&p[to][longitude]=%f&p[outward][mindate]=%s&p[outward][maxdate]=%s",
departuregeo.Geometry.Point[1], departuregeo.Geometry.Point[0],
destinationgeo.Geometry.Point[1], destinationgeo.Geometry.Point[0],
departuredatetime.Format("2006-01-02"), departuredatetime.Format("2006-01-02"))
req.Header.Set("X-API-KEY", "123456")
resp, err := client.Do(req)
if err != nil {
fmt.Println(err)
}
if err == nil && resp.StatusCode == http.StatusOK {
err = json.NewDecoder(resp.Body).Decode(&carpoolresults)
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusBadRequest)
navitiaCh <- nil
return
} }
if carpoolresults == nil { request := navitia.JourneyRequest{
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])),
Date: departuredatetime.Add(-2 * time.Hour),
DateIsArrival: false, //TODO
}
journeys, err = session.Journeys(context.Background(), request)
if err != nil {
log.Error().Err(err).Msg("")
// w.WriteHeader(http.StatusBadRequest)
// return
}
navitiaCh <- journeys
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//CARPOOL
carpoolRequest := func() {
carpoolrequest := "https://api.rdex.ridygo.fr/journeys.json"
client := &http.Client{}
req, err := http.NewRequest("GET", carpoolrequest, nil)
if err != nil {
log.Error().Err(err).Msg("")
}
req.URL.RawQuery = fmt.Sprintf(
"p[driver][state]=1&frequency=punctual&p[passenger][state]=0&p[from][latitude]=%f&p[from][longitude]=%f&p[to][latitude]=%f&p[to][longitude]=%f&p[outward][mindate]=%s&p[outward][maxdate]=%s",
departuregeo.Geometry.Point[1], departuregeo.Geometry.Point[0],
destinationgeo.Geometry.Point[1], destinationgeo.Geometry.Point[0],
departuredatetime.Format("2006-01-02"), departuredatetime.Format("2006-01-02"))
req.Header.Set("X-API-KEY", "123456")
resp, err := client.Do(req)
if err != nil {
log.Error().Err(err).Msg("")
}
if err == nil && resp.StatusCode == http.StatusOK {
err = json.NewDecoder(resp.Body).Decode(&carpoolresults)
if err != nil {
log.Error().Err(err).Msg("")
}
if carpoolresults == nil {
carpoolresults = []any{}
}
} else {
carpoolresults = []any{} carpoolresults = []any{}
} }
} else { carpoolCh <- carpoolresults
carpoolresults = []any{}
} }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Vehicles // Vehicles
vehicleRequest := func() {
vehiclerequest := &fleets.GetVehiclesRequest{ vehiclerequest := &fleets.GetVehiclesRequest{
Namespaces: []string{"parcoursmob"}, Namespaces: []string{"parcoursmob"},
}
vehicleresp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), vehiclerequest)
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError)
}
for _, vehicle := range vehicleresp.Vehicles {
v := vehicle.ToStorageType()
if v.Free(departuredatetime.Add(-24*time.Hour), departuredatetime.Add(168*time.Hour)) {
vehicles = append(vehicles, v)
} }
vehicleresp, err := h.services.GRPC.Fleets.GetVehicles(context.TODO(), vehiclerequest)
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
}
for _, vehicle := range vehicleresp.Vehicles {
v := vehicle.ToStorageType()
if v.Free(departuredatetime.Add(-24*time.Hour), departuredatetime.Add(168*time.Hour)) {
vehicles = append(vehicles, v)
}
}
vehiclech <- vehicles
} }
go journeysRequest()
go carpoolRequest()
go vehicleRequest()
carpool_results = <-carpoolCh
journeys_results = <-navitiaCh
vehicle_results = <-vehiclech
} }
h.Renderer.JourneysSearch(w, r, carpoolresults, journeys, vehicles, searched, departuregeo, destinationgeo, departuredate, departuretime) h.Renderer.JourneysSearch(w, r, carpool_results, journeys_results, vehicle_results, searched, departuregeo, destinationgeo, departuredate, departuretime)
} }
type GroupsModule []groupstorage.Group type GroupsModule []groupstorage.Group
@ -173,7 +189,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -224,7 +240,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -241,14 +257,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -269,14 +285,14 @@ func (h *ApplicationHandler) CreateGroup(w http.ResponseWriter, r *http.Request)
if r.FormValue("name") == "" { if r.FormValue("name") == "" {
fmt.Println("invalid name") log.Error().Msg("invalid name")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
if r.FormValue("number") == "" { if r.FormValue("number") == "" {
fmt.Println("invalid number of personne") log.Error().Msg("invalid number of personne")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -313,7 +329,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -328,7 +344,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -340,7 +356,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -359,7 +375,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -396,7 +412,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -411,7 +427,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -437,7 +453,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -453,7 +469,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -468,7 +484,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 {
// fmt.Println(err) // log.Error().Err(err).Msg("")
// w.WriteHeader(http.StatusInternalServerError) // w.WriteHeader(http.StatusInternalServerError)
// return // return
// } // }
@ -482,12 +498,10 @@ 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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -510,7 +524,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -523,7 +537,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -533,7 +547,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 {
fmt.Println(errr) log.Error().Err(errr).Msg("Issue in groups management service - InsubscribeMember")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -550,7 +564,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }

19
handlers/application/members.go Normal file → Executable file
View File

@ -12,6 +12,7 @@ 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"
) )
@ -35,7 +36,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -54,7 +55,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -77,14 +78,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -100,7 +101,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -116,7 +117,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -160,7 +161,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -174,7 +175,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -195,7 +196,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }

17
handlers/application/support.go Normal file → Executable file
View File

@ -1,10 +1,11 @@
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 {
@ -15,7 +16,7 @@ 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 {
fmt.Println("no current user claims") log.Error().Msg("no current user claims")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -23,15 +24,21 @@ func (h *ApplicationHandler) SupportSend(w http.ResponseWriter, r *http.Request)
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": current_user_claims["email"], "user": user_email,
} }
if err := h.emailing.Send("support.request", "support@parcoursmob.fr", data); err != nil { log.Debug().Str("user_email", user_email).Msg("Sending message")
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

157
handlers/application/vehicles-management.go Normal file → Executable file
View File

@ -11,15 +11,18 @@ 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" "github.com/coreos/go-oidc/v3/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"
) )
@ -31,7 +34,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
} }
@ -60,9 +63,11 @@ 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, bookings) h.Renderer.VehiclesManagementOverview(w, r, vehicles, vehicles_map, driversMap, bookings)
} }
func (h *ApplicationHandler) VehiclesManagementBookingsList(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) VehiclesManagementBookingsList(w http.ResponseWriter, r *http.Request) {
@ -72,7 +77,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
} }
@ -97,7 +102,9 @@ 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)
h.Renderer.VehiclesManagementBookingsList(w, r, vehicles_map, bookings, cacheid) driversMap, _ := h.services.GetBeneficiariesMap()
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) {
@ -111,7 +118,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -124,7 +131,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -137,13 +144,15 @@ 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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -163,7 +172,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -186,12 +195,37 @@ 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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
h.Renderer.VehiclesFleetDisplay(w, r, resp.Vehicle.ToStorageType()) diag := []diagsstorage.Diag{}
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 {
@ -217,7 +251,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -265,7 +299,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -282,7 +316,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -296,7 +330,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -311,7 +345,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
} }
alternatives := []any{} alternatives := []any{}
@ -323,7 +357,32 @@ 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")
h.Renderer.VehicleManagementBookingDisplay(w, r, booking, booking.Vehicle, beneficiary, groupresp.Group.ToStorageType(), documents, file_types_map, alternatives) diag := []diagsstorage.Diag{}
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) {
@ -336,7 +395,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -351,7 +410,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -363,7 +422,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 {
fmt.Println("no current group") log.Error().Msg("no current group")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -372,7 +431,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 {
fmt.Println("no current user") log.Error().Msg("no current user")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -381,7 +440,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 {
fmt.Println("no current user claims") log.Error().Msg("no current user claims")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -416,7 +475,7 @@ func (h ApplicationHandler) VehiclesFleetMakeUnavailable(w http.ResponseWriter,
datapb, err := structpb.NewStruct(data) datapb, err := structpb.NewStruct(data)
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -435,7 +494,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -443,30 +502,6 @@ 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"]
@ -477,7 +512,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -487,14 +522,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -534,7 +569,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -557,7 +592,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -579,7 +614,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -590,7 +625,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -602,7 +637,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -614,14 +649,16 @@ 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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -639,7 +676,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }

79
handlers/application/vehicles.go Normal file → Executable file
View File

@ -12,6 +12,8 @@ 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"
@ -20,13 +22,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()
var beneficiary mobilityaccountsstorage.Account var beneficiary mobilityaccountsstorage.Account
beneficiarydocuments := []filestorage.FileInfo{} beneficiarydocuments := []filestorage.FileInfo{}
@ -42,7 +44,7 @@ func (h ApplicationHandler) VehiclesSearch(w http.ResponseWriter, r *http.Reques
administrators := []string{} administrators := []string{}
if r.FormValue("beneficiaryid") != "" { if r.FormValue("beneficiaryid") != "" && startdate.After(time.Now()) && enddate.After(startdate) {
// Handler form // Handler form
searched = true searched = true
@ -52,7 +54,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -71,7 +73,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
} }
@ -79,9 +81,7 @@ 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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -136,17 +136,16 @@ 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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -159,7 +158,7 @@ func (h ApplicationHandler) Book(w http.ResponseWriter, r *http.Request) {
Vehicleid: vehicleid, Vehicleid: vehicleid,
}) })
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("")
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()))
@ -188,7 +187,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -213,7 +212,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
w.Write([]byte("Document manquant : " + v)) w.Write([]byte("Document manquant : " + v))
return return
@ -228,7 +227,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -236,7 +235,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -245,15 +244,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
} 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 {
@ -265,7 +264,6 @@ 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) {
@ -277,7 +275,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -301,7 +299,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -309,11 +307,35 @@ 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")
h.Renderer.VehicleBookingDisplay(w, r, booking, booking.Vehicle, beneficiaryresp.Account.ToStorageType(), groupresp.Group.ToStorageType(), documents, file_types_map) diag := []diagsstorage.Diag{}
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)
@ -325,7 +347,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
return return
} }
@ -357,22 +379,21 @@ func (h *ApplicationHandler) BookingDocumentDownload(w http.ResponseWriter, r *h
bookingid := vars["bookingid"] bookingid := vars["bookingid"]
document := vars["document"] document := vars["document"]
fmt.Println(fmt.Sprintf("%s/%s", bookingid, document)) log.Debug().Str("booking id", bookingid).Str("document", document).Msg("Document and booking ID")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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)
} }

0
handlers/auth/auth.go Normal file → Executable file
View File

0
handlers/auth/disconnect.go Normal file → Executable file
View File

6
handlers/auth/groups.go Normal file → Executable file
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
} }
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }

14
handlers/auth/lost_password.go Normal file → Executable file
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
} }
http.Redirect(w, r, "/app/", http.StatusFound) http.Redirect(w, r, "/app/", http.StatusFound)

11
handlers/auth/onboarding.go Normal file → Executable file
View File

@ -7,6 +7,7 @@ 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) {
@ -15,7 +16,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
h.Renderer.AuthOnboardingKO(w, r, key) h.Renderer.AuthOnboardingKO(w, r, key)
return return
} }
@ -24,7 +25,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") == "" {
fmt.Println("password is empty !") log.Error().Msg("Password is empty")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -58,7 +59,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -70,14 +71,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
} }
http.Redirect(w, r, "/app/", http.StatusFound) http.Redirect(w, r, "/app/", http.StatusFound)

16
handlers/exports/agenda.go Normal file → Executable file
View File

@ -3,6 +3,9 @@ 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"
@ -11,9 +14,8 @@ 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) {
@ -24,7 +26,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -59,7 +61,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -82,7 +84,7 @@ func (h *ExportsHandler) Agenda(filter string) func(w http.ResponseWriter, r *ht
Id: eventId, Id: eventId,
}) })
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -107,7 +109,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -130,7 +132,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
} }
}() }()
f.SetCellValue("Sheet1", "A1", "Evénement") f.SetCellValue("Sheet1", "A1", "Evénement")

0
handlers/exports/exports.go Normal file → Executable file
View File

11
handlers/exports/fleets.go Normal file → Executable file
View File

@ -12,6 +12,7 @@ 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"
) )
@ -24,7 +25,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -34,7 +35,6 @@ 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,14 +45,13 @@ 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 {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -65,7 +64,7 @@ func (h *ExportsHandler) Bookings(w http.ResponseWriter, r *http.Request) {
Accountids: beneficiaries_ids, Accountids: beneficiaries_ids,
}) })
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -80,7 +79,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
} }
}() }()

87
main.go Normal file → Executable file
View File

@ -1,11 +1,13 @@
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"
@ -18,9 +20,12 @@ import (
) )
func main() { func main() {
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
cfg, err := ReadConfig() cfg, err := ReadConfig()
if err != nil { if err != nil {
panic(err) log.Fatal().Err(err).Msg("cannot read config")
return
} }
var ( var (
@ -30,26 +35,29 @@ func main() {
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 {
panic(err) log.Panic().Err(err).Msg("Error creating services handler")
} }
kv, err := cache.NewKVHandler(cfg) kv, err := cache.NewKVHandler(cfg)
if err != nil { if err != nil {
panic(err) log.Panic().Err(err).Msg("Error creating KV handler")
} }
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 {
panic(err) log.Panic().Err(err).Msg("Error creating identification provider")
} }
emailing, err := renderer.NewEmailingHandler(cfg) emailing, err := renderer.NewEmailingHandler(cfg)
if err != nil { if err != nil {
panic(err) log.Panic().Err(err).Msg("Error creating emailing handler")
} }
apiHandler, _ := api.NewAPIHandler(cfg, idp, svc, kv) apiHandler, _ := api.NewAPIHandler(cfg, idp, svc, kv)
@ -57,11 +65,6 @@ 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))))
@ -74,6 +77,14 @@ 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)
@ -143,7 +154,7 @@ func main() {
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)
@ -153,7 +164,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)
@ -163,6 +174,38 @@ 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)
@ -172,8 +215,6 @@ func main() {
export.Use(idp.Middleware) export.Use(idp.Middleware)
export.Use(idp.GroupsMiddleware) export.Use(idp.GroupsMiddleware)
fmt.Println("-> HTTP server listening on", address)
srv := &http.Server{ srv := &http.Server{
Handler: r, Handler: r,
Addr: address, Addr: address,
@ -181,10 +222,18 @@ func main() {
ReadTimeout: 15 * time.Second, ReadTimeout: 15 * time.Second,
} }
log.Fatal(srv.ListenAndServe()) log.Info().Str("service_name", service_name).Str("address", address).Msg("Running HTTP server")
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()))
})
}

0
renderer/administration.go Normal file → Executable file
View File

36
renderer/agenda.go Normal file → Executable file
View File

@ -30,22 +30,31 @@ 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) { func (renderer *Renderer) AgendaCreateEvent(w http.ResponseWriter, r *http.Request, events_file_types []string, file_types_map map[string]string, documents any) {
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, subscribers map[string]any, beneficiaries any) { 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) {
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,
"subscribers": subscribers, "events_file_types": events_file_types,
"beneficiaries": beneficiaries, "file_types_map": file_types_map,
"documents": documents,
"subscribers": subscribers,
"beneficiaries": beneficiaries,
} }
renderer.Render("agenda create event", w, r, files, state) renderer.Render("agenda create event", w, r, files, state)
@ -100,3 +109,18 @@ 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)
// }

0
renderer/auth.go Normal file → Executable file
View File

6
renderer/beneficiaries.go Normal file → Executable file
View File

@ -5,6 +5,7 @@ import (
"html/template" "html/template"
"net/http" "net/http"
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"
) )
@ -52,7 +53,7 @@ type BeneficiariesDisplayState struct {
Beneficiary any Beneficiary any
} }
func (renderer *Renderer) BeneficiaryDisplay(w http.ResponseWriter, r *http.Request, beneficiary any, bookings []any, organizations []any, beneficiaries_file_types []string, file_types_map map[string]string, documents 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) {
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{
@ -62,8 +63,9 @@ 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,
"diags": diags,
} }
renderer.Render("beneficiaries_display", w, r, files, state) renderer.Render("beneficiaries_display", w, r, files, state)
} }

4
renderer/dashboard.go Normal file → Executable file
View File

@ -4,11 +4,12 @@ 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) { func (renderer *Renderer) Dashboard(w http.ResponseWriter, r *http.Request, accounts []any, nbaccounts int, count_members int, events []agendastorage.Event, fleets []fleetstorage.Booking) {
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{
@ -18,6 +19,7 @@ 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)

115
renderer/diags.go Normal file
View File

@ -0,0 +1,115 @@
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)
}

0
renderer/directory.go Normal file → Executable file
View File

0
renderer/func-maps.go Normal file → Executable file
View File

0
renderer/group.go Normal file → Executable file
View File

0
renderer/group_module.go Normal file → Executable file
View File

0
renderer/journeys.go Normal file → Executable file
View File

0
renderer/layout.go Normal file → Executable file
View File

0
renderer/mailer.go Normal file → Executable file
View File

0
renderer/members.go Normal file → Executable file
View File

15
renderer/renderer.go Normal file → Executable file
View File

@ -9,7 +9,8 @@ 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" "github.com/coreos/go-oidc/v3/oidc"
"github.com/rs/zerolog/log"
"github.com/spf13/viper" "github.com/spf13/viper"
) )
@ -66,7 +67,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
} }
} }
@ -95,7 +96,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
} }
} }
@ -251,6 +252,14 @@ 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) {
ls.MenuItems = append(ls.MenuItems, MenuItem{
Title: "Diagnostics",
Link: "/app/diags/",
Active: menuState == diagsMenu,
Icon: "hero:outline/document-text",
})
}
return RenderState{ return RenderState{
IconSet: icons.NewIconSet(iconset), IconSet: icons.NewIconSet(iconset),
Group: group, Group: group,

0
renderer/support.go Normal file → Executable file
View File

15
renderer/vehicle-management.go Normal file → Executable file
View File

@ -5,28 +5,31 @@ 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, bookings []fleetsstorage.Booking) { 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) {
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, vehicles_map map[string]fleetsstorage.Vehicle, bookings []fleetsstorage.Booking, cacheid string) { 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) {
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": vehicles_map, "vehicles_map": vehiclesMap,
"drivers_map": driversMap,
"cacheid": cacheid, "cacheid": cacheid,
} }
@ -43,11 +46,12 @@ 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) { func (renderer *Renderer) VehiclesFleetDisplay(w http.ResponseWriter, r *http.Request, vehicle any, diags []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)
@ -64,7 +68,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) { 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) {
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{
@ -75,6 +79,7 @@ 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)

3
renderer/vehicles.go Normal file → Executable file
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) { 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) {
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,6 +62,7 @@ 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)

42
services/agenda.go Normal file → Executable file
View File

@ -1,8 +1,14 @@
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 {
@ -21,3 +27,39 @@ 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
}

55
services/diags.go Normal file
View File

@ -0,0 +1,55 @@
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
}

11
services/fleets.go Normal file → Executable file
View File

@ -7,6 +7,7 @@ import (
"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"
) )
@ -56,13 +57,17 @@ func (s *ServicesHandler) GetBookings() (bookings []storage.Booking, err error)
func (s *ServicesHandler) GetVehiclesMap() (vehicles map[string]storage.Vehicle, err error) { func (s *ServicesHandler) GetVehiclesMap() (vehicles map[string]storage.Vehicle, err error) {
vehicles = map[string]storage.Vehicle{} vehicles = map[string]storage.Vehicle{}
request := &fleets.GetVehiclesRequest{} request := &fleets.GetVehiclesRequest{
Namespaces: []string{"parcoursmob"},
}
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("")
} else {
for _, vehicle := range resp.Vehicles { for _, vehicle := range resp.Vehicles {
vehicles[vehicle.Id] = vehicle.ToStorageType() vehicles[vehicle.Id] = vehicle.ToStorageType()
} }
} }
return return vehicles, err
} }

22
services/groupsmanagement.go Normal file → Executable file
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,3 +56,23 @@ 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
}

16
services/mobilityaccounts.go Normal file → Executable file
View File

@ -42,6 +42,22 @@ 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{

9
services/services.go Normal file → Executable file
View File

@ -5,6 +5,7 @@ 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"
"github.com/spf13/viper" "github.com/spf13/viper"
) )
@ -17,6 +18,7 @@ type GRPCServices struct {
GroupsManagement groupsmanagement.GroupsManagementClient GroupsManagement groupsmanagement.GroupsManagementClient
Fleets fleets.FleetsClient Fleets fleets.FleetsClient
Agenda agenda.AgendaClient Agenda agenda.AgendaClient
Diags diags.DiagsClient
} }
func NewServicesHandler(cfg *viper.Viper) (*ServicesHandler, error) { func NewServicesHandler(cfg *viper.Viper) (*ServicesHandler, error) {
@ -25,6 +27,7 @@ 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")
) )
mobilityAccounts, err := NewMobilityAccountService(mobilityAccountsDial) mobilityAccounts, err := NewMobilityAccountService(mobilityAccountsDial)
if err != nil { if err != nil {
@ -46,12 +49,18 @@ func NewServicesHandler(cfg *viper.Viper) (*ServicesHandler, error) {
return nil, err return nil, err
} }
diagsSvc, err := NewDiagsService(diagsDial)
if err != nil {
return nil, err
}
return &ServicesHandler{ return &ServicesHandler{
GRPC: GRPCServices{ GRPC: GRPCServices{
MobilityAccounts: mobilityAccounts, MobilityAccounts: mobilityAccounts,
GroupsManagement: groupsManagement, GroupsManagement: groupsManagement,
Fleets: fleetsSvc, Fleets: fleetsSvc,
Agenda: agendaSvc, Agenda: agendaSvc,
Diags: diagsSvc,
}, },
}, nil }, nil
} }

1
themes Submodule

@ -0,0 +1 @@
Subproject commit db4c22699eff6756851b0d3eff430b7bbe4c1c1b

0
utils/form-validators/form-validators.go Normal file → Executable file
View File

0
utils/form-validators/phone-numbers.go Normal file → Executable file
View File

0
utils/icons/svg-icons.go Normal file → Executable file
View File

4
utils/identification/groups.go Normal file → Executable file
View File

@ -6,6 +6,7 @@ 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"
@ -19,7 +20,6 @@ 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 {
fmt.Println("cast issue") log.Error().Msg("cast issue")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }

34
utils/identification/oidc.go Normal file → Executable file
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" "github.com/coreos/go-oidc/v3/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,7 +40,27 @@ 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 {
return nil, err var (
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{
@ -71,18 +91,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
} }
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)
http.Redirect(w, r, p.OAuth2Config.AuthCodeURL(state), http.StatusFound) url := p.OAuth2Config.AuthCodeURL(state)
http.Redirect(w, r, url, http.StatusFound)
return return
} }
@ -102,7 +122,7 @@ func (p *IdentificationProvider) Middleware(next http.Handler) http.Handler {
err = idtoken.Claims(&claims) err = idtoken.Claims(&claims)
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("")
} }
ctx := context.WithValue(r.Context(), IdtokenKey, idtoken) ctx := context.WithValue(r.Context(), IdtokenKey, idtoken)

4
utils/profile-pictures/profile-pictures.go Normal file → Executable file
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
return img return img
} }

0
utils/sorting/beneficiaries.go Normal file → Executable file
View File

0
utils/sorting/events.go Normal file → Executable file
View File

0
utils/sorting/fleets.go Normal file → Executable file
View File

0
utils/sorting/groups.go Normal file → Executable file
View File

0
utils/sorting/sorting.go Normal file → Executable file
View File

1
utils/storage/badger.go Normal file
View File

@ -0,0 +1 @@
package storage

0
utils/storage/cache.go Normal file → Executable file
View File

19
utils/storage/etcd.go Normal file → Executable file
View File

@ -8,6 +8,7 @@ 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,7 +76,7 @@ func NewEtcdHandler(cfg *viper.Viper) (*EtcdHandler, error) {
DialTimeout: 5 * time.Second, DialTimeout: 5 * time.Second,
}) })
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("")
return nil, err return nil, err
} }
@ -92,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
return err return err
} }
// _, err = s.Client.KV.Put(context.TODO(), k, data.String()) // _, err = s.Client.KV.Put(context.TODO(), k, data.String())
@ -100,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
return err return err
} }
return nil return nil
@ -109,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
return err return err
} }
data, err := s.serializer.Serialize(v) data, err := s.serializer.Serialize(v)
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("")
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))
@ -124,7 +125,7 @@ func (s *EtcdHandler) PutWithTTL(k string, v any, duration time.Duration) error
cancel() cancel()
if err != nil { if err != nil {
fmt.Println(err) log.Error().Err(err).Msg("")
return err return err
} }
return nil return nil
@ -135,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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
@ -156,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
return err return err
} }
return nil return nil

2
utils/storage/files.go Normal file → Executable file
View File

@ -10,6 +10,8 @@ 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 {

2
utils/storage/kv.go Normal file → Executable file
View File

@ -15,4 +15,6 @@ type KVHandler interface {
func NewKVHandler(cfg *viper.Viper) (KVHandler, error) { func NewKVHandler(cfg *viper.Viper) (KVHandler, error) {
return NewEtcdHandler(cfg) return NewEtcdHandler(cfg)
return nil, nil
} }

14
utils/storage/minio.go Normal file → Executable file
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println("Error : ", object.Err) log.Error().Str("prefix", prefix).Err(object.Err).Msg("Error listing files for prefix")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
return err return err
} }
return nil return nil

11
utils/storage/sessions.go Normal file → Executable file
View File

@ -11,6 +11,7 @@ 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.
@ -76,7 +77,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
return err return err
} }
http.SetCookie(w, sessions.NewCookie(session.Name(), "", session.Options)) http.SetCookie(w, sessions.NewCookie(session.Name(), "", session.Options))
@ -87,13 +88,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 {
fmt.Println(err) log.Error().Err(err).Msg("")
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 {
fmt.Println(err) log.Error().Err(err).Msg("")
return err return err
} }
http.SetCookie(w, sessions.NewCookie(session.Name(), encoded, session.Options)) http.SetCookie(w, sessions.NewCookie(session.Name(), encoded, session.Options))
@ -104,13 +105,11 @@ 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)
fmt.Println(err) log.Error().Err(err).Msg("")
return err return err
} }
m[ks] = v m[ks] = v