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
.vscode
.idea
__debug_bin
fleets

View File

@@ -9,3 +9,4 @@ It provides :
- 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.

28
go.mod
View File

@@ -1,22 +1,29 @@
module git.coopgo.io/coopgo-platform/fleets
go 1.18
go 1.23
require (
github.com/golang/protobuf v1.5.2
github.com/google/uuid v1.3.0
ariga.io/atlas v0.13.1
github.com/google/uuid v1.6.0
github.com/lib/pq v1.10.9
github.com/spf13/viper v1.12.0
go.mongodb.org/mongo-driver v1.10.1
google.golang.org/grpc v1.46.2
google.golang.org/protobuf v1.28.0
google.golang.org/grpc v1.65.0
google.golang.org/protobuf v1.34.1
)
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/go-openapi/inflect v0.19.0 // 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/v2 v2.10.0 // indirect
github.com/klauspost/compress v1.13.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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // 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/stringprep v1.0.3 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect
golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
golang.org/x/text v0.3.7 // indirect
github.com/zclconf/go-cty v1.8.0 // indirect
golang.org/x/crypto v0.23.0 // indirect
golang.org/x/net v0.25.0 // indirect
golang.org/x/sync v0.7.0 // 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
gopkg.in/ini.v1 v1.66.4 // 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.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
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=
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/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/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/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
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/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/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
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/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-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/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=
@@ -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.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
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.3.1/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.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
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/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
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.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.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/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=
@@ -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-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
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.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/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.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
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/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/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-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
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/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/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/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/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
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/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/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/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo=
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
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/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/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
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/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
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/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
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.32/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/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8=
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.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-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-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-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-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.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-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
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.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-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-20190108225652-1e06a53dbb7e/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-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-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y=
golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
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-20190226205417-e64efc72b421/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-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-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.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-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-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-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-20190606165138-5da285871e9c/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-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-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
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/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=
@@ -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.5/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.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-20190308202827-9d24e82272b4/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.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.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ=
google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=
google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
google.golang.org/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-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/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.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 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
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) {
d, err := sanitizeData(booking.Data)
if err != nil {
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";
import "google/protobuf/timestamp.proto";
import "google/protobuf/struct.proto";
import "vehicles.proto";
@@ -50,6 +51,7 @@ message GetVehiclesRequest {
repeated string administrators = 7;
google.protobuf.Timestamp availability_from = 8;
google.protobuf.Timestamp availability_to = 9;
bool include_deleted = 10;
}
message GetVehiclesResponse {
@@ -90,6 +92,7 @@ message UpdateBookingResponse {
message DeleteBookingRequest {
string id = 15;
google.protobuf.Struct deletion_metadata = 30;
}
message DeleteBookingResponse {
@@ -126,6 +129,7 @@ message GetDriverBookingsResponse {
message GetBookingsRequest {
repeated string namespaces = 27;
bool include_deleted = 29;
}
message GetBookingsResponse {

View File

@@ -1,7 +1,9 @@
//COOPGO Groups Management gRPC service definition
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.2.0
// - protoc v3.21.12
// - protoc-gen-go-grpc v1.5.1
// - protoc v6.31.1
// source: fleets.proto
package grpcapi
@@ -15,8 +17,22 @@ import (
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
// Requires gRPC-Go v1.64.0 or later.
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.
//
@@ -47,8 +63,9 @@ func NewFleetsClient(cc grpc.ClientConnInterface) FleetsClient {
}
func (c *fleetsClient) AddVehicle(ctx context.Context, in *AddVehicleRequest, opts ...grpc.CallOption) (*AddVehicleResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
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 {
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) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
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 {
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) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
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 {
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) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
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 {
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) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
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 {
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) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
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 {
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) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
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 {
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) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
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 {
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) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
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 {
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) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
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 {
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) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
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 {
return nil, err
}
@@ -147,7 +174,7 @@ func (c *fleetsClient) FindVehicle(ctx context.Context, in *FindVehicleRequest,
// FleetsServer is the server API for Fleets service.
// All implementations must embed UnimplementedFleetsServer
// for forward compatibility
// for forward compatibility.
type FleetsServer interface {
// Vehicles management
AddVehicle(context.Context, *AddVehicleRequest) (*AddVehicleResponse, error)
@@ -166,9 +193,12 @@ type FleetsServer interface {
mustEmbedUnimplementedFleetsServer()
}
// UnimplementedFleetsServer must be embedded to have forward compatible implementations.
type UnimplementedFleetsServer struct {
}
// UnimplementedFleetsServer must be embedded to have
// 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) {
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")
}
func (UnimplementedFleetsServer) mustEmbedUnimplementedFleetsServer() {}
func (UnimplementedFleetsServer) testEmbeddedByValue() {}
// 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
@@ -213,6 +244,13 @@ type UnsafeFleetsServer interface {
}
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)
}
@@ -226,7 +264,7 @@ func _Fleets_AddVehicle_Handler(srv interface{}, ctx context.Context, dec func(i
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/Fleets/AddVehicle",
FullMethod: Fleets_AddVehicle_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
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{
Server: srv,
FullMethod: "/Fleets/GetVehicle",
FullMethod: Fleets_GetVehicle_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
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{
Server: srv,
FullMethod: "/Fleets/GetVehicles",
FullMethod: Fleets_GetVehicles_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
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{
Server: srv,
FullMethod: "/Fleets/UpdateVehicle",
FullMethod: Fleets_UpdateVehicle_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
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{
Server: srv,
FullMethod: "/Fleets/CreateBooking",
FullMethod: Fleets_CreateBooking_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
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{
Server: srv,
FullMethod: "/Fleets/GetBooking",
FullMethod: Fleets_GetBooking_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
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{
Server: srv,
FullMethod: "/Fleets/GetBookings",
FullMethod: Fleets_GetBookings_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(FleetsServer).GetBookings(ctx, req.(*GetBookingsRequest))
@@ -352,7 +390,7 @@ func _Fleets_GetDriverBookings_Handler(srv interface{}, ctx context.Context, dec
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/Fleets/GetDriverBookings",
FullMethod: Fleets_GetDriverBookings_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
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{
Server: srv,
FullMethod: "/Fleets/UpdateBooking",
FullMethod: Fleets_UpdateBooking_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
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{
Server: srv,
FullMethod: "/Fleets/DeleteBooking",
FullMethod: Fleets_DeleteBooking_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
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{
Server: srv,
FullMethod: "/Fleets/FindVehicle",
FullMethod: Fleets_FindVehicle_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(FleetsServer).FindVehicle(ctx, req.(*FindVehicleRequest))

View File

@@ -55,7 +55,9 @@ func (s FleetsServerImpl) GetVehicle(ctx context.Context, req *GetVehicleRequest
func (s FleetsServerImpl) GetVehicles(ctx context.Context, req *GetVehiclesRequest) (*GetVehiclesResponse, error) {
filter := storage.VehicleFilters{
Types: req.Types,
Types: req.Types,
Administrators: req.Administrators,
IncludeDeleted: req.IncludeDeleted,
}
if req.AvailabilityFrom.IsValid() {
filter.AvailableFrom = req.AvailabilityFrom.AsTime()
@@ -79,9 +81,6 @@ func (s FleetsServerImpl) GetVehicles(ctx context.Context, req *GetVehiclesReque
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) {
b := req.Booking.ToStorageType()
booking, err := s.handler.AddBooking(b)
@@ -126,9 +125,14 @@ func (s FleetsServerImpl) UpdateBooking(ctx context.Context, req *UpdateBookingR
return &UpdateBookingResponse{Booking: response}, nil
}
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)
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{
@@ -195,3 +199,19 @@ func Run(done chan error, cfg *viper.Viper, handler handlers.FleetsHandler) {
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,250 +1,308 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.36.7
// protoc v6.31.1
// source: vehicles.proto
package grpcapi
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
structpb "google.golang.org/protobuf/types/known/structpb"
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.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// 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
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
type Vehicle struct {
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,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"`
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"`
Bookings []*Booking `protobuf:"bytes,6,rep,name=bookings,proto3" json:"bookings,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
state protoimpl.MessageState `protogen:"open.v1"`
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,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"`
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"`
Bookings []*Booking `protobuf:"bytes,6,rep,name=bookings,proto3" json:"bookings,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (m *Vehicle) Reset() { *m = Vehicle{} }
func (m *Vehicle) String() string { return proto.CompactTextString(m) }
func (*Vehicle) ProtoMessage() {}
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 (*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) {
return fileDescriptor_b84b5fa4f4d86273, []int{0}
return file_vehicles_proto_rawDescGZIP(), []int{0}
}
func (m *Vehicle) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Vehicle.Unmarshal(m, b)
}
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
func (x *Vehicle) GetId() string {
if x != nil {
return x.Id
}
return ""
}
func (m *Vehicle) GetNamespace() string {
if m != nil {
return m.Namespace
func (x *Vehicle) GetNamespace() string {
if x != nil {
return x.Namespace
}
return ""
}
func (m *Vehicle) GetType() string {
if m != nil {
return m.Type
func (x *Vehicle) GetType() string {
if x != nil {
return x.Type
}
return ""
}
func (m *Vehicle) GetAdministrators() []string {
if m != nil {
return m.Administrators
func (x *Vehicle) GetAdministrators() []string {
if x != nil {
return x.Administrators
}
return nil
}
func (m *Vehicle) GetData() *structpb.Struct {
if m != nil {
return m.Data
func (x *Vehicle) GetData() *structpb.Struct {
if x != nil {
return x.Data
}
return nil
}
func (m *Vehicle) GetBookings() []*Booking {
if m != nil {
return m.Bookings
func (x *Vehicle) GetBookings() []*Booking {
if x != nil {
return x.Bookings
}
return nil
}
type Booking struct {
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,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"`
Startdate *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=startdate,proto3" json:"startdate,omitempty"`
Enddate *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=enddate,proto3" json:"enddate,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"`
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"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
state protoimpl.MessageState `protogen:"open.v1"`
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,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"`
Startdate *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=startdate,proto3" json:"startdate,omitempty"`
Enddate *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=enddate,proto3" json:"enddate,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"`
Data *structpb.Struct `protobuf:"bytes,8,opt,name=data,proto3" json:"data,omitempty"`
Vehicle *Vehicle `protobuf:"bytes,9,opt,name=vehicle,proto3" json:"vehicle,omitempty"`
Deleted bool `protobuf:"varint,10,opt,name=deleted,proto3" json:"deleted,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (m *Booking) Reset() { *m = Booking{} }
func (m *Booking) String() string { return proto.CompactTextString(m) }
func (*Booking) ProtoMessage() {}
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 (*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) {
return fileDescriptor_b84b5fa4f4d86273, []int{1}
return file_vehicles_proto_rawDescGZIP(), []int{1}
}
func (m *Booking) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Booking.Unmarshal(m, b)
}
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
func (x *Booking) GetId() string {
if x != nil {
return x.Id
}
return ""
}
func (m *Booking) GetVehicleid() string {
if m != nil {
return m.Vehicleid
func (x *Booking) GetVehicleid() string {
if x != nil {
return x.Vehicleid
}
return ""
}
func (m *Booking) GetDriver() string {
if m != nil {
return m.Driver
func (x *Booking) GetDriver() string {
if x != nil {
return x.Driver
}
return ""
}
func (m *Booking) GetStartdate() *timestamppb.Timestamp {
if m != nil {
return m.Startdate
func (x *Booking) GetStartdate() *timestamppb.Timestamp {
if x != nil {
return x.Startdate
}
return nil
}
func (m *Booking) GetEnddate() *timestamppb.Timestamp {
if m != nil {
return m.Enddate
func (x *Booking) GetEnddate() *timestamppb.Timestamp {
if x != nil {
return x.Enddate
}
return nil
}
func (m *Booking) GetUnavailablefrom() *timestamppb.Timestamp {
if m != nil {
return m.Unavailablefrom
func (x *Booking) GetUnavailablefrom() *timestamppb.Timestamp {
if x != nil {
return x.Unavailablefrom
}
return nil
}
func (m *Booking) GetUnavailableto() *timestamppb.Timestamp {
if m != nil {
return m.Unavailableto
func (x *Booking) GetUnavailableto() *timestamppb.Timestamp {
if x != nil {
return x.Unavailableto
}
return nil
}
func (m *Booking) GetData() *structpb.Struct {
if m != nil {
return m.Data
func (x *Booking) GetData() *structpb.Struct {
if x != nil {
return x.Data
}
return nil
}
func (m *Booking) GetDeleted() bool {
if m != nil {
return m.Deleted
func (x *Booking) GetVehicle() *Vehicle {
if x != nil {
return x.Vehicle
}
return nil
}
func (x *Booking) GetDeleted() bool {
if x != nil {
return x.Deleted
}
return false
}
func (m *Booking) GetVehicle() *Vehicle {
if m != nil {
return m.Vehicle
var File_vehicles_proto protoreflect.FileDescriptor
const file_vehicles_proto_rawDesc = "" +
"\n" +
"\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
}
var file_vehicles_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_vehicles_proto_goTypes = []any{
(*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() { file_vehicles_proto_init() }
func file_vehicles_proto_init() {
if File_vehicles_proto != nil {
return
}
return nil
}
func init() {
proto.RegisterType((*Vehicle)(nil), "Vehicle")
proto.RegisterType((*Booking)(nil), "Booking")
}
func init() {
proto.RegisterFile("vehicles.proto", fileDescriptor_b84b5fa4f4d86273)
}
var fileDescriptor_b84b5fa4f4d86273 = []byte{
// 384 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0x5d, 0xab, 0xd4, 0x30,
0x10, 0xa5, 0xbb, 0xbd, 0xfd, 0x98, 0x8b, 0x2b, 0xe4, 0x41, 0xc3, 0xe5, 0x82, 0x65, 0x11, 0x29,
0xa8, 0x29, 0x5c, 0x7d, 0xf0, 0x51, 0x2e, 0xfe, 0x82, 0x2a, 0x3e, 0xf8, 0x96, 0x36, 0xd3, 0x1a,
0x6c, 0x9b, 0x90, 0xcc, 0x2e, 0xf8, 0xb7, 0xfc, 0x11, 0xfe, 0x2e, 0x21, 0x6d, 0xf7, 0xea, 0x2a,
0xac, 0x6f, 0x99, 0x73, 0xe6, 0x0c, 0xe7, 0xcc, 0x04, 0x76, 0x47, 0xfc, 0xaa, 0xdb, 0x01, 0xbd,
0xb0, 0xce, 0x90, 0xb9, 0xb9, 0xed, 0x8d, 0xe9, 0x07, 0xac, 0x42, 0xd5, 0x1c, 0xba, 0xca, 0x93,
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,
0xc5, 0x6e, 0x21, 0x9f, 0xe4, 0x88, 0xde, 0xca, 0x16, 0xf9, 0x26, 0xc0, 0x0f, 0x00, 0x63, 0x10,
0xd3, 0x77, 0x8b, 0x7c, 0x1b, 0x88, 0xf0, 0x66, 0x2f, 0x60, 0x27, 0xd5, 0xa8, 0x27, 0xed, 0xc9,
0x49, 0x32, 0xce, 0xf3, 0xb8, 0xd8, 0x96, 0x79, 0x7d, 0x86, 0xb2, 0x97, 0x10, 0x2b, 0x49, 0x92,
0x5f, 0x15, 0x51, 0x79, 0x7d, 0xf7, 0x54, 0xcc, 0x2e, 0xc5, 0xea, 0x52, 0x7c, 0x0c, 0x19, 0xea,
0xd0, 0xc4, 0x9e, 0x43, 0xd6, 0x18, 0xf3, 0x4d, 0x4f, 0xbd, 0xe7, 0x49, 0xb1, 0x2d, 0xaf, 0xef,
0x32, 0x71, 0x3f, 0x03, 0xf5, 0x89, 0xd9, 0xff, 0xd8, 0x42, 0xba, 0xa0, 0xff, 0x0a, 0xb2, 0x6c,
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,
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_vehicles_proto_rawDesc), len(file_vehicles_proto_rawDesc)),
NumEnums: 0,
NumMessages: 2,
NumExtensions: 0,
NumServices: 0,
},
GoTypes: file_vehicles_proto_goTypes,
DependencyIndexes: file_vehicles_proto_depIdxs,
MessageInfos: file_vehicles_proto_msgTypes,
}.Build()
File_vehicles_proto = out.File
file_vehicles_proto_goTypes = nil
file_vehicles_proto_depIdxs = nil
}

View File

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

View File

@@ -1,7 +1,7 @@
package handlers
import (
"errors"
"time"
"git.coopgo.io/coopgo-platform/fleets/storage"
"github.com/google/uuid"
@@ -26,23 +26,15 @@ func (h FleetsHandler) GetBooking(id string) (booking *storage.Booking, err erro
return nil, err
}
if booking.Deleted {
return nil, errors.New("booking was deleted")
}
vehicle, err := h.storage.GetVehicle(booking.Vehicleid)
if err != nil {
return nil, err
}
if err != nil {
return nil, err
}
booking.Vehicle = *vehicle
return
}
func (h FleetsHandler) UpdateBooking(booking storage.Booking) (*storage.Booking, error) {
// Store the account
if err := h.storage.UpdateBooking(booking); err != nil {
return nil, err
@@ -51,8 +43,33 @@ func (h FleetsHandler) UpdateBooking(booking storage.Booking) (*storage.Booking,
return &booking, nil
}
func (h FleetsHandler) DeleteBooking(id string) error {
return h.storage.DeleteBooking(id)
func (h FleetsHandler) DeleteBooking(id string, deletionMetadata map[string]any) error {
// 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) {

View File

@@ -1,8 +1,11 @@
package handlers
import (
"slices"
"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"
"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) {
vehicles, err := h.storage.GetVehicles(namespaces)
newvehicles := []storage.Vehicle{}
for _, v := range vehicles {
bookings, err := h.storage.GetBookingsForVehicle(v.ID)
if err != nil {
return nil, err
}
v.Bookings = bookings
if !v.MatchesFilters(filters) {
continue
}
newvehicles = append(newvehicles, v)
if err != nil {
return nil, err
}
return newvehicles, 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
}
if v.MatchesFilters(filters) {
if !yield(v) {
return
}
}
}
}), 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 (
service_name = cfg.GetString("name")
grpc_enable = cfg.GetBool("services.grpc.enable")
dev_env = cfg.GetBool("dev_env")
)
storage, err := storage.NewStorage(cfg)
@@ -28,6 +29,9 @@ func main() {
handler := handlers.NewHandler(cfg, storage)
fmt.Println("Running", service_name, ":")
if dev_env {
fmt.Printf("\033]0;%s\007", service_name)
}
failed := make(chan error)

View File

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

View File

@@ -236,3 +236,14 @@ func (s MongoDBStorage) DeleteBooking(bookingid string) error {
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
GetVehicle(id string) (*Vehicle, error)
GetVehicles(namespaces []string) ([]Vehicle, error)
UpdateVehicle(Vehicle) error
//Bookings management
CreateBooking(Booking) error
@@ -31,6 +32,9 @@ func NewStorage(cfg *viper.Viper) (Storage, error) {
case "mongodb":
s, err := NewMongoDBStorage(cfg)
return s, err
case "psql":
s, err := NewPostgresqlStorage(cfg)
return s, err
default:
return nil, fmt.Errorf("storage type %v is not supported", storage_type)
}

View File

@@ -17,15 +17,15 @@ type Vehicle struct {
}
type VehicleFilters struct {
Types []string
AvailableFrom time.Time
AvailableTo time.Time
Types []string
Administrators []string
AvailableFrom time.Time
AvailableTo time.Time
IncludeDeleted bool
}
func (v Vehicle) Free(start time.Time, end time.Time) bool {
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)))) ||
((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)))) {
@@ -36,6 +36,8 @@ func (v Vehicle) Free(start time.Time, end time.Time) bool {
}
func (v Vehicle) MatchesFilters(filters VehicleFilters) bool {
fmt.Println("Filters : ", filters)
if len(filters.Types) > 0 {
found := false
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) {
return false
}
fmt.Println(filters)
return true
}