13 Commits

Author SHA1 Message Date
Arnaud Delcasse
0bf041b154 deleted bookings management
Some checks failed
Build and Push Docker Image / build_and_push (push) Failing after 3m2s
2025-10-08 09:27:56 +02:00
ce5e5f7acb test actions
All checks were successful
Build and Push Docker Image / build_and_push (push) Successful in 1m33s
2024-04-05 12:18:27 +02:00
139c4b70cf add .gitea/worflows/build.yml 2024-04-04 12:22:49 +02:00
f20baaba03 merge 2023-11-27 10:53:59 +01:00
3a932622b4 Merge branch 'dev' of https://git.coopgo.io/coopgo-platform/fleets into dev 2023-11-27 10:53:35 +01:00
a6ca0d04ec Merge branch 'mika' into dev 2023-11-24 17:11:30 +01:00
4674c75a9f merge fleets 2023-11-24 17:11:03 +01:00
44d2b00cd4 [+] create branch mika 2023-09-06 13:36:02 +02:00
8147a7a6b9 run go mod tidy 2023-08-21 14:57:57 +02:00
soukainna
41bf03682c logic to update vehicles 2023-05-19 11:26:36 +02:00
011466fb14 adding psql 2023-05-12 15:12:55 +02:00
8a271fdcf8 nothing special 2023-03-10 16:10:32 +01:00
feb935f8bf Filter vehicle administrators 2023-03-10 15:44:46 +01:00
21 changed files with 2361 additions and 1086 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}}

2
.gitignore vendored
View File

@@ -1,3 +1,5 @@
config.yaml config.yaml
.vscode .vscode
.idea
__debug_bin __debug_bin
fleets

View File

@@ -9,3 +9,4 @@ It provides :
- a flexible data schema to push any information on vehicles or bookings - a flexible data schema to push any information on vehicles or bookings
It is not a full featured booking platform but just a microservice intended to be used as part of a bigger platform, like the COOPGO Technical Platform. It doesn't provide any king of booking UI or management interface. It is not a full featured booking platform but just a microservice intended to be used as part of a bigger platform, like the COOPGO Technical Platform. It doesn't provide any king of booking UI or management interface.

28
go.mod
View File

@@ -1,22 +1,29 @@
module git.coopgo.io/coopgo-platform/fleets module git.coopgo.io/coopgo-platform/fleets
go 1.18 go 1.23
require ( require (
github.com/golang/protobuf v1.5.2 ariga.io/atlas v0.13.1
github.com/google/uuid v1.3.0 github.com/google/uuid v1.6.0
github.com/lib/pq v1.10.9
github.com/spf13/viper v1.12.0 github.com/spf13/viper v1.12.0
go.mongodb.org/mongo-driver v1.10.1 go.mongodb.org/mongo-driver v1.10.1
google.golang.org/grpc v1.46.2 google.golang.org/grpc v1.65.0
google.golang.org/protobuf v1.28.0 google.golang.org/protobuf v1.34.1
) )
require ( require (
github.com/agext/levenshtein v1.2.1 // indirect
github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect
github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect
github.com/go-openapi/inflect v0.19.0 // indirect
github.com/golang/snappy v0.0.1 // indirect github.com/golang/snappy v0.0.1 // 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/klauspost/compress v1.13.6 // indirect github.com/klauspost/compress v1.13.6 // indirect
github.com/magiconair/properties v1.8.6 // indirect github.com/magiconair/properties v1.8.6 // 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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml v1.9.5 // indirect
@@ -31,11 +38,12 @@ require (
github.com/xdg-go/scram v1.1.1 // indirect github.com/xdg-go/scram v1.1.1 // indirect
github.com/xdg-go/stringprep v1.0.3 // indirect github.com/xdg-go/stringprep v1.0.3 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect github.com/zclconf/go-cty v1.8.0 // indirect
golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 // indirect golang.org/x/crypto v0.23.0 // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect golang.org/x/net v0.25.0 // indirect
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect golang.org/x/sync v0.7.0 // indirect
golang.org/x/text v0.3.7 // indirect golang.org/x/sys v0.20.0 // indirect
golang.org/x/text v0.15.0 // indirect
google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect
gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/ini.v1 v1.66.4 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect

73
go.sum
View File

@@ -1,3 +1,5 @@
ariga.io/atlas v0.13.1 h1:oSkEYgI3qUnQZ6b6+teAEiIuizjBvkZ4YDbz0XWfCdQ=
ariga.io/atlas v0.13.1/go.mod h1:+TR129FJZ5Lvzms6dvCeGWh1yR6hMvmXBhug4hrNIGk=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@@ -38,7 +40,15 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8=
github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk=
github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw=
github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
@@ -63,12 +73,17 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4=
github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4=
github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -80,6 +95,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -95,7 +111,6 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
@@ -112,7 +127,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
@@ -127,10 +143,9 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
@@ -139,6 +154,8 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hashicorp/hcl/v2 v2.10.0 h1:1S1UnuhDGlv3gRFV4+0EdwB+znNP5HmcGbIqwnSCByg=
github.com/hashicorp/hcl/v2 v2.10.0/go.mod h1:FwWsfWEjyV/CMj8s/gqAuiviY72rJ1/oayI9WftqcKg=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
@@ -149,11 +166,19 @@ github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47e
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3vkb4ax0b5D2DHbNAUsen0Gx5wZoq3lV4=
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=
github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM=
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
@@ -171,12 +196,16 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo=
github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo=
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ=
@@ -193,6 +222,9 @@ github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI
github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs=
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4=
github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E=
@@ -205,6 +237,10 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8=
github.com/zclconf/go-cty v1.8.0 h1:s4AvqaeQzJIu3ndv4gVIhplVD0krU+bgrcLSVUnaWuA=
github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk=
github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8=
go.mongodb.org/mongo-driver v1.10.1 h1:NujsPveKwHaWuKUer/ceo9DzEe7HIj1SlJ6uvXZG0S4= go.mongodb.org/mongo-driver v1.10.1 h1:NujsPveKwHaWuKUer/ceo9DzEe7HIj1SlJ6uvXZG0S4=
go.mongodb.org/mongo-driver v1.10.1/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8= go.mongodb.org/mongo-driver v1.10.1/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
@@ -215,14 +251,16 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -257,6 +295,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -289,8 +328,8 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y= golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -310,13 +349,15 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -350,8 +391,8 @@ golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -361,8 +402,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -501,8 +543,8 @@ google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA5
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ= google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=
google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -516,8 +558,9 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

View File

@@ -42,7 +42,6 @@ func (v Booking) ToStorageType() storage.Booking {
} }
func BookingFromStorageType(booking *storage.Booking) (*Booking, error) { func BookingFromStorageType(booking *storage.Booking) (*Booking, error) {
d, err := sanitizeData(booking.Data) d, err := sanitizeData(booking.Data)
if err != nil { if err != nil {
return nil, err return nil, err

File diff suppressed because it is too large Load Diff

View File

@@ -5,6 +5,7 @@ syntax = "proto3";
option go_package = "git.coopgo.io/coopgo-platform/fleets/grpcapi"; option go_package = "git.coopgo.io/coopgo-platform/fleets/grpcapi";
import "google/protobuf/timestamp.proto"; import "google/protobuf/timestamp.proto";
import "google/protobuf/struct.proto";
import "vehicles.proto"; import "vehicles.proto";
@@ -50,6 +51,7 @@ message GetVehiclesRequest {
repeated string administrators = 7; repeated string administrators = 7;
google.protobuf.Timestamp availability_from = 8; google.protobuf.Timestamp availability_from = 8;
google.protobuf.Timestamp availability_to = 9; google.protobuf.Timestamp availability_to = 9;
bool include_deleted = 10;
} }
message GetVehiclesResponse { message GetVehiclesResponse {
@@ -90,6 +92,7 @@ message UpdateBookingResponse {
message DeleteBookingRequest { message DeleteBookingRequest {
string id = 15; string id = 15;
google.protobuf.Struct deletion_metadata = 30;
} }
message DeleteBookingResponse { message DeleteBookingResponse {
@@ -126,6 +129,7 @@ message GetDriverBookingsResponse {
message GetBookingsRequest { message GetBookingsRequest {
repeated string namespaces = 27; repeated string namespaces = 27;
bool include_deleted = 29;
} }
message GetBookingsResponse { message GetBookingsResponse {

View File

@@ -1,7 +1,9 @@
//COOPGO Groups Management gRPC service definition
// Code generated by protoc-gen-go-grpc. DO NOT EDIT. // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions: // versions:
// - protoc-gen-go-grpc v1.2.0 // - protoc-gen-go-grpc v1.5.1
// - protoc v3.21.12 // - protoc v6.31.1
// source: fleets.proto // source: fleets.proto
package grpcapi package grpcapi
@@ -15,8 +17,22 @@ import (
// This is a compile-time assertion to ensure that this generated file // This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against. // is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.32.0 or later. // Requires gRPC-Go v1.64.0 or later.
const _ = grpc.SupportPackageIsVersion7 const _ = grpc.SupportPackageIsVersion9
const (
Fleets_AddVehicle_FullMethodName = "/Fleets/AddVehicle"
Fleets_GetVehicle_FullMethodName = "/Fleets/GetVehicle"
Fleets_GetVehicles_FullMethodName = "/Fleets/GetVehicles"
Fleets_UpdateVehicle_FullMethodName = "/Fleets/UpdateVehicle"
Fleets_CreateBooking_FullMethodName = "/Fleets/CreateBooking"
Fleets_GetBooking_FullMethodName = "/Fleets/GetBooking"
Fleets_GetBookings_FullMethodName = "/Fleets/GetBookings"
Fleets_GetDriverBookings_FullMethodName = "/Fleets/GetDriverBookings"
Fleets_UpdateBooking_FullMethodName = "/Fleets/UpdateBooking"
Fleets_DeleteBooking_FullMethodName = "/Fleets/DeleteBooking"
Fleets_FindVehicle_FullMethodName = "/Fleets/FindVehicle"
)
// FleetsClient is the client API for Fleets service. // FleetsClient is the client API for Fleets service.
// //
@@ -47,8 +63,9 @@ func NewFleetsClient(cc grpc.ClientConnInterface) FleetsClient {
} }
func (c *fleetsClient) AddVehicle(ctx context.Context, in *AddVehicleRequest, opts ...grpc.CallOption) (*AddVehicleResponse, error) { func (c *fleetsClient) AddVehicle(ctx context.Context, in *AddVehicleRequest, opts ...grpc.CallOption) (*AddVehicleResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(AddVehicleResponse) out := new(AddVehicleResponse)
err := c.cc.Invoke(ctx, "/Fleets/AddVehicle", in, out, opts...) err := c.cc.Invoke(ctx, Fleets_AddVehicle_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -56,8 +73,9 @@ func (c *fleetsClient) AddVehicle(ctx context.Context, in *AddVehicleRequest, op
} }
func (c *fleetsClient) GetVehicle(ctx context.Context, in *GetVehicleRequest, opts ...grpc.CallOption) (*GetVehicleResponse, error) { func (c *fleetsClient) GetVehicle(ctx context.Context, in *GetVehicleRequest, opts ...grpc.CallOption) (*GetVehicleResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(GetVehicleResponse) out := new(GetVehicleResponse)
err := c.cc.Invoke(ctx, "/Fleets/GetVehicle", in, out, opts...) err := c.cc.Invoke(ctx, Fleets_GetVehicle_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -65,8 +83,9 @@ func (c *fleetsClient) GetVehicle(ctx context.Context, in *GetVehicleRequest, op
} }
func (c *fleetsClient) GetVehicles(ctx context.Context, in *GetVehiclesRequest, opts ...grpc.CallOption) (*GetVehiclesResponse, error) { func (c *fleetsClient) GetVehicles(ctx context.Context, in *GetVehiclesRequest, opts ...grpc.CallOption) (*GetVehiclesResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(GetVehiclesResponse) out := new(GetVehiclesResponse)
err := c.cc.Invoke(ctx, "/Fleets/GetVehicles", in, out, opts...) err := c.cc.Invoke(ctx, Fleets_GetVehicles_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -74,8 +93,9 @@ func (c *fleetsClient) GetVehicles(ctx context.Context, in *GetVehiclesRequest,
} }
func (c *fleetsClient) UpdateVehicle(ctx context.Context, in *UpdateVehicleRequest, opts ...grpc.CallOption) (*UpdateVehicleResponse, error) { func (c *fleetsClient) UpdateVehicle(ctx context.Context, in *UpdateVehicleRequest, opts ...grpc.CallOption) (*UpdateVehicleResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(UpdateVehicleResponse) out := new(UpdateVehicleResponse)
err := c.cc.Invoke(ctx, "/Fleets/UpdateVehicle", in, out, opts...) err := c.cc.Invoke(ctx, Fleets_UpdateVehicle_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -83,8 +103,9 @@ func (c *fleetsClient) UpdateVehicle(ctx context.Context, in *UpdateVehicleReque
} }
func (c *fleetsClient) CreateBooking(ctx context.Context, in *CreateBookingRequest, opts ...grpc.CallOption) (*CreateBookingResponse, error) { func (c *fleetsClient) CreateBooking(ctx context.Context, in *CreateBookingRequest, opts ...grpc.CallOption) (*CreateBookingResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(CreateBookingResponse) out := new(CreateBookingResponse)
err := c.cc.Invoke(ctx, "/Fleets/CreateBooking", in, out, opts...) err := c.cc.Invoke(ctx, Fleets_CreateBooking_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -92,8 +113,9 @@ func (c *fleetsClient) CreateBooking(ctx context.Context, in *CreateBookingReque
} }
func (c *fleetsClient) GetBooking(ctx context.Context, in *GetBookingRequest, opts ...grpc.CallOption) (*GetBookingResponse, error) { func (c *fleetsClient) GetBooking(ctx context.Context, in *GetBookingRequest, opts ...grpc.CallOption) (*GetBookingResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(GetBookingResponse) out := new(GetBookingResponse)
err := c.cc.Invoke(ctx, "/Fleets/GetBooking", in, out, opts...) err := c.cc.Invoke(ctx, Fleets_GetBooking_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -101,8 +123,9 @@ func (c *fleetsClient) GetBooking(ctx context.Context, in *GetBookingRequest, op
} }
func (c *fleetsClient) GetBookings(ctx context.Context, in *GetBookingsRequest, opts ...grpc.CallOption) (*GetBookingsResponse, error) { func (c *fleetsClient) GetBookings(ctx context.Context, in *GetBookingsRequest, opts ...grpc.CallOption) (*GetBookingsResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(GetBookingsResponse) out := new(GetBookingsResponse)
err := c.cc.Invoke(ctx, "/Fleets/GetBookings", in, out, opts...) err := c.cc.Invoke(ctx, Fleets_GetBookings_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -110,8 +133,9 @@ func (c *fleetsClient) GetBookings(ctx context.Context, in *GetBookingsRequest,
} }
func (c *fleetsClient) GetDriverBookings(ctx context.Context, in *GetDriverBookingsRequest, opts ...grpc.CallOption) (*GetDriverBookingsResponse, error) { func (c *fleetsClient) GetDriverBookings(ctx context.Context, in *GetDriverBookingsRequest, opts ...grpc.CallOption) (*GetDriverBookingsResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(GetDriverBookingsResponse) out := new(GetDriverBookingsResponse)
err := c.cc.Invoke(ctx, "/Fleets/GetDriverBookings", in, out, opts...) err := c.cc.Invoke(ctx, Fleets_GetDriverBookings_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -119,8 +143,9 @@ func (c *fleetsClient) GetDriverBookings(ctx context.Context, in *GetDriverBooki
} }
func (c *fleetsClient) UpdateBooking(ctx context.Context, in *UpdateBookingRequest, opts ...grpc.CallOption) (*UpdateBookingResponse, error) { func (c *fleetsClient) UpdateBooking(ctx context.Context, in *UpdateBookingRequest, opts ...grpc.CallOption) (*UpdateBookingResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(UpdateBookingResponse) out := new(UpdateBookingResponse)
err := c.cc.Invoke(ctx, "/Fleets/UpdateBooking", in, out, opts...) err := c.cc.Invoke(ctx, Fleets_UpdateBooking_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -128,8 +153,9 @@ func (c *fleetsClient) UpdateBooking(ctx context.Context, in *UpdateBookingReque
} }
func (c *fleetsClient) DeleteBooking(ctx context.Context, in *DeleteBookingRequest, opts ...grpc.CallOption) (*DeleteBookingResponse, error) { func (c *fleetsClient) DeleteBooking(ctx context.Context, in *DeleteBookingRequest, opts ...grpc.CallOption) (*DeleteBookingResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(DeleteBookingResponse) out := new(DeleteBookingResponse)
err := c.cc.Invoke(ctx, "/Fleets/DeleteBooking", in, out, opts...) err := c.cc.Invoke(ctx, Fleets_DeleteBooking_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -137,8 +163,9 @@ func (c *fleetsClient) DeleteBooking(ctx context.Context, in *DeleteBookingReque
} }
func (c *fleetsClient) FindVehicle(ctx context.Context, in *FindVehicleRequest, opts ...grpc.CallOption) (*FindVehicleResponse, error) { func (c *fleetsClient) FindVehicle(ctx context.Context, in *FindVehicleRequest, opts ...grpc.CallOption) (*FindVehicleResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(FindVehicleResponse) out := new(FindVehicleResponse)
err := c.cc.Invoke(ctx, "/Fleets/FindVehicle", in, out, opts...) err := c.cc.Invoke(ctx, Fleets_FindVehicle_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -147,7 +174,7 @@ func (c *fleetsClient) FindVehicle(ctx context.Context, in *FindVehicleRequest,
// FleetsServer is the server API for Fleets service. // FleetsServer is the server API for Fleets service.
// All implementations must embed UnimplementedFleetsServer // All implementations must embed UnimplementedFleetsServer
// for forward compatibility // for forward compatibility.
type FleetsServer interface { type FleetsServer interface {
// Vehicles management // Vehicles management
AddVehicle(context.Context, *AddVehicleRequest) (*AddVehicleResponse, error) AddVehicle(context.Context, *AddVehicleRequest) (*AddVehicleResponse, error)
@@ -166,9 +193,12 @@ type FleetsServer interface {
mustEmbedUnimplementedFleetsServer() mustEmbedUnimplementedFleetsServer()
} }
// UnimplementedFleetsServer must be embedded to have forward compatible implementations. // UnimplementedFleetsServer must be embedded to have
type UnimplementedFleetsServer struct { // forward compatible implementations.
} //
// NOTE: this should be embedded by value instead of pointer to avoid a nil
// pointer dereference when methods are called.
type UnimplementedFleetsServer struct{}
func (UnimplementedFleetsServer) AddVehicle(context.Context, *AddVehicleRequest) (*AddVehicleResponse, error) { func (UnimplementedFleetsServer) AddVehicle(context.Context, *AddVehicleRequest) (*AddVehicleResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method AddVehicle not implemented") return nil, status.Errorf(codes.Unimplemented, "method AddVehicle not implemented")
@@ -204,6 +234,7 @@ func (UnimplementedFleetsServer) FindVehicle(context.Context, *FindVehicleReques
return nil, status.Errorf(codes.Unimplemented, "method FindVehicle not implemented") return nil, status.Errorf(codes.Unimplemented, "method FindVehicle not implemented")
} }
func (UnimplementedFleetsServer) mustEmbedUnimplementedFleetsServer() {} func (UnimplementedFleetsServer) mustEmbedUnimplementedFleetsServer() {}
func (UnimplementedFleetsServer) testEmbeddedByValue() {}
// UnsafeFleetsServer may be embedded to opt out of forward compatibility for this service. // UnsafeFleetsServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to FleetsServer will // Use of this interface is not recommended, as added methods to FleetsServer will
@@ -213,6 +244,13 @@ type UnsafeFleetsServer interface {
} }
func RegisterFleetsServer(s grpc.ServiceRegistrar, srv FleetsServer) { func RegisterFleetsServer(s grpc.ServiceRegistrar, srv FleetsServer) {
// If the following call pancis, it indicates UnimplementedFleetsServer was
// embedded by pointer and is nil. This will cause panics if an
// unimplemented method is ever invoked, so we test this at initialization
// time to prevent it from happening at runtime later due to I/O.
if t, ok := srv.(interface{ testEmbeddedByValue() }); ok {
t.testEmbeddedByValue()
}
s.RegisterService(&Fleets_ServiceDesc, srv) s.RegisterService(&Fleets_ServiceDesc, srv)
} }
@@ -226,7 +264,7 @@ func _Fleets_AddVehicle_Handler(srv interface{}, ctx context.Context, dec func(i
} }
info := &grpc.UnaryServerInfo{ info := &grpc.UnaryServerInfo{
Server: srv, Server: srv,
FullMethod: "/Fleets/AddVehicle", FullMethod: Fleets_AddVehicle_FullMethodName,
} }
handler := func(ctx context.Context, req interface{}) (interface{}, error) { handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(FleetsServer).AddVehicle(ctx, req.(*AddVehicleRequest)) return srv.(FleetsServer).AddVehicle(ctx, req.(*AddVehicleRequest))
@@ -244,7 +282,7 @@ func _Fleets_GetVehicle_Handler(srv interface{}, ctx context.Context, dec func(i
} }
info := &grpc.UnaryServerInfo{ info := &grpc.UnaryServerInfo{
Server: srv, Server: srv,
FullMethod: "/Fleets/GetVehicle", FullMethod: Fleets_GetVehicle_FullMethodName,
} }
handler := func(ctx context.Context, req interface{}) (interface{}, error) { handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(FleetsServer).GetVehicle(ctx, req.(*GetVehicleRequest)) return srv.(FleetsServer).GetVehicle(ctx, req.(*GetVehicleRequest))
@@ -262,7 +300,7 @@ func _Fleets_GetVehicles_Handler(srv interface{}, ctx context.Context, dec func(
} }
info := &grpc.UnaryServerInfo{ info := &grpc.UnaryServerInfo{
Server: srv, Server: srv,
FullMethod: "/Fleets/GetVehicles", FullMethod: Fleets_GetVehicles_FullMethodName,
} }
handler := func(ctx context.Context, req interface{}) (interface{}, error) { handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(FleetsServer).GetVehicles(ctx, req.(*GetVehiclesRequest)) return srv.(FleetsServer).GetVehicles(ctx, req.(*GetVehiclesRequest))
@@ -280,7 +318,7 @@ func _Fleets_UpdateVehicle_Handler(srv interface{}, ctx context.Context, dec fun
} }
info := &grpc.UnaryServerInfo{ info := &grpc.UnaryServerInfo{
Server: srv, Server: srv,
FullMethod: "/Fleets/UpdateVehicle", FullMethod: Fleets_UpdateVehicle_FullMethodName,
} }
handler := func(ctx context.Context, req interface{}) (interface{}, error) { handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(FleetsServer).UpdateVehicle(ctx, req.(*UpdateVehicleRequest)) return srv.(FleetsServer).UpdateVehicle(ctx, req.(*UpdateVehicleRequest))
@@ -298,7 +336,7 @@ func _Fleets_CreateBooking_Handler(srv interface{}, ctx context.Context, dec fun
} }
info := &grpc.UnaryServerInfo{ info := &grpc.UnaryServerInfo{
Server: srv, Server: srv,
FullMethod: "/Fleets/CreateBooking", FullMethod: Fleets_CreateBooking_FullMethodName,
} }
handler := func(ctx context.Context, req interface{}) (interface{}, error) { handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(FleetsServer).CreateBooking(ctx, req.(*CreateBookingRequest)) return srv.(FleetsServer).CreateBooking(ctx, req.(*CreateBookingRequest))
@@ -316,7 +354,7 @@ func _Fleets_GetBooking_Handler(srv interface{}, ctx context.Context, dec func(i
} }
info := &grpc.UnaryServerInfo{ info := &grpc.UnaryServerInfo{
Server: srv, Server: srv,
FullMethod: "/Fleets/GetBooking", FullMethod: Fleets_GetBooking_FullMethodName,
} }
handler := func(ctx context.Context, req interface{}) (interface{}, error) { handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(FleetsServer).GetBooking(ctx, req.(*GetBookingRequest)) return srv.(FleetsServer).GetBooking(ctx, req.(*GetBookingRequest))
@@ -334,7 +372,7 @@ func _Fleets_GetBookings_Handler(srv interface{}, ctx context.Context, dec func(
} }
info := &grpc.UnaryServerInfo{ info := &grpc.UnaryServerInfo{
Server: srv, Server: srv,
FullMethod: "/Fleets/GetBookings", FullMethod: Fleets_GetBookings_FullMethodName,
} }
handler := func(ctx context.Context, req interface{}) (interface{}, error) { handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(FleetsServer).GetBookings(ctx, req.(*GetBookingsRequest)) return srv.(FleetsServer).GetBookings(ctx, req.(*GetBookingsRequest))
@@ -352,7 +390,7 @@ func _Fleets_GetDriverBookings_Handler(srv interface{}, ctx context.Context, dec
} }
info := &grpc.UnaryServerInfo{ info := &grpc.UnaryServerInfo{
Server: srv, Server: srv,
FullMethod: "/Fleets/GetDriverBookings", FullMethod: Fleets_GetDriverBookings_FullMethodName,
} }
handler := func(ctx context.Context, req interface{}) (interface{}, error) { handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(FleetsServer).GetDriverBookings(ctx, req.(*GetDriverBookingsRequest)) return srv.(FleetsServer).GetDriverBookings(ctx, req.(*GetDriverBookingsRequest))
@@ -370,7 +408,7 @@ func _Fleets_UpdateBooking_Handler(srv interface{}, ctx context.Context, dec fun
} }
info := &grpc.UnaryServerInfo{ info := &grpc.UnaryServerInfo{
Server: srv, Server: srv,
FullMethod: "/Fleets/UpdateBooking", FullMethod: Fleets_UpdateBooking_FullMethodName,
} }
handler := func(ctx context.Context, req interface{}) (interface{}, error) { handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(FleetsServer).UpdateBooking(ctx, req.(*UpdateBookingRequest)) return srv.(FleetsServer).UpdateBooking(ctx, req.(*UpdateBookingRequest))
@@ -388,7 +426,7 @@ func _Fleets_DeleteBooking_Handler(srv interface{}, ctx context.Context, dec fun
} }
info := &grpc.UnaryServerInfo{ info := &grpc.UnaryServerInfo{
Server: srv, Server: srv,
FullMethod: "/Fleets/DeleteBooking", FullMethod: Fleets_DeleteBooking_FullMethodName,
} }
handler := func(ctx context.Context, req interface{}) (interface{}, error) { handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(FleetsServer).DeleteBooking(ctx, req.(*DeleteBookingRequest)) return srv.(FleetsServer).DeleteBooking(ctx, req.(*DeleteBookingRequest))
@@ -406,7 +444,7 @@ func _Fleets_FindVehicle_Handler(srv interface{}, ctx context.Context, dec func(
} }
info := &grpc.UnaryServerInfo{ info := &grpc.UnaryServerInfo{
Server: srv, Server: srv,
FullMethod: "/Fleets/FindVehicle", FullMethod: Fleets_FindVehicle_FullMethodName,
} }
handler := func(ctx context.Context, req interface{}) (interface{}, error) { handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(FleetsServer).FindVehicle(ctx, req.(*FindVehicleRequest)) return srv.(FleetsServer).FindVehicle(ctx, req.(*FindVehicleRequest))

View File

@@ -56,6 +56,8 @@ func (s FleetsServerImpl) GetVehicle(ctx context.Context, req *GetVehicleRequest
func (s FleetsServerImpl) GetVehicles(ctx context.Context, req *GetVehiclesRequest) (*GetVehiclesResponse, error) { func (s FleetsServerImpl) GetVehicles(ctx context.Context, req *GetVehiclesRequest) (*GetVehiclesResponse, error) {
filter := storage.VehicleFilters{ filter := storage.VehicleFilters{
Types: req.Types, Types: req.Types,
Administrators: req.Administrators,
IncludeDeleted: req.IncludeDeleted,
} }
if req.AvailabilityFrom.IsValid() { if req.AvailabilityFrom.IsValid() {
filter.AvailableFrom = req.AvailabilityFrom.AsTime() filter.AvailableFrom = req.AvailabilityFrom.AsTime()
@@ -79,9 +81,6 @@ func (s FleetsServerImpl) GetVehicles(ctx context.Context, req *GetVehiclesReque
return &GetVehiclesResponse{Vehicles: vehicles}, nil return &GetVehiclesResponse{Vehicles: vehicles}, nil
} }
func (s FleetsServerImpl) UpdateVehicle(context.Context, *UpdateVehicleRequest) (*UpdateVehicleResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method UpdateVehicle not implemented")
}
func (s FleetsServerImpl) CreateBooking(ctx context.Context, req *CreateBookingRequest) (*CreateBookingResponse, error) { func (s FleetsServerImpl) CreateBooking(ctx context.Context, req *CreateBookingRequest) (*CreateBookingResponse, error) {
b := req.Booking.ToStorageType() b := req.Booking.ToStorageType()
booking, err := s.handler.AddBooking(b) booking, err := s.handler.AddBooking(b)
@@ -126,9 +125,14 @@ func (s FleetsServerImpl) UpdateBooking(ctx context.Context, req *UpdateBookingR
return &UpdateBookingResponse{Booking: response}, nil return &UpdateBookingResponse{Booking: response}, nil
} }
func (s FleetsServerImpl) DeleteBooking(ctx context.Context, req *DeleteBookingRequest) (*DeleteBookingResponse, error) { func (s FleetsServerImpl) DeleteBooking(ctx context.Context, req *DeleteBookingRequest) (*DeleteBookingResponse, error) {
if err := s.handler.DeleteBooking(req.Id); err != nil { var deletionMetadata map[string]any
if req.DeletionMetadata != nil {
deletionMetadata = req.DeletionMetadata.AsMap()
}
if err := s.handler.DeleteBooking(req.Id, deletionMetadata); err != nil {
fmt.Println(err) fmt.Println(err)
return nil, status.Errorf(codes.Internal, "issue while retrieving booking : %v", err) return nil, status.Errorf(codes.Internal, "issue while deleting booking : %v", err)
} }
return &DeleteBookingResponse{ return &DeleteBookingResponse{
@@ -195,3 +199,19 @@ func Run(done chan error, cfg *viper.Viper, handler handlers.FleetsHandler) {
done <- err done <- err
} }
} }
/////////////////////update////////////////////////
func (s FleetsServerImpl) UpdateVehicle(ctx context.Context, req *UpdateVehicleRequest) (*UpdateVehicleResponse, error) {
b := req.Vehicle.ToStorageType()
vehicle, err := s.handler.UpdateVehicle(b)
if err != nil {
fmt.Println(err)
return nil, status.Errorf(codes.AlreadyExists, "vehicle update failed : %v", err)
}
response, err := VehicleFromStorageType(vehicle)
if err != nil {
fmt.Println(err)
return nil, status.Errorf(codes.Internal, "issue while retrieving vehicle : %v", err)
}
return &UpdateVehicleResponse{Vehicle: response}, nil
}

View File

@@ -1,107 +1,114 @@
// Code generated by protoc-gen-go. DO NOT EDIT. // Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.36.7
// protoc v6.31.1
// source: vehicles.proto // source: vehicles.proto
package grpcapi package grpcapi
import ( import (
fmt "fmt" protoreflect "google.golang.org/protobuf/reflect/protoreflect"
proto "github.com/golang/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl"
structpb "google.golang.org/protobuf/types/known/structpb" structpb "google.golang.org/protobuf/types/known/structpb"
timestamppb "google.golang.org/protobuf/types/known/timestamppb" timestamppb "google.golang.org/protobuf/types/known/timestamppb"
math "math" reflect "reflect"
sync "sync"
unsafe "unsafe"
) )
// Reference imports to suppress errors if they are not otherwise used. const (
var _ = proto.Marshal // Verify that this generated code is sufficiently up-to-date.
var _ = fmt.Errorf _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
var _ = math.Inf // Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
// This is a compile-time assertion to ensure that this generated file )
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
type Vehicle struct { type Vehicle struct {
state protoimpl.MessageState `protogen:"open.v1"`
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"`
Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"` Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"`
Administrators []string `protobuf:"bytes,4,rep,name=administrators,proto3" json:"administrators,omitempty"` Administrators []string `protobuf:"bytes,4,rep,name=administrators,proto3" json:"administrators,omitempty"`
Data *structpb.Struct `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"` Data *structpb.Struct `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"`
Bookings []*Booking `protobuf:"bytes,6,rep,name=bookings,proto3" json:"bookings,omitempty"` Bookings []*Booking `protobuf:"bytes,6,rep,name=bookings,proto3" json:"bookings,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` unknownFields protoimpl.UnknownFields
XXX_unrecognized []byte `json:"-"` sizeCache protoimpl.SizeCache
XXX_sizecache int32 `json:"-"` }
func (x *Vehicle) Reset() {
*x = Vehicle{}
mi := &file_vehicles_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *Vehicle) String() string {
return protoimpl.X.MessageStringOf(x)
} }
func (m *Vehicle) Reset() { *m = Vehicle{} }
func (m *Vehicle) String() string { return proto.CompactTextString(m) }
func (*Vehicle) ProtoMessage() {} func (*Vehicle) ProtoMessage() {}
func (x *Vehicle) ProtoReflect() protoreflect.Message {
mi := &file_vehicles_proto_msgTypes[0]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Vehicle.ProtoReflect.Descriptor instead.
func (*Vehicle) Descriptor() ([]byte, []int) { func (*Vehicle) Descriptor() ([]byte, []int) {
return fileDescriptor_b84b5fa4f4d86273, []int{0} return file_vehicles_proto_rawDescGZIP(), []int{0}
} }
func (m *Vehicle) XXX_Unmarshal(b []byte) error { func (x *Vehicle) GetId() string {
return xxx_messageInfo_Vehicle.Unmarshal(m, b) if x != nil {
} return x.Id
func (m *Vehicle) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Vehicle.Marshal(b, m, deterministic)
}
func (m *Vehicle) XXX_Merge(src proto.Message) {
xxx_messageInfo_Vehicle.Merge(m, src)
}
func (m *Vehicle) XXX_Size() int {
return xxx_messageInfo_Vehicle.Size(m)
}
func (m *Vehicle) XXX_DiscardUnknown() {
xxx_messageInfo_Vehicle.DiscardUnknown(m)
}
var xxx_messageInfo_Vehicle proto.InternalMessageInfo
func (m *Vehicle) GetId() string {
if m != nil {
return m.Id
} }
return "" return ""
} }
func (m *Vehicle) GetNamespace() string { func (x *Vehicle) GetNamespace() string {
if m != nil { if x != nil {
return m.Namespace return x.Namespace
} }
return "" return ""
} }
func (m *Vehicle) GetType() string { func (x *Vehicle) GetType() string {
if m != nil { if x != nil {
return m.Type return x.Type
} }
return "" return ""
} }
func (m *Vehicle) GetAdministrators() []string { func (x *Vehicle) GetAdministrators() []string {
if m != nil { if x != nil {
return m.Administrators return x.Administrators
} }
return nil return nil
} }
func (m *Vehicle) GetData() *structpb.Struct { func (x *Vehicle) GetData() *structpb.Struct {
if m != nil { if x != nil {
return m.Data return x.Data
} }
return nil return nil
} }
func (m *Vehicle) GetBookings() []*Booking { func (x *Vehicle) GetBookings() []*Booking {
if m != nil { if x != nil {
return m.Bookings return x.Bookings
} }
return nil return nil
} }
type Booking struct { type Booking struct {
state protoimpl.MessageState `protogen:"open.v1"`
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
Vehicleid string `protobuf:"bytes,2,opt,name=vehicleid,proto3" json:"vehicleid,omitempty"` Vehicleid string `protobuf:"bytes,2,opt,name=vehicleid,proto3" json:"vehicleid,omitempty"`
Driver string `protobuf:"bytes,3,opt,name=driver,proto3" json:"driver,omitempty"` Driver string `protobuf:"bytes,3,opt,name=driver,proto3" json:"driver,omitempty"`
@@ -110,141 +117,192 @@ type Booking struct {
Unavailablefrom *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=unavailablefrom,proto3" json:"unavailablefrom,omitempty"` Unavailablefrom *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=unavailablefrom,proto3" json:"unavailablefrom,omitempty"`
Unavailableto *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=unavailableto,proto3" json:"unavailableto,omitempty"` Unavailableto *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=unavailableto,proto3" json:"unavailableto,omitempty"`
Data *structpb.Struct `protobuf:"bytes,8,opt,name=data,proto3" json:"data,omitempty"` Data *structpb.Struct `protobuf:"bytes,8,opt,name=data,proto3" json:"data,omitempty"`
Deleted bool `protobuf:"varint,10,opt,name=deleted,proto3" json:"deleted,omitempty"`
Vehicle *Vehicle `protobuf:"bytes,9,opt,name=vehicle,proto3" json:"vehicle,omitempty"` Vehicle *Vehicle `protobuf:"bytes,9,opt,name=vehicle,proto3" json:"vehicle,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` Deleted bool `protobuf:"varint,10,opt,name=deleted,proto3" json:"deleted,omitempty"`
XXX_unrecognized []byte `json:"-"` unknownFields protoimpl.UnknownFields
XXX_sizecache int32 `json:"-"` sizeCache protoimpl.SizeCache
}
func (x *Booking) Reset() {
*x = Booking{}
mi := &file_vehicles_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *Booking) String() string {
return protoimpl.X.MessageStringOf(x)
} }
func (m *Booking) Reset() { *m = Booking{} }
func (m *Booking) String() string { return proto.CompactTextString(m) }
func (*Booking) ProtoMessage() {} func (*Booking) ProtoMessage() {}
func (x *Booking) ProtoReflect() protoreflect.Message {
mi := &file_vehicles_proto_msgTypes[1]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Booking.ProtoReflect.Descriptor instead.
func (*Booking) Descriptor() ([]byte, []int) { func (*Booking) Descriptor() ([]byte, []int) {
return fileDescriptor_b84b5fa4f4d86273, []int{1} return file_vehicles_proto_rawDescGZIP(), []int{1}
} }
func (m *Booking) XXX_Unmarshal(b []byte) error { func (x *Booking) GetId() string {
return xxx_messageInfo_Booking.Unmarshal(m, b) if x != nil {
} return x.Id
func (m *Booking) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Booking.Marshal(b, m, deterministic)
}
func (m *Booking) XXX_Merge(src proto.Message) {
xxx_messageInfo_Booking.Merge(m, src)
}
func (m *Booking) XXX_Size() int {
return xxx_messageInfo_Booking.Size(m)
}
func (m *Booking) XXX_DiscardUnknown() {
xxx_messageInfo_Booking.DiscardUnknown(m)
}
var xxx_messageInfo_Booking proto.InternalMessageInfo
func (m *Booking) GetId() string {
if m != nil {
return m.Id
} }
return "" return ""
} }
func (m *Booking) GetVehicleid() string { func (x *Booking) GetVehicleid() string {
if m != nil { if x != nil {
return m.Vehicleid return x.Vehicleid
} }
return "" return ""
} }
func (m *Booking) GetDriver() string { func (x *Booking) GetDriver() string {
if m != nil { if x != nil {
return m.Driver return x.Driver
} }
return "" return ""
} }
func (m *Booking) GetStartdate() *timestamppb.Timestamp { func (x *Booking) GetStartdate() *timestamppb.Timestamp {
if m != nil { if x != nil {
return m.Startdate return x.Startdate
} }
return nil return nil
} }
func (m *Booking) GetEnddate() *timestamppb.Timestamp { func (x *Booking) GetEnddate() *timestamppb.Timestamp {
if m != nil { if x != nil {
return m.Enddate return x.Enddate
} }
return nil return nil
} }
func (m *Booking) GetUnavailablefrom() *timestamppb.Timestamp { func (x *Booking) GetUnavailablefrom() *timestamppb.Timestamp {
if m != nil { if x != nil {
return m.Unavailablefrom return x.Unavailablefrom
} }
return nil return nil
} }
func (m *Booking) GetUnavailableto() *timestamppb.Timestamp { func (x *Booking) GetUnavailableto() *timestamppb.Timestamp {
if m != nil { if x != nil {
return m.Unavailableto return x.Unavailableto
} }
return nil return nil
} }
func (m *Booking) GetData() *structpb.Struct { func (x *Booking) GetData() *structpb.Struct {
if m != nil { if x != nil {
return m.Data return x.Data
} }
return nil return nil
} }
func (m *Booking) GetDeleted() bool { func (x *Booking) GetVehicle() *Vehicle {
if m != nil { if x != nil {
return m.Deleted return x.Vehicle
}
return nil
}
func (x *Booking) GetDeleted() bool {
if x != nil {
return x.Deleted
} }
return false return false
} }
func (m *Booking) GetVehicle() *Vehicle { var File_vehicles_proto protoreflect.FileDescriptor
if m != nil {
return m.Vehicle const file_vehicles_proto_rawDesc = "" +
} "\n" +
return nil "\x0evehicles.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xc6\x01\n" +
"\aVehicle\x12\x0e\n" +
"\x02id\x18\x01 \x01(\tR\x02id\x12\x1c\n" +
"\tnamespace\x18\x02 \x01(\tR\tnamespace\x12\x12\n" +
"\x04type\x18\x03 \x01(\tR\x04type\x12&\n" +
"\x0eadministrators\x18\x04 \x03(\tR\x0eadministrators\x12+\n" +
"\x04data\x18\x05 \x01(\v2\x17.google.protobuf.StructR\x04data\x12$\n" +
"\bbookings\x18\x06 \x03(\v2\b.BookingR\bbookings\"\xb2\x03\n" +
"\aBooking\x12\x0e\n" +
"\x02id\x18\x01 \x01(\tR\x02id\x12\x1c\n" +
"\tvehicleid\x18\x02 \x01(\tR\tvehicleid\x12\x16\n" +
"\x06driver\x18\x03 \x01(\tR\x06driver\x128\n" +
"\tstartdate\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\tstartdate\x124\n" +
"\aenddate\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\aenddate\x12D\n" +
"\x0funavailablefrom\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\x0funavailablefrom\x12@\n" +
"\runavailableto\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\runavailableto\x12+\n" +
"\x04data\x18\b \x01(\v2\x17.google.protobuf.StructR\x04data\x12\"\n" +
"\avehicle\x18\t \x01(\v2\b.VehicleR\avehicle\x12\x18\n" +
"\adeleted\x18\n" +
" \x01(\bR\adeletedB.Z,git.coopgo.io/coopgo-platform/fleets/grpcapib\x06proto3"
var (
file_vehicles_proto_rawDescOnce sync.Once
file_vehicles_proto_rawDescData []byte
)
func file_vehicles_proto_rawDescGZIP() []byte {
file_vehicles_proto_rawDescOnce.Do(func() {
file_vehicles_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_vehicles_proto_rawDesc), len(file_vehicles_proto_rawDesc)))
})
return file_vehicles_proto_rawDescData
} }
func init() { var file_vehicles_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
proto.RegisterType((*Vehicle)(nil), "Vehicle") var file_vehicles_proto_goTypes = []any{
proto.RegisterType((*Booking)(nil), "Booking") (*Vehicle)(nil), // 0: Vehicle
(*Booking)(nil), // 1: Booking
(*structpb.Struct)(nil), // 2: google.protobuf.Struct
(*timestamppb.Timestamp)(nil), // 3: google.protobuf.Timestamp
}
var file_vehicles_proto_depIdxs = []int32{
2, // 0: Vehicle.data:type_name -> google.protobuf.Struct
1, // 1: Vehicle.bookings:type_name -> Booking
3, // 2: Booking.startdate:type_name -> google.protobuf.Timestamp
3, // 3: Booking.enddate:type_name -> google.protobuf.Timestamp
3, // 4: Booking.unavailablefrom:type_name -> google.protobuf.Timestamp
3, // 5: Booking.unavailableto:type_name -> google.protobuf.Timestamp
2, // 6: Booking.data:type_name -> google.protobuf.Struct
0, // 7: Booking.vehicle:type_name -> Vehicle
8, // [8:8] is the sub-list for method output_type
8, // [8:8] is the sub-list for method input_type
8, // [8:8] is the sub-list for extension type_name
8, // [8:8] is the sub-list for extension extendee
0, // [0:8] is the sub-list for field type_name
} }
func init() { func init() { file_vehicles_proto_init() }
proto.RegisterFile("vehicles.proto", fileDescriptor_b84b5fa4f4d86273) func file_vehicles_proto_init() {
if File_vehicles_proto != nil {
return
} }
type x struct{}
var fileDescriptor_b84b5fa4f4d86273 = []byte{ out := protoimpl.TypeBuilder{
// 384 bytes of a gzipped FileDescriptorProto File: protoimpl.DescBuilder{
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0x5d, 0xab, 0xd4, 0x30, GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
0x10, 0xa5, 0xbb, 0xbd, 0xfd, 0x98, 0x8b, 0x2b, 0xe4, 0x41, 0xc3, 0xe5, 0x82, 0x65, 0x11, 0x29, RawDescriptor: unsafe.Slice(unsafe.StringData(file_vehicles_proto_rawDesc), len(file_vehicles_proto_rawDesc)),
0xa8, 0x29, 0x5c, 0x7d, 0xf0, 0x51, 0x2e, 0xfe, 0x82, 0x2a, 0x3e, 0xf8, 0x96, 0x36, 0xd3, 0x1a, NumEnums: 0,
0x6c, 0x9b, 0x90, 0xcc, 0x2e, 0xf8, 0xb7, 0xfc, 0x11, 0xfe, 0x2e, 0x21, 0x6d, 0xf7, 0xea, 0x2a, NumMessages: 2,
0xac, 0x6f, 0x99, 0x73, 0xe6, 0x0c, 0xe7, 0xcc, 0x04, 0x76, 0x47, 0xfc, 0xaa, 0xdb, 0x01, 0xbd, NumExtensions: 0,
0xb0, 0xce, 0x90, 0xb9, 0xb9, 0xed, 0x8d, 0xe9, 0x07, 0xac, 0x42, 0xd5, 0x1c, 0xba, 0xca, 0x93, NumServices: 0,
0x3b, 0xb4, 0xb4, 0xb0, 0xcf, 0xce, 0x59, 0xd2, 0x23, 0x7a, 0x92, 0xa3, 0x9d, 0x1b, 0xf6, 0x3f, },
0x23, 0x48, 0x3f, 0xcf, 0x13, 0xd9, 0x0e, 0x36, 0x5a, 0xf1, 0xa8, 0x88, 0xca, 0xbc, 0xde, 0x68, GoTypes: file_vehicles_proto_goTypes,
0xc5, 0x6e, 0x21, 0x9f, 0xe4, 0x88, 0xde, 0xca, 0x16, 0xf9, 0x26, 0xc0, 0x0f, 0x00, 0x63, 0x10, DependencyIndexes: file_vehicles_proto_depIdxs,
0xd3, 0x77, 0x8b, 0x7c, 0x1b, 0x88, 0xf0, 0x66, 0x2f, 0x60, 0x27, 0xd5, 0xa8, 0x27, 0xed, 0xc9, MessageInfos: file_vehicles_proto_msgTypes,
0x49, 0x32, 0xce, 0xf3, 0xb8, 0xd8, 0x96, 0x79, 0x7d, 0x86, 0xb2, 0x97, 0x10, 0x2b, 0x49, 0x92, }.Build()
0x5f, 0x15, 0x51, 0x79, 0x7d, 0xf7, 0x54, 0xcc, 0x2e, 0xc5, 0xea, 0x52, 0x7c, 0x0c, 0x19, 0xea, File_vehicles_proto = out.File
0xd0, 0xc4, 0x9e, 0x43, 0xd6, 0x18, 0xf3, 0x4d, 0x4f, 0xbd, 0xe7, 0x49, 0xb1, 0x2d, 0xaf, 0xef, file_vehicles_proto_goTypes = nil
0x32, 0x71, 0x3f, 0x03, 0xf5, 0x89, 0xd9, 0xff, 0xd8, 0x42, 0xba, 0xa0, 0xff, 0x0a, 0xb2, 0x6c, file_vehicles_proto_depIdxs = nil
0x4d, 0xab, 0x35, 0xc8, 0x09, 0x60, 0x4f, 0x20, 0x51, 0x4e, 0x1f, 0xd1, 0x2d, 0x51, 0x96, 0x8a,
0xbd, 0x83, 0xdc, 0x93, 0x74, 0xa4, 0x24, 0x21, 0x8f, 0x83, 0xd3, 0x9b, 0xbf, 0x9c, 0x7e, 0x5a,
0xf7, 0x59, 0x3f, 0x34, 0xb3, 0xb7, 0x90, 0xe2, 0xa4, 0x82, 0xee, 0xea, 0xa2, 0x6e, 0x6d, 0x65,
0x1f, 0xe0, 0xf1, 0x61, 0x92, 0x47, 0xa9, 0x07, 0xd9, 0x0c, 0xd8, 0x39, 0x33, 0xf2, 0xe4, 0xa2,
0xfa, 0x5c, 0xc2, 0xde, 0xc3, 0xa3, 0xdf, 0x20, 0x32, 0x3c, 0xbd, 0x38, 0xe3, 0x4f, 0xc1, 0xe9,
0x38, 0xd9, 0xff, 0x1c, 0x87, 0x43, 0xaa, 0x70, 0x40, 0x42, 0xc5, 0xa1, 0x88, 0xca, 0xac, 0x5e,
0x4b, 0xb6, 0x87, 0x74, 0xd9, 0x31, 0xcf, 0xc3, 0xa4, 0x4c, 0x2c, 0x1f, 0xad, 0x5e, 0x89, 0x7b,
0xf1, 0xe5, 0x55, 0xaf, 0x49, 0xb4, 0xc6, 0xd8, 0xde, 0x08, 0x6d, 0xaa, 0xf9, 0xf5, 0xda, 0x0e,
0x92, 0x3a, 0xe3, 0xc6, 0xaa, 0x1b, 0x10, 0xc9, 0x57, 0xbd, 0xb3, 0xad, 0xb4, 0xba, 0x49, 0x82,
0x89, 0x37, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xe0, 0xd8, 0xa7, 0x63, 0x05, 0x03, 0x00, 0x00,
} }

View File

@@ -23,6 +23,7 @@ message Booking {
google.protobuf.Timestamp unavailablefrom = 6; google.protobuf.Timestamp unavailablefrom = 6;
google.protobuf.Timestamp unavailableto = 7; google.protobuf.Timestamp unavailableto = 7;
google.protobuf.Struct data = 8; google.protobuf.Struct data = 8;
bool deleted = 10;
Vehicle vehicle = 9; Vehicle vehicle = 9;
bool deleted = 10;
} }

View File

@@ -1,7 +1,7 @@
package handlers package handlers
import ( import (
"errors" "time"
"git.coopgo.io/coopgo-platform/fleets/storage" "git.coopgo.io/coopgo-platform/fleets/storage"
"github.com/google/uuid" "github.com/google/uuid"
@@ -26,23 +26,15 @@ func (h FleetsHandler) GetBooking(id string) (booking *storage.Booking, err erro
return nil, err return nil, err
} }
if booking.Deleted {
return nil, errors.New("booking was deleted")
}
vehicle, err := h.storage.GetVehicle(booking.Vehicleid) vehicle, err := h.storage.GetVehicle(booking.Vehicleid)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if err != nil {
return nil, err
}
booking.Vehicle = *vehicle booking.Vehicle = *vehicle
return return
} }
func (h FleetsHandler) UpdateBooking(booking storage.Booking) (*storage.Booking, error) { func (h FleetsHandler) UpdateBooking(booking storage.Booking) (*storage.Booking, error) {
// Store the account // Store the account
if err := h.storage.UpdateBooking(booking); err != nil { if err := h.storage.UpdateBooking(booking); err != nil {
return nil, err return nil, err
@@ -51,8 +43,33 @@ func (h FleetsHandler) UpdateBooking(booking storage.Booking) (*storage.Booking,
return &booking, nil return &booking, nil
} }
func (h FleetsHandler) DeleteBooking(id string) error { func (h FleetsHandler) DeleteBooking(id string, deletionMetadata map[string]any) error {
return h.storage.DeleteBooking(id) // Get the existing booking
booking, err := h.storage.GetBooking(id)
if err != nil {
return err
}
// Mark as deleted instead of hard delete
booking.Deleted = true
// Add deletion metadata to data
if booking.Data == nil {
booking.Data = make(map[string]any)
}
// Add deletion timestamp
booking.Data["deleted_at"] = time.Now().Format(time.RFC3339)
// Merge provided deletion metadata
if deletionMetadata != nil {
for key, value := range deletionMetadata {
booking.Data[key] = value
}
}
// Update the booking instead of deleting
return h.storage.UpdateBooking(*booking)
} }
func (h FleetsHandler) GetBookings() ([]storage.Booking, error) { func (h FleetsHandler) GetBookings() ([]storage.Booking, error) {

View File

@@ -1,8 +1,11 @@
package handlers package handlers
import ( import (
"slices"
"time" "time"
// "Documents/go_projet/go/pkg/mod/git.coopgo.io/coopgo-platform/fleets@v0.0.0-20230310144446-feb935f8bf4e/storage"
"git.coopgo.io/coopgo-platform/fleets/storage" "git.coopgo.io/coopgo-platform/fleets/storage"
"github.com/google/uuid" "github.com/google/uuid"
) )
@@ -39,20 +42,49 @@ func (h FleetsHandler) GetVehicle(id string) (vehicle *storage.Vehicle, err erro
func (h FleetsHandler) GetVehicles(namespaces []string, filters storage.VehicleFilters) ([]storage.Vehicle, error) { func (h FleetsHandler) GetVehicles(namespaces []string, filters storage.VehicleFilters) ([]storage.Vehicle, error) {
vehicles, err := h.storage.GetVehicles(namespaces) vehicles, err := h.storage.GetVehicles(namespaces)
newvehicles := []storage.Vehicle{}
for _, v := range vehicles {
bookings, err := h.storage.GetBookingsForVehicle(v.ID)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// Filter vehicles and bookings using slices.Collect
return slices.Collect(func(yield func(storage.Vehicle) bool) {
for _, v := range vehicles {
bookings, err := h.storage.GetBookingsForVehicle(v.ID)
if err != nil {
continue // Skip vehicles with booking errors
}
// Filter deleted bookings unless specifically requested
if !filters.IncludeDeleted {
v.Bookings = slices.Collect(func(yieldBooking func(storage.Booking) bool) {
for _, booking := range bookings {
if !booking.Deleted {
if !yieldBooking(booking) {
return
}
}
}
})
} else {
v.Bookings = bookings v.Bookings = bookings
if !v.MatchesFilters(filters) {
continue
} }
newvehicles = append(newvehicles, v) if v.MatchesFilters(filters) {
if !yield(v) {
return
} }
return newvehicles, err }
}
}), nil
}
/////////////////update///////////////
func (h FleetsHandler) UpdateVehicle(vehicle storage.Vehicle) (*storage.Vehicle, error) {
// Store the account
if err := h.storage.UpdateVehicle(vehicle); err != nil {
return nil, err
}
return &vehicle, nil
} }

View File

@@ -18,6 +18,7 @@ func main() {
var ( var (
service_name = cfg.GetString("name") service_name = cfg.GetString("name")
grpc_enable = cfg.GetBool("services.grpc.enable") grpc_enable = cfg.GetBool("services.grpc.enable")
dev_env = cfg.GetBool("dev_env")
) )
storage, err := storage.NewStorage(cfg) storage, err := storage.NewStorage(cfg)
@@ -28,6 +29,9 @@ func main() {
handler := handlers.NewHandler(cfg, storage) handler := handlers.NewHandler(cfg, storage)
fmt.Println("Running", service_name, ":") fmt.Println("Running", service_name, ":")
if dev_env {
fmt.Printf("\033]0;%s\007", service_name)
}
failed := make(chan error) failed := make(chan error)

View File

@@ -17,6 +17,7 @@ type Booking struct {
Unavailablefrom time.Time `json:"unavailablefrom"` Unavailablefrom time.Time `json:"unavailablefrom"`
Unavailableto time.Time `json:"unavailableto"` Unavailableto time.Time `json:"unavailableto"`
Data map[string]any `json:"data"` Data map[string]any `json:"data"`
Deleted bool `json:"deleted"` Deleted bool `json:"deleted"`
Vehicle Vehicle `json:"vehicle" bson:"-"` Vehicle Vehicle `json:"vehicle" bson:"-"`
} }

View File

@@ -236,3 +236,14 @@ func (s MongoDBStorage) DeleteBooking(bookingid string) error {
return err return err
} }
/////////////////////update///////////////
func (s MongoDBStorage) UpdateVehicle(vehicle Vehicle) error {
collection := s.Client.Database(s.DbName).Collection(s.Collections["vehicles"])
if _, err := collection.ReplaceOne(context.TODO(), bson.M{"_id": vehicle.ID}, vehicle); err != nil {
fmt.Println(err)
return err
}
return nil
}

582
storage/postgresql.go Normal file
View File

@@ -0,0 +1,582 @@
package storage
import (
"context"
"database/sql"
"encoding/json"
"fmt"
"os"
"strconv"
"ariga.io/atlas/sql/postgres"
"ariga.io/atlas/sql/schema"
"github.com/lib/pq"
_ "github.com/lib/pq"
"github.com/spf13/viper"
)
type PostgresqlStorage struct {
DbConnection *sql.DB
Schema string
Tables map[string]string
}
func NewPostgresqlStorage(cfg *viper.Viper) (PostgresqlStorage, error) {
var (
host = cfg.GetString("storage.db.psql.host")
port = cfg.GetString("storage.db.psql.port")
user = cfg.GetString("storage.db.psql.user")
password = cfg.GetString("storage.db.psql.password")
dbname = cfg.GetString("storage.db.psql.dbname")
sslmode = cfg.GetString("storage.db.psql.sslmode")
pg_schema = cfg.GetString("storage.db.psql.schema")
pgtables_vehicle = cfg.GetString("storage.db.psql.tables.vehicle")
pgtables_booking = cfg.GetString("storage.db.psql.tables.booking")
timezone = "Europe/Paris"
)
portInt, _ := strconv.Atoi(port)
psqlconn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s TimeZone=%s", host, portInt,
user, password, dbname, sslmode, timezone)
db, err := sql.Open("postgres", psqlconn)
if err != nil {
fmt.Println("error", err)
return PostgresqlStorage{}, fmt.Errorf("connection to postgresql failed")
}
err = db.Ping()
if err != nil {
fmt.Println(err)
return PostgresqlStorage{}, fmt.Errorf("connection to postgresql database failed")
}
return PostgresqlStorage{
DbConnection: db,
Schema: pg_schema,
Tables: map[string]string{
"vehicle": fmt.Sprintf("%s.%s", pg_schema, pgtables_vehicle),
"booking": fmt.Sprintf("%s.%s", pg_schema, pgtables_booking),
},
}, nil
}
func (psql PostgresqlStorage) CreateVehicle(vehicle Vehicle) error {
tx, err := psql.DbConnection.Begin()
if err != nil {
return fmt.Errorf("failed to begin transaction: %w", err)
}
vehicleQuery := fmt.Sprintf(`
INSERT INTO %s (id, type, namespace, administrators, data, metadata)
VALUES ($1, $2, $3, $4, $5, $6)
`, psql.Tables["vehicle"])
data, err := json.Marshal(vehicle.Data)
if err != nil {
return err
}
metadata, err := json.Marshal(vehicle.Metadata)
if err != nil {
return err
}
_, err = tx.Exec(vehicleQuery, vehicle.ID, vehicle.Type, vehicle.Namespace, pq.Array(vehicle.Administrators),
data, metadata)
if err != nil {
tx.Rollback()
return fmt.Errorf("failed to insert vehicle: %w", err)
}
bookingQuery := fmt.Sprintf(`
INSERT INTO %s (id, vehicleid, driver, startdate, enddate, unavailablefrom, unavailableto, data, deleted)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
`, psql.Tables["booking"])
for _, booking := range vehicle.Bookings {
dataBooking, err := json.Marshal(booking.Data)
if err != nil {
return err
}
_, err = tx.Exec(bookingQuery, booking.ID, booking.Vehicleid, booking.Driver,
booking.Startdate, booking.Enddate, booking.Unavailablefrom, booking.Unavailableto,
dataBooking, booking.Deleted)
if err != nil {
tx.Rollback()
return fmt.Errorf("failed to insert booking: %w", err)
}
}
err = tx.Commit()
if err != nil {
tx.Rollback()
return fmt.Errorf("failed to commit transaction: %w", err)
}
return nil
}
func (psql PostgresqlStorage) GetVehicle(id string) (*Vehicle, error) {
vehicle := &Vehicle{}
var vehicleData []byte
var vehicleMetadata []byte
query := fmt.Sprintf(`
SELECT id, type, namespace, administrators, data, metadata
FROM %s
WHERE id = $1
`, psql.Tables["vehicle"])
err := psql.DbConnection.QueryRow(query, id).Scan(
&vehicle.ID,
&vehicle.Type,
&vehicle.Namespace,
pq.Array(&vehicle.Administrators),
&vehicleData,
&vehicleMetadata,
)
err = json.Unmarshal(vehicleData, &vehicle.Data)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal vehicle data")
}
err = json.Unmarshal(vehicleMetadata, &vehicle.Metadata)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal vehicle metadata")
}
if err != nil {
if err == sql.ErrNoRows {
return nil, fmt.Errorf("vehicle not found")
}
return nil, fmt.Errorf("failed to query database: %w", err)
}
return vehicle, nil
}
func (psql PostgresqlStorage) GetVehicles(namespaces []string) ([]Vehicle, error) {
var vehicles []Vehicle
if len(namespaces) == 0 {
return vehicles, nil
}
query := fmt.Sprintf(`
SELECT id, type, namespace, administrators, data, metadata
FROM %s
WHERE namespace = ANY($1)
`, psql.Tables["vehicle"])
rows, err := psql.DbConnection.Query(query, pq.Array(namespaces))
if err != nil {
return nil, fmt.Errorf("failed to query database: %w", err)
}
defer rows.Close()
for rows.Next() {
var vehicle Vehicle
var administrators []string
var vehicleData []byte
var vehicleMetadata []byte
scanArgs := []interface{}{
&vehicle.ID,
&vehicle.Type,
&vehicle.Namespace,
pq.Array(&administrators),
&vehicleData,
&vehicleMetadata,
}
err := rows.Scan(scanArgs...)
if err != nil {
return nil, fmt.Errorf("failed to scan row: %w", err)
}
vehicle.Administrators = administrators
err = json.Unmarshal(vehicleData, &vehicle.Data)
if err != nil {
return nil, err
}
err = json.Unmarshal(vehicleMetadata, &vehicle.Metadata)
if err != nil {
return nil, err
}
vehicles = append(vehicles, vehicle)
}
if err := rows.Err(); err != nil {
return nil, fmt.Errorf("unexpected error after iterating rows: %w", err)
}
return vehicles, nil
}
func (psql PostgresqlStorage) CreateBooking(booking Booking) error {
query := fmt.Sprintf(`
INSERT INTO %s (id, vehicleid, driver, startdate, enddate, unavailablefrom, unavailableto, data, deleted)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
`, psql.Tables["booking"])
bookingData, err := json.Marshal(booking.Data)
if err != nil {
return fmt.Errorf("failed to marshal booking data: %w", err)
}
_, err = psql.DbConnection.Exec(query, booking.ID, booking.Vehicleid, booking.Driver, booking.Startdate,
booking.Enddate, booking.Unavailablefrom, booking.Unavailableto, bookingData, booking.Deleted)
if err != nil {
return fmt.Errorf("failed to insert booking record: %w", err)
}
return nil
}
func (psql PostgresqlStorage) UpdateBooking(bookingToUpdate Booking) error {
query := fmt.Sprintf(`
UPDATE %s SET
driver = $1,
startdate = $2,
enddate = $3,
unavailablefrom = $4,
unavailableto = $5,
data = $6,
deleted = $7
WHERE id = $8
`, psql.Tables["booking"])
bookingData, err := json.Marshal(bookingToUpdate.Data)
if err != nil {
return fmt.Errorf("failed to marshal booking data: %w", err)
}
_, err = psql.DbConnection.Exec(
query,
bookingToUpdate.Driver,
bookingToUpdate.Startdate,
bookingToUpdate.Enddate,
bookingToUpdate.Unavailablefrom,
bookingToUpdate.Unavailableto,
bookingData,
bookingToUpdate.Deleted,
bookingToUpdate.ID,
)
if err != nil {
return fmt.Errorf("failed to update booking: %w", err)
}
return nil
}
func (psql PostgresqlStorage) GetBooking(id string) (*Booking, error) {
booking := &Booking{}
query := fmt.Sprintf(`
SELECT b.id, b.vehicleid, b.driver, b.startdate, b.enddate,
b.unavailablefrom, b.unavailableto, b.data, b.deleted,
v.id, v.type, v.namespace, v.administrators, v.data, v.metadata
FROM %s b
LEFT JOIN %s v ON b.vehicleid = v.id
WHERE b.id = $1
`, psql.Tables["booking"], psql.Tables["vehicle"])
row := psql.DbConnection.QueryRow(query, id)
var administrators []string
var bookingData []byte
var vehicleData []byte
var vehicleMetadata []byte
err := row.Scan(
&booking.ID,
&booking.Vehicleid,
&booking.Driver,
&booking.Startdate,
&booking.Enddate,
&booking.Unavailablefrom,
&booking.Unavailableto,
&bookingData,
&booking.Deleted,
&booking.Vehicle.ID,
&booking.Vehicle.Type,
&booking.Vehicle.Namespace,
pq.Array(&administrators),
&vehicleData,
&vehicleMetadata,
)
if err != nil {
return nil, fmt.Errorf("error receiving booking: %w", err)
}
err = json.Unmarshal(bookingData, &booking.Data)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal booking data: %w", err)
}
err = json.Unmarshal(vehicleData, &booking.Vehicle.Data)
if err != nil {
return nil, err
}
err = json.Unmarshal(vehicleMetadata, &booking.Vehicle.Metadata)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal vehicle metadata: %w", err)
}
booking.Vehicle.Administrators = administrators
return booking, nil
}
func (psql PostgresqlStorage) GetBookings() ([]Booking, error) {
var bookings []Booking
query := fmt.Sprintf(`
SELECT b.id, b.vehicleid, b.driver, b.startdate, b.enddate,
b.unavailablefrom, b.unavailableto, b.data, b.deleted,
v.id, v.type, v.namespace, v.administrators, v.data, v.metadata
FROM %s b
LEFT JOIN %s v ON b.vehicleid = v.id
`, psql.Tables["booking"], psql.Tables["vehicle"])
rows, err := psql.DbConnection.Query(query)
if err != nil {
return nil, fmt.Errorf("failed to retrieve bookings: %w", err)
}
defer rows.Close()
for rows.Next() {
var booking Booking
var administrators []string
var bookingData []byte
var vehicleData []byte
var vehicleMetadata []byte
err = rows.Scan(
&booking.ID,
&booking.Vehicleid,
&booking.Driver,
&booking.Startdate,
&booking.Enddate,
&booking.Unavailablefrom,
&booking.Unavailableto,
&bookingData,
&booking.Deleted,
&booking.Vehicle.ID,
&booking.Vehicle.Type,
&booking.Vehicle.Namespace,
pq.Array(&administrators),
&vehicleData,
&vehicleMetadata,
)
if err != nil {
return nil, fmt.Errorf("error receiving booking: %w", err)
}
err = json.Unmarshal(bookingData, &booking.Data)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal booking data: %w", err)
}
err = json.Unmarshal(vehicleData, &booking.Vehicle.Data)
if err != nil {
return nil, err
}
err = json.Unmarshal(vehicleMetadata, &booking.Vehicle.Metadata)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal vehicle metadata: %w", err)
}
booking.Vehicle.Administrators = administrators
bookings = append(bookings, booking)
}
if err = rows.Err(); err != nil {
return nil, fmt.Errorf("failed to retrieve bookings: %w", err)
}
return bookings, nil
}
func (psql PostgresqlStorage) GetBookingsForVehicle(vehicleid string) ([]Booking, error) {
var bookings []Booking
query := fmt.Sprintf(`
SELECT b.id, b.vehicleid, b.driver, b.startdate, b.enddate,
b.unavailablefrom, b.unavailableto, b.data, b.deleted,
v.id, v.type, v.namespace, v.administrators, v.data, v.metadata
FROM %s b
LEFT JOIN %s v ON b.vehicleid = v.id
WHERE b.vehicleid = $1
`, psql.Tables["booking"], psql.Tables["vehicle"])
rows, err := psql.DbConnection.Query(query, vehicleid)
if err != nil {
return nil, fmt.Errorf("error retrieving bookings for vehicle: %w", err)
}
for rows.Next() {
var administrators []string
var bookingData []byte
var vehicleData []byte
var vehicleMetadata []byte
var booking Booking
err := rows.Scan(
&booking.ID,
&booking.Vehicleid,
&booking.Driver,
&booking.Startdate,
&booking.Enddate,
&booking.Unavailablefrom,
&booking.Unavailableto,
&bookingData,
&booking.Deleted,
&booking.Vehicle.ID,
&booking.Vehicle.Type,
&booking.Vehicle.Namespace,
pq.Array(&administrators),
&vehicleData,
&vehicleMetadata,
)
if err != nil {
return nil, fmt.Errorf("error scanning booking row: %w", err)
}
err = json.Unmarshal(bookingData, &booking.Data)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal booking data: %w", err)
}
err = json.Unmarshal(vehicleData, &booking.Vehicle.Data)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal vehicle data: %w", err)
}
err = json.Unmarshal(vehicleMetadata, &booking.Vehicle.Metadata)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal vehicle metadata: %w", err)
}
booking.Vehicle.Administrators = administrators
bookings = append(bookings, booking)
}
if err := rows.Err(); err != nil {
return nil, fmt.Errorf("error iterating over booking rows: %w", err)
}
return bookings, nil
}
func (psql PostgresqlStorage) GetBookingsForDriver(driver string) ([]Booking, error) {
bookings := []Booking{}
query := fmt.Sprintf(`
SELECT b.id, b.vehicleid, b.driver, b.startdate, b.enddate,
b.unavailablefrom, b.unavailableto, b.data, b.deleted,
v.id, v.type, v.namespace, v.administrators, v.data, v.metadata
FROM %s b
LEFT JOIN %s v ON b.vehicleid = v.id
WHERE b.driver = $1
`, psql.Tables["booking"], psql.Tables["vehicle"])
rows, err := psql.DbConnection.Query(query, driver)
if err != nil {
return nil, fmt.Errorf("error querying bookings: %w", err)
}
defer rows.Close()
for rows.Next() {
booking := Booking{}
var administrators []string
var bookingData []byte
var vehicleData []byte
var vehicleMetadata []byte
err = rows.Scan(
&booking.ID,
&booking.Vehicleid,
&booking.Driver,
&booking.Startdate,
&booking.Enddate,
&booking.Unavailablefrom,
&booking.Unavailableto,
&bookingData,
&booking.Deleted,
&booking.Vehicle.ID,
&booking.Vehicle.Type,
&booking.Vehicle.Namespace,
pq.Array(&administrators),
&vehicleData,
&vehicleMetadata,
)
if err != nil {
return nil, fmt.Errorf("error scanning bookings: %w", err)
}
err = json.Unmarshal(bookingData, &booking.Data)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal booking data: %w", err)
}
err = json.Unmarshal(vehicleData, &booking.Vehicle.Data)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal vehicle data: %w", err)
}
err = json.Unmarshal(vehicleMetadata, &booking.Vehicle.Metadata)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal vehicle metadata: %w", err)
}
booking.Vehicle.Administrators = administrators
bookings = append(bookings, booking)
}
return bookings, nil
}
func (psql PostgresqlStorage) DeleteBooking(id string) error {
query := fmt.Sprintf(`
DELETE FROM %s
WHERE id = $1
`, psql.Tables["booking"])
_, err := psql.DbConnection.Exec(query, id)
if err != nil {
return fmt.Errorf("error deleting booking: %v", err)
}
return nil
}
func (psql PostgresqlStorage) Migrate() error {
ctx := context.Background()
driver, err := postgres.Open(psql.DbConnection)
if err != nil {
return err
}
existing, err := driver.InspectRealm(ctx, &schema.InspectRealmOption{Schemas: []string{psql.Schema}})
if err != nil {
return err
}
var desired schema.Realm
hcl, err := os.ReadFile("postgresql/schema.hcl")
if err != nil {
return err
}
err = postgres.EvalHCLBytes(hcl, &desired, nil)
if err != nil {
return err
}
diff, err := driver.RealmDiff(existing, &desired)
if err != nil {
return err
}
err = driver.ApplyChanges(ctx, diff)
if err != nil {
return err
}
return nil
}
func (psql PostgresqlStorage) UpdateVehicle(vehicle Vehicle) error {
return nil
}

View File

@@ -0,0 +1,88 @@
table "booking" {
schema = schema.fleets
column "id" {
null = false
type = uuid
}
column "vehicleid" {
null = true
type = uuid
}
column "driver" {
null = true
type = text
}
column "startdate" {
null = true
type = timestamptz
}
column "enddate" {
null = true
type = timestamptz
}
column "unavailablefrom" {
null = true
type = timestamptz
}
column "unavailableto" {
null = true
type = timestamptz
}
column "data" {
null = true
type = jsonb
}
column "deleted" {
null = true
type = boolean
}
primary_key {
columns = [column.id]
}
foreign_key "booking_vehicleid_fkey" {
columns = [column.vehicleid]
ref_columns = [table.vehicle.column.id]
on_update = NO_ACTION
on_delete = NO_ACTION
}
foreign_key "vehicle_booking_fk" {
columns = [column.vehicleid]
ref_columns = [table.vehicle.column.id]
on_update = NO_ACTION
on_delete = NO_ACTION
}
}
table "vehicle" {
schema = schema.fleets
column "id" {
null = false
type = uuid
}
column "type" {
null = true
type = text
}
column "namespace" {
null = true
type = text
}
column "administrators" {
null = true
type = sql("text[]")
}
column "data" {
null = true
type = jsonb
}
column "metadata" {
null = true
type = jsonb
}
primary_key {
columns = [column.id]
}
}
schema "fleets" {
}

View File

@@ -11,6 +11,7 @@ type Storage interface {
CreateVehicle(Vehicle) error CreateVehicle(Vehicle) error
GetVehicle(id string) (*Vehicle, error) GetVehicle(id string) (*Vehicle, error)
GetVehicles(namespaces []string) ([]Vehicle, error) GetVehicles(namespaces []string) ([]Vehicle, error)
UpdateVehicle(Vehicle) error
//Bookings management //Bookings management
CreateBooking(Booking) error CreateBooking(Booking) error
@@ -31,6 +32,9 @@ func NewStorage(cfg *viper.Viper) (Storage, error) {
case "mongodb": case "mongodb":
s, err := NewMongoDBStorage(cfg) s, err := NewMongoDBStorage(cfg)
return s, err return s, err
case "psql":
s, err := NewPostgresqlStorage(cfg)
return s, err
default: default:
return nil, fmt.Errorf("storage type %v is not supported", storage_type) return nil, fmt.Errorf("storage type %v is not supported", storage_type)
} }

View File

@@ -18,14 +18,14 @@ type Vehicle struct {
type VehicleFilters struct { type VehicleFilters struct {
Types []string Types []string
Administrators []string
AvailableFrom time.Time AvailableFrom time.Time
AvailableTo time.Time AvailableTo time.Time
IncludeDeleted bool
} }
func (v Vehicle) Free(start time.Time, end time.Time) bool { func (v Vehicle) Free(start time.Time, end time.Time) bool {
for _, b := range v.Bookings { for _, b := range v.Bookings {
fmt.Println("Bookings for", v)
fmt.Println(b)
if ((start.Before(b.Unavailablefrom) || start.Equal(b.Unavailablefrom)) && (end.After(b.Unavailablefrom.Add(24*time.Hour)) || end.Equal(b.Unavailablefrom.Add(24*time.Hour)))) || if ((start.Before(b.Unavailablefrom) || start.Equal(b.Unavailablefrom)) && (end.After(b.Unavailablefrom.Add(24*time.Hour)) || end.Equal(b.Unavailablefrom.Add(24*time.Hour)))) ||
((start.Before(b.Unavailableto) || start.Equal(b.Unavailableto)) && (end.After(b.Unavailableto.Add(24*time.Hour)) || end.Equal(b.Unavailableto.Add(24*time.Hour)))) || ((start.Before(b.Unavailableto) || start.Equal(b.Unavailableto)) && (end.After(b.Unavailableto.Add(24*time.Hour)) || end.Equal(b.Unavailableto.Add(24*time.Hour)))) ||
((start.After(b.Unavailablefrom) || start.Equal(b.Unavailablefrom)) && (end.Before(b.Unavailableto.Add(24*time.Hour)) || end.Equal(b.Unavailableto.Add(24*time.Hour)))) { ((start.After(b.Unavailablefrom) || start.Equal(b.Unavailablefrom)) && (end.Before(b.Unavailableto.Add(24*time.Hour)) || end.Equal(b.Unavailableto.Add(24*time.Hour)))) {
@@ -36,6 +36,8 @@ func (v Vehicle) Free(start time.Time, end time.Time) bool {
} }
func (v Vehicle) MatchesFilters(filters VehicleFilters) bool { func (v Vehicle) MatchesFilters(filters VehicleFilters) bool {
fmt.Println("Filters : ", filters)
if len(filters.Types) > 0 { if len(filters.Types) > 0 {
found := false found := false
for _, t := range filters.Types { for _, t := range filters.Types {
@@ -49,11 +51,24 @@ func (v Vehicle) MatchesFilters(filters VehicleFilters) bool {
} }
} }
if len(filters.Administrators) > 0 {
found := false
for _, a := range filters.Administrators {
for _, va := range v.Administrators {
if a == va {
found = true
break
}
}
}
if !found {
return false
}
}
if !v.Free(filters.AvailableFrom, filters.AvailableTo) { if !v.Free(filters.AvailableFrom, filters.AvailableTo) {
return false return false
} }
fmt.Println(filters)
return true return true
} }