From 8886dcba9cdab461439734f987a02aeefc92d63c Mon Sep 17 00:00:00 2001 From: Evstigneev Denis Date: Fri, 11 Aug 2023 20:12:15 +0300 Subject: [PATCH] add handlers, storage(Postgres, sqlite) (#3) Reviewed-on: https://git.unistack.org/unistack-org/pkgdash/pulls/3 Co-authored-by: Evstigneev Denis Co-committed-by: Evstigneev Denis --- .gitignore | 1 + Makefile | 13 + cmd/rest/server.go | 2 +- main.go => cmd/script/main.go | 8 +- go.mod | 9 +- go.sum | 501 +-------- handler/handlers.go | 175 +++- handler/middleware.go | 21 + handler/writer.go | 3 +- internal/modproxy.go | 2 +- models/entities.go | 39 +- models/mapping.go | 33 +- proto/dashboard.proto | 43 +- proto/docker_generate/Dockerfile | 43 + proto/docker_generate/Makefile | 7 + proto/docker_generate/dashboard.proto | 71 ++ proto/docker_generate/restService.proto | 42 + proto/generate.sh | 4 +- proto/go_generate/dashboard.pb.go | 658 +++++++++--- proto/go_generate/dashboard.pb.validate.go | 963 ++++++++++++++---- proto/micro/dashboard_micro.pb.go | 12 +- proto/micro/dashboard_micro_http.pb.go | 48 +- service/client_git/client.go | 218 ++++ service/client_git/client_test.go | 86 ++ service/service.go | 27 +- .../postgres/000001_init_schema.up.sql | 18 +- .../sqlite/000001_init_schema.down.sql | 5 + .../sqlite/000001_init_schema.up.sql | 38 + storage/postgres/quries.go | 23 +- storage/postgres/storage.go | 166 ++- storage/postgres/storage_test.go | 37 + storage/sqlite/quries.go | 32 + storage/sqlite/storage.go | 287 ++++++ storage/storage.go | 10 +- storage/storage_test.go | 42 + 35 files changed, 2751 insertions(+), 936 deletions(-) create mode 100644 Makefile rename main.go => cmd/script/main.go (94%) create mode 100644 handler/middleware.go create mode 100644 proto/docker_generate/Dockerfile create mode 100644 proto/docker_generate/Makefile create mode 100644 proto/docker_generate/dashboard.proto create mode 100644 proto/docker_generate/restService.proto create mode 100644 service/client_git/client.go create mode 100644 service/client_git/client_test.go create mode 100644 storage/migrations/sqlite/000001_init_schema.down.sql create mode 100644 storage/migrations/sqlite/000001_init_schema.up.sql create mode 100644 storage/postgres/storage_test.go create mode 100644 storage/sqlite/quries.go create mode 100644 storage/sqlite/storage.go create mode 100644 storage/storage_test.go diff --git a/.gitignore b/.gitignore index b55a950..9e82b91 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ bin/ tmp/ /pkgdash +*.sqlite diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..88dc99d --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +.PHONY: build +build: + go build -o bin/app -mod=readonly ./main.go + +.PHONY: test +test: + go test -v ./... -race -cover + +.PHONY: lint +lint: + # Install the binary release of golangci-lint + # https://github.com/golangci/golangci-lint#install + golangci-lint run \ No newline at end of file diff --git a/cmd/rest/server.go b/cmd/rest/server.go index d939905..648050b 100644 --- a/cmd/rest/server.go +++ b/cmd/rest/server.go @@ -3,7 +3,7 @@ package main import ( "context" - "go.unistack.org/micro/v4/logger" + "go.unistack.org/micro/v3/logger" "go.unistack.org/unistack-org/pkgdash/service" ) diff --git a/main.go b/cmd/script/main.go similarity index 94% rename from main.go rename to cmd/script/main.go index e039cfa..779e647 100644 --- a/main.go +++ b/cmd/script/main.go @@ -15,9 +15,9 @@ import ( "github.com/go-git/go-git/v5/plumbing/filemode" "github.com/go-git/go-git/v5/plumbing/object" "github.com/go-git/go-git/v5/storage/memory" - flagconfig "go.unistack.org/micro-config-flag/v4" - "go.unistack.org/micro/v4/config" - "go.unistack.org/micro/v4/logger" + flagconfig "go.unistack.org/micro-config-flag/v3" + "go.unistack.org/micro/v3/config" + "go.unistack.org/micro/v3/logger" "golang.org/x/mod/modfile" "golang.org/x/mod/module" ) @@ -65,7 +65,7 @@ func main() { cloneOpts.Depth = 1 } - if err := cloneOpts.Validate(); err != nil { + if err = cloneOpts.Validate(); err != nil { logger.Fatal(ctx, err) } diff --git a/go.mod b/go.mod index 9d2e3b3..5cda315 100644 --- a/go.mod +++ b/go.mod @@ -8,15 +8,15 @@ require ( github.com/golang-migrate/migrate/v4 v4.15.1 github.com/google/uuid v1.3.0 github.com/jackc/pgtype v1.14.0 + github.com/lib/pq v1.10.2 + github.com/mattn/go-sqlite3 v1.14.16 github.com/pkg/errors v0.9.1 go.unistack.org/cms-service v0.0.1 go.unistack.org/micro-client-http/v3 v3.9.3 - go.unistack.org/micro-config-flag/v4 v4.0.1 + go.unistack.org/micro-config-flag/v3 v3.8.9 go.unistack.org/micro-proto/v3 v3.3.1 - go.unistack.org/micro-server-grpc/v3 v3.10.6 go.unistack.org/micro-server-http/v3 v3.11.6 go.unistack.org/micro/v3 v3.10.24 - go.unistack.org/micro/v4 v4.0.1 golang.org/x/mod v0.12.0 golang.org/x/net v0.12.0 golang.org/x/sync v0.3.0 @@ -47,7 +47,7 @@ require ( github.com/jackc/pgproto3/v2 v2.3.2 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/pgx/v4 v4.18.1 // indirect - github.com/jackc/pgx/v5 v5.3.1 // indirect + github.com/jackc/pgx/v5 v5.4.3 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect @@ -67,7 +67,6 @@ require ( go.unistack.org/micro-codec-yaml/v3 v3.10.0 // indirect go.unistack.org/micro-config-env/v3 v3.8.5 // indirect go.unistack.org/micro-config-file/v3 v3.8.3 // indirect - go.unistack.org/micro-config-flag/v3 v3.8.9 // indirect go.unistack.org/micro-config-service/v3 v3.8.1 // indirect golang.org/x/crypto v0.11.0 // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect diff --git a/go.sum b/go.sum index de61f51..5931b1c 100644 --- a/go.sum +++ b/go.sum @@ -23,345 +23,24 @@ cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAV cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= cloud.google.com/go v0.88.0/go.mod h1:dnKwfYbP9hQhefiUvpbcAyoGSHUrOxR20JVElLiUvEY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= cloud.google.com/go/spanner v1.24.0/go.mod h1:EZI0yH1D/PrXK0XH9Ba5LGXTXWeqZv0ClOD/19a0Z58= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -503,12 +182,8 @@ github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/cockroach-go/v2 v2.1.1/go.mod h1:7NtUnP6eK+l6k483WSYNrq3Kb23bWV10IRV1TyeSpwM= @@ -670,7 +345,6 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -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 v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= @@ -830,10 +504,7 @@ github.com/google/go-cmp v0.5.3/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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v35 v35.2.0/go.mod h1:s0515YVTI+IMrDoy9Y4pHt9ShGpzHvHO8rZ7L7acgvs= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -856,7 +527,6 @@ github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210715191844-86eeefc3e471/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -865,20 +535,9 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.2.0/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/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= 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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= @@ -984,8 +643,8 @@ github.com/jackc/pgx/v4 v4.10.1/go.mod h1:QlrWebbs3kqEZPHCTGyxecvzG6tvIsYu+A5b1r github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= github.com/jackc/pgx/v4 v4.18.1 h1:YP7G1KABtKpB5IHrO9vYwSrCOhs7p3uqhvhhQBptya0= github.com/jackc/pgx/v4 v4.18.1/go.mod h1:FydWkUyadDmdNH/mHnGob881GawxeEm7TcMCzkb+qQE= -github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU= -github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= +github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY= +github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= @@ -1088,6 +747,7 @@ github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vq github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= @@ -1380,21 +1040,15 @@ go.unistack.org/micro-config-file/v3 v3.8.3 h1:yoAyDtmWutlUkVgFUtc7JhwCX7H/2Jz0n go.unistack.org/micro-config-file/v3 v3.8.3/go.mod h1:dl+MQ27/P41+hINmSrZFltDSDYP1y2LItIDYb2jHFog= go.unistack.org/micro-config-flag/v3 v3.8.9 h1:I4eoJVV28CpxQvQ63TJ1fqK5JcV1gHmOZPveT2Vl5Iw= go.unistack.org/micro-config-flag/v3 v3.8.9/go.mod h1:eWI90dcZh5AOhkd83fF0KY17ea/DZPebkJ8K61yky+8= -go.unistack.org/micro-config-flag/v4 v4.0.1 h1:oYmNZrFDnARyi6toFFJ9cfIZQkZ4nNp5As+UYiIhBgM= -go.unistack.org/micro-config-flag/v4 v4.0.1/go.mod h1:EYBZUMCqEXs092hB5hhMCALduXMOg76VRuNdzlvV3aU= go.unistack.org/micro-config-service/v3 v3.8.1 h1:Q+RPWCb88VGz5+EQUx45Xeysf+Mon9Q2IvqCF3e8LZM= go.unistack.org/micro-config-service/v3 v3.8.1/go.mod h1:KdZJEuYwninyT04ysFkgEQa3OaMRa0kSQVPQHlumQoA= go.unistack.org/micro-proto/v3 v3.3.1 h1:nQ0MtWvP2G3QrpOgawVOPhpZZYkq6umTGDqs8FxJYIo= go.unistack.org/micro-proto/v3 v3.3.1/go.mod h1:cwRyv8uInM2I7EbU7O8Fx2Ls3N90Uw9UCCcq4olOdfE= -go.unistack.org/micro-server-grpc/v3 v3.10.6 h1:1MZ530LARgr0OS2E+ALfPpMJkUexEwcaVhUOgBoXDjs= -go.unistack.org/micro-server-grpc/v3 v3.10.6/go.mod h1:n0mNurVocRBOt7iydDgORGWQ4M/wFaJFmdKHNX57IiQ= go.unistack.org/micro-server-http/v3 v3.11.6 h1:BSjPyXrJ6OTyuCDE14XOGjLDJEICz2CEo2WfmSR3hqM= go.unistack.org/micro-server-http/v3 v3.11.6/go.mod h1:phNG9aosjbneXvZxEVaVQI+NHLLZ3eA82mOH6gGSShY= go.unistack.org/micro/v3 v3.10.14/go.mod h1:uMAc0U/x7dmtICCrblGf0ZLgYegu3VwQAquu+OFCw1Q= go.unistack.org/micro/v3 v3.10.24 h1:gIi4r0vUSpNLs+uRb4KKEXBLkE8iNp6ZnJsI5FV42j0= go.unistack.org/micro/v3 v3.10.24/go.mod h1:aywPekJP0n07xvmDgj+Si3VPmQzGMfj6tkHk/6kjXhU= -go.unistack.org/micro/v4 v4.0.1 h1:xo1IxbVfgh8i0eY0VeYa3cbb13u5n/Mxnp3FOgWD4Jo= -go.unistack.org/micro/v4 v4.0.1/go.mod h1:p/J5UcSJjfHsWGT31uKoghQ5rUQZzQJBAFy+Z4+ZVMs= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1534,21 +1188,8 @@ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211013171255-e13a2654a71e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= @@ -1568,18 +1209,6 @@ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1592,9 +1221,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ 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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= @@ -1691,31 +1318,13 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/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-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= @@ -1724,8 +1333,6 @@ golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXR golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= @@ -1738,10 +1345,7 @@ 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/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= @@ -1832,10 +1436,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= @@ -1868,31 +1468,6 @@ google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59t google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= google.golang.org/appengine v1.0.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1946,7 +1521,6 @@ google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= @@ -1958,64 +1532,8 @@ google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= google.golang.org/genproto v0.0.0-20210721163202-f1cecdd8b78a/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= google.golang.org/genproto v0.0.0-20210726143408-b02e89920bf0/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211013025323-ce878158c4d4/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -2045,20 +1563,8 @@ google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= @@ -2075,7 +1581,6 @@ 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/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= diff --git a/handler/handlers.go b/handler/handlers.go index 1537791..ffa934b 100644 --- a/handler/handlers.go +++ b/handler/handlers.go @@ -2,14 +2,19 @@ package handler import ( "context" + "encoding/json" cmsstorage "go.unistack.org/cms-service/storage" "go.unistack.org/micro/v3" "go.unistack.org/micro/v3/errors" "go.unistack.org/unistack-org/pkgdash/config" - "go.unistack.org/unistack-org/pkgdash/models" pb "go.unistack.org/unistack-org/pkgdash/proto/go_generate" + cligit "go.unistack.org/unistack-org/pkgdash/service/client_git" "go.unistack.org/unistack-org/pkgdash/storage" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/proto" + "io" "net/http" + "net/url" ) type Handler struct { @@ -17,6 +22,11 @@ type Handler struct { store storage.Storage writer writer + protojson.MarshalOptions + protojson.UnmarshalOptions + + git cligit.Client + chanUrl chan *pb.AddPackageReq } func (h *Handler) ListPackage(w http.ResponseWriter, r *http.Request) { @@ -24,7 +34,7 @@ func (h *Handler) ListPackage(w http.ResponseWriter, r *http.Request) { logger := h.svc.Logger() logger.Debug(ctx, "Start getListPackage") - dbRsp, err := h.store.List(ctx) + dbRsp, err := h.store.ListPackage(ctx) if err != nil { logger.Errorf(ctx, "error db response: %v", err) h.writer.Response(ctx, w, err) @@ -32,18 +42,45 @@ func (h *Handler) ListPackage(w http.ResponseWriter, r *http.Request) { } rsp := new(pb.ListPackageRsp) - rsp.Packages = models.ListPackage(dbRsp).Mapping() + rsp.Packages = dbRsp.Decode() logger.Debug(ctx, "Success finish getListPackage") h.writer.Response(ctx, w, rsp) } -func (h *Handler) UpdateInfo(w http.ResponseWriter, r *http.Request) { +func (h *Handler) UpdatePackage(w http.ResponseWriter, r *http.Request) { ctx := r.Context() logger := h.svc.Logger() - logger.Debug(ctx, "Start UpdateInfo") + logger.Debug(ctx, "Start UpdatePackage") - // TODO + defer r.Body.Close() + all, err := io.ReadAll(r.Body) + if err != nil { + logger.Error(ctx, err) + h.writer.Response(ctx, w, NewInternalError(err)) + return + } + + req := new(pb.UpdatePackageReq) + if err = h.Unmarshal(all, req); err != nil { + logger.Error(ctx, err) + h.writer.Response(ctx, w, NewUnmarshalError(err)) + return + } + + if err = req.Validate(); err != nil { + logger.Error(ctx, err) + h.writer.Response(ctx, w, NewValidationError(err)) + return + } + + if err = h.store.UpdatePackage(ctx, req); err != nil { + logger.Error(ctx, err) + h.writer.Response(ctx, w, NewInternalError(err)) + return + } + + logger.Debug(ctx, "Success finish UpdatePackage") } func (h *Handler) AddComment(w http.ResponseWriter, r *http.Request) { @@ -51,11 +88,129 @@ func (h *Handler) AddComment(w http.ResponseWriter, r *http.Request) { logger := h.svc.Logger() logger.Debug(ctx, "Start AddComment") - // TODO + defer r.Body.Close() + all, err := io.ReadAll(r.Body) + if err != nil { + logger.Error(ctx, err) + h.writer.Response(ctx, w, NewInternalError(err)) + return + } + + req := new(pb.AddCommentReq) + if err = h.Unmarshal(all, req); err != nil { + logger.Error(ctx, err) + h.writer.Response(ctx, w, NewUnmarshalError(err)) + return + } + + if err = req.Validate(); err != nil { + logger.Error(ctx, err) + h.writer.Response(ctx, w, NewValidationError(err)) + return + } + + if err = h.store.AddComment(ctx, req); err != nil { + logger.Error(ctx, err) + h.writer.Response(ctx, w, NewInternalError(err)) + return + } + + logger.Debug(ctx, "Success finish addComment") } -func NewHandler(svc micro.Service, w writer) *Handler { - return &Handler{svc: svc, writer: w} +func (h *Handler) AddPackage(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + logger := h.svc.Logger() + logger.Debug(ctx, "Start AddPackage") + + defer r.Body.Close() + all, err := io.ReadAll(r.Body) + if err != nil { + logger.Error(ctx, err) + h.writer.Response(ctx, w, NewInternalError(err)) + return + } + + req := new(pb.AddPackageReq) + if err = h.Unmarshal(all, req); err != nil { + logger.Error(ctx, err) + h.writer.Response(ctx, w, NewUnmarshalError(err)) + return + } + + if err = req.Validate(); err != nil { + logger.Error(ctx, err) + h.writer.Response(ctx, w, NewValidationError(err)) + return + } + + if h.git.IsClose() { + logger.Error(ctx, "chan is closed") + } else { + h.chanUrl <- req + } + + logger.Debug(ctx, "Success finish addPackage") +} + +func (h *Handler) GetModule(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + logger := h.svc.Logger() + logger.Debug(ctx, "Start GetModule") + + req := new(pb.GetModuleReq) + if err := URLValuesToProto(r.URL.Query(), req); err != nil { + logger.Errorf(ctx, "Required parameter missing: %v", err) + h.writer.Response(ctx, w, err) + return + } + + modules, err := h.store.GetModule(ctx, req) + if err != nil { + logger.Error(ctx, err) + h.writer.Response(ctx, w, NewInternalError(err)) + return + } + + rsp := &pb.GetModuleRsp{Modules: modules.Decode()} + h.writer.Response(ctx, w, rsp) + + logger.Debug(ctx, "Success finish getModule") +} + +func URLValuesToProto(vals url.Values, msg proto.Message) error { + params := make(map[string]interface{}) + var err error + for k, v := range vals { + if len(v) == 0 { + continue + } + switch k { + case "id[]": + params[k] = v + default: + params[k] = v[0] + } + } + b, err := json.Marshal(params) + if err != nil { + return NewUnmarshalError(err) + } + if err = protojson.Unmarshal(b, msg); err != nil { + return NewUnmarshalError(err) + } + return nil +} + +func NewHandler(svc micro.Service, w writer, client cligit.Client) *Handler { + h := &Handler{ + svc: svc, + writer: w, + git: client, + } + h.EmitUnpopulated = true + h.UseProtoNames = false + return h } func (h *Handler) Init(ctx context.Context) error { @@ -68,6 +223,8 @@ func (h *Handler) Init(ctx context.Context) error { return errors.New(config.ServiceName, "error init storage", 1) } + h.chanUrl = h.git.Run(ctx, st) + h.store = st return nil diff --git a/handler/middleware.go b/handler/middleware.go new file mode 100644 index 0000000..df99f45 --- /dev/null +++ b/handler/middleware.go @@ -0,0 +1,21 @@ +package handler + +import "net/http" + +func Methods(m string, next http.HandlerFunc) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + if req.Method != m { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + switch req.Method { + case http.MethodPost: + w.WriteHeader(http.StatusCreated) + case http.MethodPut: + w.WriteHeader(http.StatusNoContent) + } + + next.ServeHTTP(w, req) + } +} diff --git a/handler/writer.go b/handler/writer.go index 0929118..3caed23 100644 --- a/handler/writer.go +++ b/handler/writer.go @@ -2,7 +2,7 @@ package handler import ( "context" - "go.unistack.org/micro/v4/logger" + "go.unistack.org/micro/v3/logger" pb "go.unistack.org/unistack-org/pkgdash/proto/go_generate" "net/http" @@ -18,6 +18,7 @@ type writer interface { Response(ctx context.Context, rw http.ResponseWriter, value interface{}) } +// nolint type stackTracer interface { StackTrace() errors.StackTrace } diff --git a/internal/modproxy.go b/internal/modproxy.go index c3d306e..6cebcb0 100644 --- a/internal/modproxy.go +++ b/internal/modproxy.go @@ -282,7 +282,7 @@ func Updates(opt UpdateOptions) { return nil }) } - group.Wait() + _ = group.Wait() }() for u := range ch { if opt.OnUpdate != nil { diff --git a/models/entities.go b/models/entities.go index 3711af4..e9e2d52 100644 --- a/models/entities.go +++ b/models/entities.go @@ -7,38 +7,39 @@ import ( ) type Package struct { - ID int64 `db:"id"` // package id - Name string `db:"name"` // service name, last component path - URL string `db:"url"` // scm url - Modules []Module `db:"modules"` // parsed go.mod modules - Issues []Issue `db:"issues"` // issues list - Comments []int64 `db:"comments"` + ID uint64 `db:"id" json:"id"` // package id + Name string `db:"name" json:"name"` // service name, last component path + URL string `db:"url" json:"url"` // scm url + Modules []uint64 `db:"modules" json:"modules"` // parsed go.mod modules + Issues []uint64 `db:"issues" json:"issues,omitempty"` // issues list + Comments []uint64 `db:"comments" json:"comments,omitempty"` } type Module struct { - ID int64 `db:"id"` - Name string `db:"name"` // module name - Version string `db:"version"` // module - Package int64 `db:"package"` + ID uint64 `db:"id"` + Name string `db:"name"` // module name + Version string `db:"version"` // module + Package uint64 `db:"package"` + LastVersion string `db:"last_version"` } type Issue struct { - ID int64 `db:"id"` - Status int64 `db:"status"` + ID uint64 `db:"id"` + Status uint64 `db:"status"` Desc string `db:"desc"` Package int64 `db:"package"` Modules []int64 `db:"modules"` } type Comment struct { - ID int64 `db:"id"` - Text string `db:"value"` - Created pgtype.Date `db:"created"` - Updated pgtype.Date `db:"updated"` + ID uint64 `db:"id" json:"id"` + Text string `db:"value" json:"text"` + Created pgtype.Date `db:"created" json:"created"` + Updated pgtype.Date `db:"updated" json:"updated,omitempty"` } type Dashboard struct { - ID int64 `db:"id"` - Uuid uuid.UUID `db:"uuid"` - Package int64 `db:"package"` + ID uint64 `db:"id"` + Uuid uuid.UUID `db:"uuid"` + Packages []uint64 `db:"package"` } diff --git a/models/mapping.go b/models/mapping.go index 44a39fe..95b1437 100644 --- a/models/mapping.go +++ b/models/mapping.go @@ -6,8 +6,39 @@ import ( type ListPackage []*Package -func (l ListPackage) Mapping() []*pb.Package { +func (l ListPackage) Decode() []*pb.Package { result := make([]*pb.Package, 0, len(l)) + for i := range l { + temp := &pb.Package{ + Id: l[i].ID, + Name: l[i].Name, + Url: l[i].URL, + Modules: l[i].Modules, + Issues: l[i].Issues, + Comments: l[i].Comments, + } + + result = append(result, temp) + } + + return result +} + +type ListModule []*Module + +func (l ListModule) Decode() []*pb.Module { + result := make([]*pb.Module, 0, len(l)) + for i := range l { + temp := &pb.Module{ + Id: l[i].ID, + Name: l[i].Name, + Version: l[i].Version, + LastVersion: l[i].LastVersion, + } + + result = append(result, temp) + } + return result } diff --git a/proto/dashboard.proto b/proto/dashboard.proto index 54eb0d8..55072d2 100644 --- a/proto/dashboard.proto +++ b/proto/dashboard.proto @@ -5,11 +5,14 @@ package proto; option go_package = "go.unistack.org/unistack-org/pkgdash/proto/go_generate;go_generate"; import "validate/validate.proto"; +import "google/protobuf/wrappers.proto"; service DashboardService { rpc ListPackage(ListPackageReq) returns (ListPackageRsp) {}; - rpc UpdateInfo(UpdateInfoPackageRsp) returns (UpdateInfoPackageReq) {}; - rpc AddComment(CommentRsp) returns (CommentReq) {}; + rpc UpdatePackage(UpdatePackageReq) returns (UpdatePackageRsp) {}; + rpc AddComment(AddCommentReq) returns (AddCommentRsp) {}; + rpc AddPackage(AddPackageReq) returns (AddPackageRsp) {}; + rpc GetModule(GetModuleReq) returns (GetModuleRsp) {}; }; message ErrorRsp { @@ -27,8 +30,9 @@ message Package { uint64 id = 1 [(validate.rules).uint64.gt = 0]; string name = 2 [(validate.rules).string.min_len = 1]; string url = 3 [(validate.rules).string.min_len = 1]; - repeated Module modules = 4; - repeated Issue issues = 5; + repeated uint64 modules = 4; + repeated uint64 issues = 5; + repeated uint64 comments = 6; }; message Module { @@ -36,6 +40,7 @@ message Module { string name = 2 [(validate.rules).string.min_len = 1]; string version = 3 [(validate.rules).string.min_len = 1]; uint64 package = 4 [(validate.rules).uint64.gt = 0]; + string last_version = 5 [(validate.rules).string.min_len = 1]; } message Issue { @@ -59,18 +64,36 @@ message ListPackageRsp{ repeated Package packages = 1; } -message UpdateInfoPackageRsp { - uint64 id = 1 [(validate.rules).uint64.gt = 0]; +message UpdatePackageReq { + google.protobuf.UInt64Value id = 1 [(validate.rules).message.required = true]; + google.protobuf.StringValue name = 2 [(validate.rules).message.required = true]; + google.protobuf.StringValue url = 3 [(validate.rules).message.required = true]; + repeated uint64 modules = 4 ; + repeated uint64 issues = 5 ; } -message UpdateInfoPackageReq { +message UpdatePackageRsp { uint64 id = 1 [(validate.rules).uint64.gt = 0]; } -message CommentRsp { - uint64 idPackage = 1 [(validate.rules).uint64.gt = 0]; +message AddCommentReq { + google.protobuf.UInt64Value idPackage = 1 [(validate.rules).message.required = true]; string text = 2; } -message CommentReq { +message AddCommentRsp { uint64 id = 1 [(validate.rules).uint64.gt = 0]; +} + +message AddPackageReq { + google.protobuf.StringValue name = 1 [(validate.rules).message.required = true]; + google.protobuf.StringValue url = 2 [(validate.rules).message.required = true]; + repeated uint64 modules = 3; +} +message AddPackageRsp{} + +message GetModuleReq { + repeated uint64 id = 1 ; +} +message GetModuleRsp { + repeated Module modules = 1 ; } \ No newline at end of file diff --git a/proto/docker_generate/Dockerfile b/proto/docker_generate/Dockerfile new file mode 100644 index 0000000..24e0cd6 --- /dev/null +++ b/proto/docker_generate/Dockerfile @@ -0,0 +1,43 @@ +FROM golang:1.19-bullseye + +RUN mkdir /build +WORKDIR /build + +RUN apt-get update && apt-get -y install --no-install-recommends protobuf-compiler libprotobuf-dev + +ENV PATH=${PATH}:${GOBIN} + +ENV GEN_VALIDATE=github.com/envoyproxy/protoc-gen-validate@v1.0.2 +ENV GOOGLEAPIS=github.com/google/googleapis@v0.0.0-20200324113624-36c0febd0fa7 +ENV GRPC_GATEWAY=github.com/grpc-ecosystem/grpc-gateway@v1.16.0 + +RUN go install ${GEN_VALIDATE} + +RUN go install github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway@v1.16.0 && \ + go install github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger@v1.16.0 && \ + go install google.golang.org/protobuf/cmd/protoc-gen-go@latest + +RUN go install go.unistack.org/protoc-gen-go-micro/v3@latest + +RUN go mod init proto +RUN go get ${GOOGLEAPIS} && \ + go get ${GRPC_GATEWAY} && \ + go get google.golang.org/grpc@v1.57.0 && \ + go get -u github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway && \ + go get -u github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2 && \ + go get google.golang.org/protobuf/cmd/protoc-gen-go && \ + go get go.unistack.org/micro-proto/v3@v3.3.1 + +CMD rm -rf go_generate && \ + protoc \ + --validate_out=lang=go:. \ + --go-micro_out=debug=true,components="micro|http":. \ + --go_out=. \ + --grpc-gateway_out=. \ + --proto_path=/go/pkg/mod/go.unistack.org/micro-proto/v3@v3.3.1 \ + -I=./ \ + -I=/usr/include \ + -I=/go/pkg/mod/${GEN_VALIDATE} \ + -I=/go/pkg/mod/${GOOGLEAPIS} \ + -I=/go/pkg/mod/${GRPC_GATEWAY} \ + ./*.proto diff --git a/proto/docker_generate/Makefile b/proto/docker_generate/Makefile new file mode 100644 index 0000000..cac80f5 --- /dev/null +++ b/proto/docker_generate/Makefile @@ -0,0 +1,7 @@ +#New version of proto Makefile and Dockerfile can be found +#at https://qcm-git.mbrd.ru/service-platform/examples/makefile + +.PHONY: proto +proto: + docker build -t proto:latest . + docker run --rm --name=proto -v `pwd`:/build proto:latest \ No newline at end of file diff --git a/proto/docker_generate/dashboard.proto b/proto/docker_generate/dashboard.proto new file mode 100644 index 0000000..e6a9588 --- /dev/null +++ b/proto/docker_generate/dashboard.proto @@ -0,0 +1,71 @@ +syntax = "proto3"; + +package proto; + +option go_package = "./go_generate;go_generate"; + +import "validate/validate.proto"; + + +message ErrorRsp { + Error error = 1 [json_name = "error"]; +} + +message Error { + string code = 1 [json_name = "code"]; + string title = 2 [json_name = "title"]; + string uuid = 3 [json_name = "uuid"]; + string details = 4 [json_name = "details"]; +} + +message Package { + uint64 id = 1 [(validate.rules).uint64.gt = 0]; + string name = 2 [(validate.rules).string.min_len = 1]; + string url = 3 [(validate.rules).string.min_len = 1]; + repeated Module modules = 4; + repeated Issue issues = 5; +}; + +message Module { + uint64 id = 1 [(validate.rules).uint64.gt = 0]; + string name = 2 [(validate.rules).string.min_len = 1]; + string version = 3 [(validate.rules).string.min_len = 1]; + uint64 package = 4 [(validate.rules).uint64.gt = 0]; +} + +message Issue { + uint64 id = 1 [(validate.rules).uint64.gt = 0]; + uint64 status = 2 [(validate.rules).uint64.gt = 0]; + string desc = 3 [(validate.rules).string.min_len = 1]; + uint64 package = 4 [(validate.rules).uint64.gt = 0]; + repeated uint64 modules = 5; +} + +message Comment { + uint64 id = 1 [(validate.rules).uint64.gt = 0]; + uint64 package = 2 [(validate.rules).uint64.gt = 0]; + string text = 3; + uint64 created = 4 [(validate.rules).uint64.gt = 0]; + uint64 updated = 5 [(validate.rules).uint64.gt = 0]; +} + +message ListPackageReq {} +message ListPackageRsp{ + repeated Package packages = 1; +} + +message UpdateInfoPackageRsp { + uint64 id = 1 [(validate.rules).uint64.gt = 0]; +} +message UpdateInfoPackageReq { + uint64 id = 1 [(validate.rules).uint64.gt = 0]; +} + +message CommentRsp { + uint64 idPackage = 1 [(validate.rules).uint64.gt = 0]; + string text = 2; +} + +message CommentReq { + uint64 id = 1 [(validate.rules).uint64.gt = 0]; +} \ No newline at end of file diff --git a/proto/docker_generate/restService.proto b/proto/docker_generate/restService.proto new file mode 100644 index 0000000..d3205fa --- /dev/null +++ b/proto/docker_generate/restService.proto @@ -0,0 +1,42 @@ +syntax = "proto3"; + +package proto; + +option go_package = "./go_generate;go_generate"; + +import "dashboard.proto"; +import "google/api/annotations.proto"; +import "protoc-gen-swagger/options/annotations.proto"; + +option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { + info: { + title: "service-platform/product-services/mts-money/gateway-proto", + version: "0"; + }; + consumes: "application/json"; + produces: "application/json"; +}; + +service DashboardService { + rpc ListPackage(ListPackageReq) returns (ListPackageRsp) { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + operation_id: "ListPackage"; + responses: { + key: "default"; + value: { + description: "Error response"; + schema: { + json_schema: { + ref: ".go_generate.ErrorRsp"; + } + } + } + } + }; + option (google.api.http) = { + get: "/listPackage"; + }; + }; + rpc UpdateInfo(UpdateInfoPackageRsp) returns (UpdateInfoPackageReq) {}; + rpc AddComment(CommentRsp) returns (CommentReq) {}; +}; \ No newline at end of file diff --git a/proto/generate.sh b/proto/generate.sh index bc9a3c2..d841b96 100755 --- a/proto/generate.sh +++ b/proto/generate.sh @@ -8,7 +8,7 @@ --validate_out=paths=source_relative,lang=go:go_generate " -find . -not \( -name "*.sh" -or -name "*.proto" -or -name "generate.go" \) -delete +find . -not \( -name "*.sh" -or -name "*.proto" -or -name "generate.go" -or -name "Dockerfile" -or -name "Makefile" \) -delete mkdir -p micro go_generate && \ protoc -I. $PROTO_ARGS ./*.proto || \ -find . -not \( -name "*.sh" -or -name "*.proto" -or -name "generate.go" \) -delete \ No newline at end of file +find . -not \( -name "*.sh" -or -name "*.proto" -or -name "generate.go" -or -name "Dockerfile" -or -name "Makefile" \) -delete \ No newline at end of file diff --git a/proto/go_generate/dashboard.pb.go b/proto/go_generate/dashboard.pb.go index 46671b2..9c9c65d 100644 --- a/proto/go_generate/dashboard.pb.go +++ b/proto/go_generate/dashboard.pb.go @@ -10,6 +10,7 @@ import ( _ "github.com/envoyproxy/protoc-gen-validate/validate" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" ) @@ -144,11 +145,12 @@ type Package struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` - Modules []*Module `protobuf:"bytes,4,rep,name=modules,proto3" json:"modules,omitempty"` - Issues []*Issue `protobuf:"bytes,5,rep,name=issues,proto3" json:"issues,omitempty"` + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` + Modules []uint64 `protobuf:"varint,4,rep,packed,name=modules,proto3" json:"modules,omitempty"` + Issues []uint64 `protobuf:"varint,5,rep,packed,name=issues,proto3" json:"issues,omitempty"` + Comments []uint64 `protobuf:"varint,6,rep,packed,name=comments,proto3" json:"comments,omitempty"` } func (x *Package) Reset() { @@ -204,29 +206,37 @@ func (x *Package) GetUrl() string { return "" } -func (x *Package) GetModules() []*Module { +func (x *Package) GetModules() []uint64 { if x != nil { return x.Modules } return nil } -func (x *Package) GetIssues() []*Issue { +func (x *Package) GetIssues() []uint64 { if x != nil { return x.Issues } return nil } +func (x *Package) GetComments() []uint64 { + if x != nil { + return x.Comments + } + return nil +} + type Module struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` - Package uint64 `protobuf:"varint,4,opt,name=package,proto3" json:"package,omitempty"` + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + Package uint64 `protobuf:"varint,4,opt,name=package,proto3" json:"package,omitempty"` + LastVersion string `protobuf:"bytes,5,opt,name=last_version,json=lastVersion,proto3" json:"last_version,omitempty"` } func (x *Module) Reset() { @@ -289,6 +299,13 @@ func (x *Module) GetPackage() uint64 { return 0 } +func (x *Module) GetLastVersion() string { + if x != nil { + return x.LastVersion + } + return "" +} + type Issue struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -532,16 +549,20 @@ func (x *ListPackageRsp) GetPackages() []*Package { return nil } -type UpdateInfoPackageRsp struct { +type UpdatePackageReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Id *wrapperspb.UInt64Value `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name *wrapperspb.StringValue `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Url *wrapperspb.StringValue `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` + Modules []uint64 `protobuf:"varint,4,rep,packed,name=modules,proto3" json:"modules,omitempty"` + Issues []uint64 `protobuf:"varint,5,rep,packed,name=issues,proto3" json:"issues,omitempty"` } -func (x *UpdateInfoPackageRsp) Reset() { - *x = UpdateInfoPackageRsp{} +func (x *UpdatePackageReq) Reset() { + *x = UpdatePackageReq{} if protoimpl.UnsafeEnabled { mi := &file_dashboard_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -549,13 +570,13 @@ func (x *UpdateInfoPackageRsp) Reset() { } } -func (x *UpdateInfoPackageRsp) String() string { +func (x *UpdatePackageReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateInfoPackageRsp) ProtoMessage() {} +func (*UpdatePackageReq) ProtoMessage() {} -func (x *UpdateInfoPackageRsp) ProtoReflect() protoreflect.Message { +func (x *UpdatePackageReq) ProtoReflect() protoreflect.Message { mi := &file_dashboard_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -567,19 +588,47 @@ func (x *UpdateInfoPackageRsp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateInfoPackageRsp.ProtoReflect.Descriptor instead. -func (*UpdateInfoPackageRsp) Descriptor() ([]byte, []int) { +// Deprecated: Use UpdatePackageReq.ProtoReflect.Descriptor instead. +func (*UpdatePackageReq) Descriptor() ([]byte, []int) { return file_dashboard_proto_rawDescGZIP(), []int{8} } -func (x *UpdateInfoPackageRsp) GetId() uint64 { +func (x *UpdatePackageReq) GetId() *wrapperspb.UInt64Value { if x != nil { return x.Id } - return 0 + return nil } -type UpdateInfoPackageReq struct { +func (x *UpdatePackageReq) GetName() *wrapperspb.StringValue { + if x != nil { + return x.Name + } + return nil +} + +func (x *UpdatePackageReq) GetUrl() *wrapperspb.StringValue { + if x != nil { + return x.Url + } + return nil +} + +func (x *UpdatePackageReq) GetModules() []uint64 { + if x != nil { + return x.Modules + } + return nil +} + +func (x *UpdatePackageReq) GetIssues() []uint64 { + if x != nil { + return x.Issues + } + return nil +} + +type UpdatePackageRsp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -587,8 +636,8 @@ type UpdateInfoPackageReq struct { Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` } -func (x *UpdateInfoPackageReq) Reset() { - *x = UpdateInfoPackageReq{} +func (x *UpdatePackageRsp) Reset() { + *x = UpdatePackageRsp{} if protoimpl.UnsafeEnabled { mi := &file_dashboard_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -596,13 +645,13 @@ func (x *UpdateInfoPackageReq) Reset() { } } -func (x *UpdateInfoPackageReq) String() string { +func (x *UpdatePackageRsp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateInfoPackageReq) ProtoMessage() {} +func (*UpdatePackageRsp) ProtoMessage() {} -func (x *UpdateInfoPackageReq) ProtoReflect() protoreflect.Message { +func (x *UpdatePackageRsp) ProtoReflect() protoreflect.Message { mi := &file_dashboard_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -614,29 +663,29 @@ func (x *UpdateInfoPackageReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateInfoPackageReq.ProtoReflect.Descriptor instead. -func (*UpdateInfoPackageReq) Descriptor() ([]byte, []int) { +// Deprecated: Use UpdatePackageRsp.ProtoReflect.Descriptor instead. +func (*UpdatePackageRsp) Descriptor() ([]byte, []int) { return file_dashboard_proto_rawDescGZIP(), []int{9} } -func (x *UpdateInfoPackageReq) GetId() uint64 { +func (x *UpdatePackageRsp) GetId() uint64 { if x != nil { return x.Id } return 0 } -type CommentRsp struct { +type AddCommentReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - IdPackage uint64 `protobuf:"varint,1,opt,name=idPackage,proto3" json:"idPackage,omitempty"` - Text string `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"` + IdPackage *wrapperspb.UInt64Value `protobuf:"bytes,1,opt,name=idPackage,proto3" json:"idPackage,omitempty"` + Text string `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"` } -func (x *CommentRsp) Reset() { - *x = CommentRsp{} +func (x *AddCommentReq) Reset() { + *x = AddCommentReq{} if protoimpl.UnsafeEnabled { mi := &file_dashboard_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -644,13 +693,13 @@ func (x *CommentRsp) Reset() { } } -func (x *CommentRsp) String() string { +func (x *AddCommentReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CommentRsp) ProtoMessage() {} +func (*AddCommentReq) ProtoMessage() {} -func (x *CommentRsp) ProtoReflect() protoreflect.Message { +func (x *AddCommentReq) ProtoReflect() protoreflect.Message { mi := &file_dashboard_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -662,26 +711,26 @@ func (x *CommentRsp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CommentRsp.ProtoReflect.Descriptor instead. -func (*CommentRsp) Descriptor() ([]byte, []int) { +// Deprecated: Use AddCommentReq.ProtoReflect.Descriptor instead. +func (*AddCommentReq) Descriptor() ([]byte, []int) { return file_dashboard_proto_rawDescGZIP(), []int{10} } -func (x *CommentRsp) GetIdPackage() uint64 { +func (x *AddCommentReq) GetIdPackage() *wrapperspb.UInt64Value { if x != nil { return x.IdPackage } - return 0 + return nil } -func (x *CommentRsp) GetText() string { +func (x *AddCommentReq) GetText() string { if x != nil { return x.Text } return "" } -type CommentReq struct { +type AddCommentRsp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -689,8 +738,8 @@ type CommentReq struct { Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` } -func (x *CommentReq) Reset() { - *x = CommentReq{} +func (x *AddCommentRsp) Reset() { + *x = AddCommentRsp{} if protoimpl.UnsafeEnabled { mi := &file_dashboard_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -698,13 +747,13 @@ func (x *CommentReq) Reset() { } } -func (x *CommentReq) String() string { +func (x *AddCommentRsp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CommentReq) ProtoMessage() {} +func (*AddCommentRsp) ProtoMessage() {} -func (x *CommentReq) ProtoReflect() protoreflect.Message { +func (x *AddCommentRsp) ProtoReflect() protoreflect.Message { mi := &file_dashboard_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -716,24 +765,221 @@ func (x *CommentReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CommentReq.ProtoReflect.Descriptor instead. -func (*CommentReq) Descriptor() ([]byte, []int) { +// Deprecated: Use AddCommentRsp.ProtoReflect.Descriptor instead. +func (*AddCommentRsp) Descriptor() ([]byte, []int) { return file_dashboard_proto_rawDescGZIP(), []int{11} } -func (x *CommentReq) GetId() uint64 { +func (x *AddCommentRsp) GetId() uint64 { if x != nil { return x.Id } return 0 } +type AddPackageReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name *wrapperspb.StringValue `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Url *wrapperspb.StringValue `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + Modules []uint64 `protobuf:"varint,3,rep,packed,name=modules,proto3" json:"modules,omitempty"` +} + +func (x *AddPackageReq) Reset() { + *x = AddPackageReq{} + if protoimpl.UnsafeEnabled { + mi := &file_dashboard_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddPackageReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddPackageReq) ProtoMessage() {} + +func (x *AddPackageReq) ProtoReflect() protoreflect.Message { + mi := &file_dashboard_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddPackageReq.ProtoReflect.Descriptor instead. +func (*AddPackageReq) Descriptor() ([]byte, []int) { + return file_dashboard_proto_rawDescGZIP(), []int{12} +} + +func (x *AddPackageReq) GetName() *wrapperspb.StringValue { + if x != nil { + return x.Name + } + return nil +} + +func (x *AddPackageReq) GetUrl() *wrapperspb.StringValue { + if x != nil { + return x.Url + } + return nil +} + +func (x *AddPackageReq) GetModules() []uint64 { + if x != nil { + return x.Modules + } + return nil +} + +type AddPackageRsp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *AddPackageRsp) Reset() { + *x = AddPackageRsp{} + if protoimpl.UnsafeEnabled { + mi := &file_dashboard_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddPackageRsp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddPackageRsp) ProtoMessage() {} + +func (x *AddPackageRsp) ProtoReflect() protoreflect.Message { + mi := &file_dashboard_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddPackageRsp.ProtoReflect.Descriptor instead. +func (*AddPackageRsp) Descriptor() ([]byte, []int) { + return file_dashboard_proto_rawDescGZIP(), []int{13} +} + +type GetModuleReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id []uint64 `protobuf:"varint,1,rep,packed,name=id,proto3" json:"id,omitempty"` +} + +func (x *GetModuleReq) Reset() { + *x = GetModuleReq{} + if protoimpl.UnsafeEnabled { + mi := &file_dashboard_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetModuleReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetModuleReq) ProtoMessage() {} + +func (x *GetModuleReq) ProtoReflect() protoreflect.Message { + mi := &file_dashboard_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetModuleReq.ProtoReflect.Descriptor instead. +func (*GetModuleReq) Descriptor() ([]byte, []int) { + return file_dashboard_proto_rawDescGZIP(), []int{14} +} + +func (x *GetModuleReq) GetId() []uint64 { + if x != nil { + return x.Id + } + return nil +} + +type GetModuleRsp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Modules []*Module `protobuf:"bytes,1,rep,name=modules,proto3" json:"modules,omitempty"` +} + +func (x *GetModuleRsp) Reset() { + *x = GetModuleRsp{} + if protoimpl.UnsafeEnabled { + mi := &file_dashboard_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetModuleRsp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetModuleRsp) ProtoMessage() {} + +func (x *GetModuleRsp) ProtoReflect() protoreflect.Message { + mi := &file_dashboard_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetModuleRsp.ProtoReflect.Descriptor instead. +func (*GetModuleRsp) Descriptor() ([]byte, []int) { + return file_dashboard_proto_rawDescGZIP(), []int{15} +} + +func (x *GetModuleRsp) GetModules() []*Module { + if x != nil { + return x.Modules + } + return nil +} + var File_dashboard_proto protoreflect.FileDescriptor var file_dashboard_proto_rawDesc = []byte{ 0x0a, 0x0f, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x2e, 0x0a, 0x08, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, 0x12, 0x22, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, @@ -743,82 +989,123 @@ var file_dashboard_proto_rawDesc = []byte{ 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x07, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x17, + 0x6c, 0x73, 0x22, 0xa8, 0x01, 0x0a, 0x07, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, - 0x27, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, - 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, - 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, 0x22, 0x84, - 0x01, 0x0a, 0x06, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x18, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x04, + 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x73, + 0x75, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x04, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, + 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x04, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xb0, 0x01, + 0x0a, 0x06, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x07, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x9b, 0x01, 0x0a, 0x05, 0x49, 0x73, 0x73, 0x75, 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x64, 0x65, 0x73, + 0x63, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x07, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x04, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x9f, + 0x01, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x07, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x21, 0x0a, 0x07, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x32, 0x02, 0x20, 0x00, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, + 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x22, 0x10, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x71, 0x22, 0x3c, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x52, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, + 0x22, 0xf2, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x36, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, + 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3a, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, + 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x03, 0x75, 0x72, 0x6c, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x03, + 0x75, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x04, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, + 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x04, 0x52, 0x06, 0x69, + 0x73, 0x73, 0x75, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x73, 0x70, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x21, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x07, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x05, 0x49, 0x73, 0x73, 0x75, 0x65, 0x12, - 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x32, 0x02, 0x20, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, - 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x04, 0x64, 0x65, 0x73, - 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, - 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x04, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x73, 0x22, 0x9f, 0x01, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x32, 0x02, 0x20, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, - 0x20, 0x00, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, - 0x21, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x07, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x22, 0x10, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x22, 0x3c, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x08, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x08, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x73, 0x22, 0x2f, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x73, 0x70, 0x12, 0x17, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, - 0x20, 0x00, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2f, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x17, + 0x69, 0x64, 0x22, 0x69, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x12, 0x44, 0x0a, 0x09, 0x69, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, + 0x69, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x28, 0x0a, + 0x0d, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x73, 0x70, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, - 0x02, 0x20, 0x00, 0x52, 0x02, 0x69, 0x64, 0x22, 0x47, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x73, 0x70, 0x12, 0x25, 0x0a, 0x09, 0x69, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, - 0x00, 0x52, 0x09, 0x69, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, - 0x22, 0x25, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, 0x17, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, - 0x02, 0x20, 0x00, 0x52, 0x02, 0x69, 0x64, 0x32, 0xd1, 0x01, 0x0a, 0x10, 0x44, 0x61, 0x73, 0x68, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3d, 0x0a, 0x0b, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x15, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x73, 0x70, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x52, 0x73, 0x70, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x71, 0x22, 0x00, 0x12, 0x34, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x73, 0x70, 0x1a, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x22, 0x00, 0x42, 0x44, 0x5a, 0x42, 0x67, - 0x6f, 0x2e, 0x75, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x75, - 0x6e, 0x69, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2d, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x6b, 0x67, 0x64, - 0x61, 0x73, 0x68, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x5f, 0x67, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x3b, 0x67, 0x6f, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x02, 0x20, 0x00, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9f, 0x01, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x3a, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x04, + 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x0f, 0x0a, 0x0d, 0x41, 0x64, 0x64, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x73, 0x70, 0x22, 0x1e, 0x0a, 0x0c, 0x47, 0x65, + 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, + 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x73, 0x70, 0x12, 0x27, 0x0a, 0x07, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x73, 0x32, 0xc7, 0x02, 0x0a, 0x10, 0x44, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x52, 0x73, 0x70, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x73, 0x70, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x0a, + 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x73, 0x70, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, + 0x64, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, + 0x73, 0x70, 0x22, 0x00, 0x12, 0x37, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, + 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x73, 0x70, 0x22, 0x00, 0x42, 0x44, 0x5a, + 0x42, 0x67, 0x6f, 0x2e, 0x75, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x6f, 0x72, 0x67, + 0x2f, 0x75, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2d, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x6b, + 0x67, 0x64, 0x61, 0x73, 0x68, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x5f, 0x67, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x3b, 0x67, 0x6f, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -833,37 +1120,52 @@ func file_dashboard_proto_rawDescGZIP() []byte { return file_dashboard_proto_rawDescData } -var file_dashboard_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_dashboard_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_dashboard_proto_goTypes = []interface{}{ - (*ErrorRsp)(nil), // 0: proto.ErrorRsp - (*Error)(nil), // 1: proto.Error - (*Package)(nil), // 2: proto.Package - (*Module)(nil), // 3: proto.Module - (*Issue)(nil), // 4: proto.Issue - (*Comment)(nil), // 5: proto.Comment - (*ListPackageReq)(nil), // 6: proto.ListPackageReq - (*ListPackageRsp)(nil), // 7: proto.ListPackageRsp - (*UpdateInfoPackageRsp)(nil), // 8: proto.UpdateInfoPackageRsp - (*UpdateInfoPackageReq)(nil), // 9: proto.UpdateInfoPackageReq - (*CommentRsp)(nil), // 10: proto.CommentRsp - (*CommentReq)(nil), // 11: proto.CommentReq + (*ErrorRsp)(nil), // 0: proto.ErrorRsp + (*Error)(nil), // 1: proto.Error + (*Package)(nil), // 2: proto.Package + (*Module)(nil), // 3: proto.Module + (*Issue)(nil), // 4: proto.Issue + (*Comment)(nil), // 5: proto.Comment + (*ListPackageReq)(nil), // 6: proto.ListPackageReq + (*ListPackageRsp)(nil), // 7: proto.ListPackageRsp + (*UpdatePackageReq)(nil), // 8: proto.UpdatePackageReq + (*UpdatePackageRsp)(nil), // 9: proto.UpdatePackageRsp + (*AddCommentReq)(nil), // 10: proto.AddCommentReq + (*AddCommentRsp)(nil), // 11: proto.AddCommentRsp + (*AddPackageReq)(nil), // 12: proto.AddPackageReq + (*AddPackageRsp)(nil), // 13: proto.AddPackageRsp + (*GetModuleReq)(nil), // 14: proto.GetModuleReq + (*GetModuleRsp)(nil), // 15: proto.GetModuleRsp + (*wrapperspb.UInt64Value)(nil), // 16: google.protobuf.UInt64Value + (*wrapperspb.StringValue)(nil), // 17: google.protobuf.StringValue } var file_dashboard_proto_depIdxs = []int32{ 1, // 0: proto.ErrorRsp.error:type_name -> proto.Error - 3, // 1: proto.Package.modules:type_name -> proto.Module - 4, // 2: proto.Package.issues:type_name -> proto.Issue - 2, // 3: proto.ListPackageRsp.packages:type_name -> proto.Package - 6, // 4: proto.DashboardService.ListPackage:input_type -> proto.ListPackageReq - 8, // 5: proto.DashboardService.UpdateInfo:input_type -> proto.UpdateInfoPackageRsp - 10, // 6: proto.DashboardService.AddComment:input_type -> proto.CommentRsp - 7, // 7: proto.DashboardService.ListPackage:output_type -> proto.ListPackageRsp - 9, // 8: proto.DashboardService.UpdateInfo:output_type -> proto.UpdateInfoPackageReq - 11, // 9: proto.DashboardService.AddComment:output_type -> proto.CommentReq - 7, // [7:10] is the sub-list for method output_type - 4, // [4:7] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name + 2, // 1: proto.ListPackageRsp.packages:type_name -> proto.Package + 16, // 2: proto.UpdatePackageReq.id:type_name -> google.protobuf.UInt64Value + 17, // 3: proto.UpdatePackageReq.name:type_name -> google.protobuf.StringValue + 17, // 4: proto.UpdatePackageReq.url:type_name -> google.protobuf.StringValue + 16, // 5: proto.AddCommentReq.idPackage:type_name -> google.protobuf.UInt64Value + 17, // 6: proto.AddPackageReq.name:type_name -> google.protobuf.StringValue + 17, // 7: proto.AddPackageReq.url:type_name -> google.protobuf.StringValue + 3, // 8: proto.GetModuleRsp.modules:type_name -> proto.Module + 6, // 9: proto.DashboardService.ListPackage:input_type -> proto.ListPackageReq + 8, // 10: proto.DashboardService.UpdatePackage:input_type -> proto.UpdatePackageReq + 10, // 11: proto.DashboardService.AddComment:input_type -> proto.AddCommentReq + 12, // 12: proto.DashboardService.AddPackage:input_type -> proto.AddPackageReq + 14, // 13: proto.DashboardService.GetModule:input_type -> proto.GetModuleReq + 7, // 14: proto.DashboardService.ListPackage:output_type -> proto.ListPackageRsp + 9, // 15: proto.DashboardService.UpdatePackage:output_type -> proto.UpdatePackageRsp + 11, // 16: proto.DashboardService.AddComment:output_type -> proto.AddCommentRsp + 13, // 17: proto.DashboardService.AddPackage:output_type -> proto.AddPackageRsp + 15, // 18: proto.DashboardService.GetModule:output_type -> proto.GetModuleRsp + 14, // [14:19] is the sub-list for method output_type + 9, // [9:14] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name } func init() { file_dashboard_proto_init() } @@ -969,7 +1271,7 @@ func file_dashboard_proto_init() { } } file_dashboard_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateInfoPackageRsp); i { + switch v := v.(*UpdatePackageReq); i { case 0: return &v.state case 1: @@ -981,7 +1283,7 @@ func file_dashboard_proto_init() { } } file_dashboard_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateInfoPackageReq); i { + switch v := v.(*UpdatePackageRsp); i { case 0: return &v.state case 1: @@ -993,7 +1295,7 @@ func file_dashboard_proto_init() { } } file_dashboard_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommentRsp); i { + switch v := v.(*AddCommentReq); i { case 0: return &v.state case 1: @@ -1005,7 +1307,55 @@ func file_dashboard_proto_init() { } } file_dashboard_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommentReq); i { + switch v := v.(*AddCommentRsp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dashboard_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddPackageReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dashboard_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddPackageRsp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dashboard_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetModuleReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dashboard_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetModuleRsp); i { case 0: return &v.state case 1: @@ -1023,7 +1373,7 @@ func file_dashboard_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_dashboard_proto_rawDesc, NumEnums: 0, - NumMessages: 12, + NumMessages: 16, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/go_generate/dashboard.pb.validate.go b/proto/go_generate/dashboard.pb.validate.go index e82f9cd..102ee08 100644 --- a/proto/go_generate/dashboard.pb.validate.go +++ b/proto/go_generate/dashboard.pb.validate.go @@ -323,74 +323,6 @@ func (m *Package) validate(all bool) error { errors = append(errors, err) } - for idx, item := range m.GetModules() { - _, _ = idx, item - - if all { - switch v := interface{}(item).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, PackageValidationError{ - field: fmt.Sprintf("Modules[%v]", idx), - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, PackageValidationError{ - field: fmt.Sprintf("Modules[%v]", idx), - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return PackageValidationError{ - field: fmt.Sprintf("Modules[%v]", idx), - reason: "embedded message failed validation", - cause: err, - } - } - } - - } - - for idx, item := range m.GetIssues() { - _, _ = idx, item - - if all { - switch v := interface{}(item).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, PackageValidationError{ - field: fmt.Sprintf("Issues[%v]", idx), - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, PackageValidationError{ - field: fmt.Sprintf("Issues[%v]", idx), - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return PackageValidationError{ - field: fmt.Sprintf("Issues[%v]", idx), - reason: "embedded message failed validation", - cause: err, - } - } - } - - } - if len(errors) > 0 { return PackageMultiError(errors) } @@ -533,6 +465,17 @@ func (m *Module) validate(all bool) error { errors = append(errors, err) } + if utf8.RuneCountInString(m.GetLastVersion()) < 1 { + err := ModuleValidationError{ + field: "LastVersion", + reason: "value length must be at least 1 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + if len(errors) > 0 { return ModuleMultiError(errors) } @@ -1130,32 +1073,32 @@ var _ interface { ErrorName() string } = ListPackageRspValidationError{} -// Validate checks the field values on UpdateInfoPackageRsp with the rules -// defined in the proto definition for this message. If any rules are -// violated, the first error encountered is returned, or nil if there are no violations. -func (m *UpdateInfoPackageRsp) Validate() error { +// Validate checks the field values on UpdatePackageReq with the rules defined +// in the proto definition for this message. If any rules are violated, the +// first error encountered is returned, or nil if there are no violations. +func (m *UpdatePackageReq) Validate() error { return m.validate(false) } -// ValidateAll checks the field values on UpdateInfoPackageRsp with the rules +// ValidateAll checks the field values on UpdatePackageReq with the rules // defined in the proto definition for this message. If any rules are // violated, the result is a list of violation errors wrapped in -// UpdateInfoPackageRspMultiError, or nil if none found. -func (m *UpdateInfoPackageRsp) ValidateAll() error { +// UpdatePackageReqMultiError, or nil if none found. +func (m *UpdatePackageReq) ValidateAll() error { return m.validate(true) } -func (m *UpdateInfoPackageRsp) validate(all bool) error { +func (m *UpdatePackageReq) validate(all bool) error { if m == nil { return nil } var errors []error - if m.GetId() <= 0 { - err := UpdateInfoPackageRspValidationError{ + if m.GetId() == nil { + err := UpdatePackageReqValidationError{ field: "Id", - reason: "value must be greater than 0", + reason: "value is required", } if !all { return err @@ -1163,20 +1106,129 @@ func (m *UpdateInfoPackageRsp) validate(all bool) error { errors = append(errors, err) } + if all { + switch v := interface{}(m.GetId()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, UpdatePackageReqValidationError{ + field: "Id", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, UpdatePackageReqValidationError{ + field: "Id", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetId()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return UpdatePackageReqValidationError{ + field: "Id", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if m.GetName() == nil { + err := UpdatePackageReqValidationError{ + field: "Name", + reason: "value is required", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetName()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, UpdatePackageReqValidationError{ + field: "Name", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, UpdatePackageReqValidationError{ + field: "Name", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetName()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return UpdatePackageReqValidationError{ + field: "Name", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if m.GetUrl() == nil { + err := UpdatePackageReqValidationError{ + field: "Url", + reason: "value is required", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetUrl()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, UpdatePackageReqValidationError{ + field: "Url", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, UpdatePackageReqValidationError{ + field: "Url", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetUrl()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return UpdatePackageReqValidationError{ + field: "Url", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { - return UpdateInfoPackageRspMultiError(errors) + return UpdatePackageReqMultiError(errors) } return nil } -// UpdateInfoPackageRspMultiError is an error wrapping multiple validation -// errors returned by UpdateInfoPackageRsp.ValidateAll() if the designated -// constraints aren't met. -type UpdateInfoPackageRspMultiError []error +// UpdatePackageReqMultiError is an error wrapping multiple validation errors +// returned by UpdatePackageReq.ValidateAll() if the designated constraints +// aren't met. +type UpdatePackageReqMultiError []error // Error returns a concatenation of all the error messages it wraps. -func (m UpdateInfoPackageRspMultiError) Error() string { +func (m UpdatePackageReqMultiError) Error() string { var msgs []string for _, err := range m { msgs = append(msgs, err.Error()) @@ -1185,11 +1237,11 @@ func (m UpdateInfoPackageRspMultiError) Error() string { } // AllErrors returns a list of validation violation errors. -func (m UpdateInfoPackageRspMultiError) AllErrors() []error { return m } +func (m UpdatePackageReqMultiError) AllErrors() []error { return m } -// UpdateInfoPackageRspValidationError is the validation error returned by -// UpdateInfoPackageRsp.Validate if the designated constraints aren't met. -type UpdateInfoPackageRspValidationError struct { +// UpdatePackageReqValidationError is the validation error returned by +// UpdatePackageReq.Validate if the designated constraints aren't met. +type UpdatePackageReqValidationError struct { field string reason string cause error @@ -1197,24 +1249,22 @@ type UpdateInfoPackageRspValidationError struct { } // Field function returns field value. -func (e UpdateInfoPackageRspValidationError) Field() string { return e.field } +func (e UpdatePackageReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e UpdateInfoPackageRspValidationError) Reason() string { return e.reason } +func (e UpdatePackageReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e UpdateInfoPackageRspValidationError) Cause() error { return e.cause } +func (e UpdatePackageReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e UpdateInfoPackageRspValidationError) Key() bool { return e.key } +func (e UpdatePackageReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e UpdateInfoPackageRspValidationError) ErrorName() string { - return "UpdateInfoPackageRspValidationError" -} +func (e UpdatePackageReqValidationError) ErrorName() string { return "UpdatePackageReqValidationError" } // Error satisfies the builtin error interface -func (e UpdateInfoPackageRspValidationError) Error() string { +func (e UpdatePackageReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -1226,14 +1276,14 @@ func (e UpdateInfoPackageRspValidationError) Error() string { } return fmt.Sprintf( - "invalid %sUpdateInfoPackageRsp.%s: %s%s", + "invalid %sUpdatePackageReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = UpdateInfoPackageRspValidationError{} +var _ error = UpdatePackageReqValidationError{} var _ interface { Field() string @@ -1241,24 +1291,24 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = UpdateInfoPackageRspValidationError{} +} = UpdatePackageReqValidationError{} -// Validate checks the field values on UpdateInfoPackageReq with the rules -// defined in the proto definition for this message. If any rules are -// violated, the first error encountered is returned, or nil if there are no violations. -func (m *UpdateInfoPackageReq) Validate() error { +// Validate checks the field values on UpdatePackageRsp with the rules defined +// in the proto definition for this message. If any rules are violated, the +// first error encountered is returned, or nil if there are no violations. +func (m *UpdatePackageRsp) Validate() error { return m.validate(false) } -// ValidateAll checks the field values on UpdateInfoPackageReq with the rules +// ValidateAll checks the field values on UpdatePackageRsp with the rules // defined in the proto definition for this message. If any rules are // violated, the result is a list of violation errors wrapped in -// UpdateInfoPackageReqMultiError, or nil if none found. -func (m *UpdateInfoPackageReq) ValidateAll() error { +// UpdatePackageRspMultiError, or nil if none found. +func (m *UpdatePackageRsp) ValidateAll() error { return m.validate(true) } -func (m *UpdateInfoPackageReq) validate(all bool) error { +func (m *UpdatePackageRsp) validate(all bool) error { if m == nil { return nil } @@ -1266,7 +1316,7 @@ func (m *UpdateInfoPackageReq) validate(all bool) error { var errors []error if m.GetId() <= 0 { - err := UpdateInfoPackageReqValidationError{ + err := UpdatePackageRspValidationError{ field: "Id", reason: "value must be greater than 0", } @@ -1277,19 +1327,19 @@ func (m *UpdateInfoPackageReq) validate(all bool) error { } if len(errors) > 0 { - return UpdateInfoPackageReqMultiError(errors) + return UpdatePackageRspMultiError(errors) } return nil } -// UpdateInfoPackageReqMultiError is an error wrapping multiple validation -// errors returned by UpdateInfoPackageReq.ValidateAll() if the designated -// constraints aren't met. -type UpdateInfoPackageReqMultiError []error +// UpdatePackageRspMultiError is an error wrapping multiple validation errors +// returned by UpdatePackageRsp.ValidateAll() if the designated constraints +// aren't met. +type UpdatePackageRspMultiError []error // Error returns a concatenation of all the error messages it wraps. -func (m UpdateInfoPackageReqMultiError) Error() string { +func (m UpdatePackageRspMultiError) Error() string { var msgs []string for _, err := range m { msgs = append(msgs, err.Error()) @@ -1298,11 +1348,11 @@ func (m UpdateInfoPackageReqMultiError) Error() string { } // AllErrors returns a list of validation violation errors. -func (m UpdateInfoPackageReqMultiError) AllErrors() []error { return m } +func (m UpdatePackageRspMultiError) AllErrors() []error { return m } -// UpdateInfoPackageReqValidationError is the validation error returned by -// UpdateInfoPackageReq.Validate if the designated constraints aren't met. -type UpdateInfoPackageReqValidationError struct { +// UpdatePackageRspValidationError is the validation error returned by +// UpdatePackageRsp.Validate if the designated constraints aren't met. +type UpdatePackageRspValidationError struct { field string reason string cause error @@ -1310,24 +1360,22 @@ type UpdateInfoPackageReqValidationError struct { } // Field function returns field value. -func (e UpdateInfoPackageReqValidationError) Field() string { return e.field } +func (e UpdatePackageRspValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e UpdateInfoPackageReqValidationError) Reason() string { return e.reason } +func (e UpdatePackageRspValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e UpdateInfoPackageReqValidationError) Cause() error { return e.cause } +func (e UpdatePackageRspValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e UpdateInfoPackageReqValidationError) Key() bool { return e.key } +func (e UpdatePackageRspValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e UpdateInfoPackageReqValidationError) ErrorName() string { - return "UpdateInfoPackageReqValidationError" -} +func (e UpdatePackageRspValidationError) ErrorName() string { return "UpdatePackageRspValidationError" } // Error satisfies the builtin error interface -func (e UpdateInfoPackageReqValidationError) Error() string { +func (e UpdatePackageRspValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -1339,14 +1387,14 @@ func (e UpdateInfoPackageReqValidationError) Error() string { } return fmt.Sprintf( - "invalid %sUpdateInfoPackageReq.%s: %s%s", + "invalid %sUpdatePackageRsp.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = UpdateInfoPackageReqValidationError{} +var _ error = UpdatePackageRspValidationError{} var _ interface { Field() string @@ -1354,34 +1402,34 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = UpdateInfoPackageReqValidationError{} +} = UpdatePackageRspValidationError{} -// Validate checks the field values on CommentRsp with the rules defined in the -// proto definition for this message. If any rules are violated, the first +// Validate checks the field values on AddCommentReq with the rules defined in +// the proto definition for this message. If any rules are violated, the first // error encountered is returned, or nil if there are no violations. -func (m *CommentRsp) Validate() error { +func (m *AddCommentReq) Validate() error { return m.validate(false) } -// ValidateAll checks the field values on CommentRsp with the rules defined in -// the proto definition for this message. If any rules are violated, the -// result is a list of violation errors wrapped in CommentRspMultiError, or +// ValidateAll checks the field values on AddCommentReq with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in AddCommentReqMultiError, or // nil if none found. -func (m *CommentRsp) ValidateAll() error { +func (m *AddCommentReq) ValidateAll() error { return m.validate(true) } -func (m *CommentRsp) validate(all bool) error { +func (m *AddCommentReq) validate(all bool) error { if m == nil { return nil } var errors []error - if m.GetIdPackage() <= 0 { - err := CommentRspValidationError{ + if m.GetIdPackage() == nil { + err := AddCommentReqValidationError{ field: "IdPackage", - reason: "value must be greater than 0", + reason: "value is required", } if !all { return err @@ -1389,21 +1437,51 @@ func (m *CommentRsp) validate(all bool) error { errors = append(errors, err) } + if all { + switch v := interface{}(m.GetIdPackage()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, AddCommentReqValidationError{ + field: "IdPackage", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, AddCommentReqValidationError{ + field: "IdPackage", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetIdPackage()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return AddCommentReqValidationError{ + field: "IdPackage", + reason: "embedded message failed validation", + cause: err, + } + } + } + // no validation rules for Text if len(errors) > 0 { - return CommentRspMultiError(errors) + return AddCommentReqMultiError(errors) } return nil } -// CommentRspMultiError is an error wrapping multiple validation errors -// returned by CommentRsp.ValidateAll() if the designated constraints aren't met. -type CommentRspMultiError []error +// AddCommentReqMultiError is an error wrapping multiple validation errors +// returned by AddCommentReq.ValidateAll() if the designated constraints +// aren't met. +type AddCommentReqMultiError []error // Error returns a concatenation of all the error messages it wraps. -func (m CommentRspMultiError) Error() string { +func (m AddCommentReqMultiError) Error() string { var msgs []string for _, err := range m { msgs = append(msgs, err.Error()) @@ -1412,11 +1490,11 @@ func (m CommentRspMultiError) Error() string { } // AllErrors returns a list of validation violation errors. -func (m CommentRspMultiError) AllErrors() []error { return m } +func (m AddCommentReqMultiError) AllErrors() []error { return m } -// CommentRspValidationError is the validation error returned by -// CommentRsp.Validate if the designated constraints aren't met. -type CommentRspValidationError struct { +// AddCommentReqValidationError is the validation error returned by +// AddCommentReq.Validate if the designated constraints aren't met. +type AddCommentReqValidationError struct { field string reason string cause error @@ -1424,22 +1502,22 @@ type CommentRspValidationError struct { } // Field function returns field value. -func (e CommentRspValidationError) Field() string { return e.field } +func (e AddCommentReqValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e CommentRspValidationError) Reason() string { return e.reason } +func (e AddCommentReqValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e CommentRspValidationError) Cause() error { return e.cause } +func (e AddCommentReqValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e CommentRspValidationError) Key() bool { return e.key } +func (e AddCommentReqValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e CommentRspValidationError) ErrorName() string { return "CommentRspValidationError" } +func (e AddCommentReqValidationError) ErrorName() string { return "AddCommentReqValidationError" } // Error satisfies the builtin error interface -func (e CommentRspValidationError) Error() string { +func (e AddCommentReqValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -1451,14 +1529,14 @@ func (e CommentRspValidationError) Error() string { } return fmt.Sprintf( - "invalid %sCommentRsp.%s: %s%s", + "invalid %sAddCommentReq.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = CommentRspValidationError{} +var _ error = AddCommentReqValidationError{} var _ interface { Field() string @@ -1466,24 +1544,24 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = CommentRspValidationError{} +} = AddCommentReqValidationError{} -// Validate checks the field values on CommentReq with the rules defined in the -// proto definition for this message. If any rules are violated, the first +// Validate checks the field values on AddCommentRsp with the rules defined in +// the proto definition for this message. If any rules are violated, the first // error encountered is returned, or nil if there are no violations. -func (m *CommentReq) Validate() error { +func (m *AddCommentRsp) Validate() error { return m.validate(false) } -// ValidateAll checks the field values on CommentReq with the rules defined in -// the proto definition for this message. If any rules are violated, the -// result is a list of violation errors wrapped in CommentReqMultiError, or +// ValidateAll checks the field values on AddCommentRsp with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in AddCommentRspMultiError, or // nil if none found. -func (m *CommentReq) ValidateAll() error { +func (m *AddCommentRsp) ValidateAll() error { return m.validate(true) } -func (m *CommentReq) validate(all bool) error { +func (m *AddCommentRsp) validate(all bool) error { if m == nil { return nil } @@ -1491,7 +1569,7 @@ func (m *CommentReq) validate(all bool) error { var errors []error if m.GetId() <= 0 { - err := CommentReqValidationError{ + err := AddCommentRspValidationError{ field: "Id", reason: "value must be greater than 0", } @@ -1502,18 +1580,19 @@ func (m *CommentReq) validate(all bool) error { } if len(errors) > 0 { - return CommentReqMultiError(errors) + return AddCommentRspMultiError(errors) } return nil } -// CommentReqMultiError is an error wrapping multiple validation errors -// returned by CommentReq.ValidateAll() if the designated constraints aren't met. -type CommentReqMultiError []error +// AddCommentRspMultiError is an error wrapping multiple validation errors +// returned by AddCommentRsp.ValidateAll() if the designated constraints +// aren't met. +type AddCommentRspMultiError []error // Error returns a concatenation of all the error messages it wraps. -func (m CommentReqMultiError) Error() string { +func (m AddCommentRspMultiError) Error() string { var msgs []string for _, err := range m { msgs = append(msgs, err.Error()) @@ -1522,11 +1601,11 @@ func (m CommentReqMultiError) Error() string { } // AllErrors returns a list of validation violation errors. -func (m CommentReqMultiError) AllErrors() []error { return m } +func (m AddCommentRspMultiError) AllErrors() []error { return m } -// CommentReqValidationError is the validation error returned by -// CommentReq.Validate if the designated constraints aren't met. -type CommentReqValidationError struct { +// AddCommentRspValidationError is the validation error returned by +// AddCommentRsp.Validate if the designated constraints aren't met. +type AddCommentRspValidationError struct { field string reason string cause error @@ -1534,22 +1613,22 @@ type CommentReqValidationError struct { } // Field function returns field value. -func (e CommentReqValidationError) Field() string { return e.field } +func (e AddCommentRspValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e CommentReqValidationError) Reason() string { return e.reason } +func (e AddCommentRspValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e CommentReqValidationError) Cause() error { return e.cause } +func (e AddCommentRspValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e CommentReqValidationError) Key() bool { return e.key } +func (e AddCommentRspValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e CommentReqValidationError) ErrorName() string { return "CommentReqValidationError" } +func (e AddCommentRspValidationError) ErrorName() string { return "AddCommentRspValidationError" } // Error satisfies the builtin error interface -func (e CommentReqValidationError) Error() string { +func (e AddCommentRspValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -1561,14 +1640,14 @@ func (e CommentReqValidationError) Error() string { } return fmt.Sprintf( - "invalid %sCommentReq.%s: %s%s", + "invalid %sAddCommentRsp.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = CommentReqValidationError{} +var _ error = AddCommentRspValidationError{} var _ interface { Field() string @@ -1576,4 +1655,516 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = CommentReqValidationError{} +} = AddCommentRspValidationError{} + +// Validate checks the field values on AddPackageReq with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *AddPackageReq) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on AddPackageReq with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in AddPackageReqMultiError, or +// nil if none found. +func (m *AddPackageReq) ValidateAll() error { + return m.validate(true) +} + +func (m *AddPackageReq) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if m.GetName() == nil { + err := AddPackageReqValidationError{ + field: "Name", + reason: "value is required", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetName()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, AddPackageReqValidationError{ + field: "Name", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, AddPackageReqValidationError{ + field: "Name", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetName()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return AddPackageReqValidationError{ + field: "Name", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if m.GetUrl() == nil { + err := AddPackageReqValidationError{ + field: "Url", + reason: "value is required", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetUrl()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, AddPackageReqValidationError{ + field: "Url", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, AddPackageReqValidationError{ + field: "Url", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetUrl()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return AddPackageReqValidationError{ + field: "Url", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return AddPackageReqMultiError(errors) + } + + return nil +} + +// AddPackageReqMultiError is an error wrapping multiple validation errors +// returned by AddPackageReq.ValidateAll() if the designated constraints +// aren't met. +type AddPackageReqMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m AddPackageReqMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m AddPackageReqMultiError) AllErrors() []error { return m } + +// AddPackageReqValidationError is the validation error returned by +// AddPackageReq.Validate if the designated constraints aren't met. +type AddPackageReqValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e AddPackageReqValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e AddPackageReqValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e AddPackageReqValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e AddPackageReqValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e AddPackageReqValidationError) ErrorName() string { return "AddPackageReqValidationError" } + +// Error satisfies the builtin error interface +func (e AddPackageReqValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sAddPackageReq.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = AddPackageReqValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = AddPackageReqValidationError{} + +// Validate checks the field values on AddPackageRsp with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *AddPackageRsp) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on AddPackageRsp with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in AddPackageRspMultiError, or +// nil if none found. +func (m *AddPackageRsp) ValidateAll() error { + return m.validate(true) +} + +func (m *AddPackageRsp) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(errors) > 0 { + return AddPackageRspMultiError(errors) + } + + return nil +} + +// AddPackageRspMultiError is an error wrapping multiple validation errors +// returned by AddPackageRsp.ValidateAll() if the designated constraints +// aren't met. +type AddPackageRspMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m AddPackageRspMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m AddPackageRspMultiError) AllErrors() []error { return m } + +// AddPackageRspValidationError is the validation error returned by +// AddPackageRsp.Validate if the designated constraints aren't met. +type AddPackageRspValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e AddPackageRspValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e AddPackageRspValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e AddPackageRspValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e AddPackageRspValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e AddPackageRspValidationError) ErrorName() string { return "AddPackageRspValidationError" } + +// Error satisfies the builtin error interface +func (e AddPackageRspValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sAddPackageRsp.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = AddPackageRspValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = AddPackageRspValidationError{} + +// Validate checks the field values on GetModuleReq with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *GetModuleReq) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on GetModuleReq with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in GetModuleReqMultiError, or +// nil if none found. +func (m *GetModuleReq) ValidateAll() error { + return m.validate(true) +} + +func (m *GetModuleReq) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(errors) > 0 { + return GetModuleReqMultiError(errors) + } + + return nil +} + +// GetModuleReqMultiError is an error wrapping multiple validation errors +// returned by GetModuleReq.ValidateAll() if the designated constraints aren't met. +type GetModuleReqMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m GetModuleReqMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m GetModuleReqMultiError) AllErrors() []error { return m } + +// GetModuleReqValidationError is the validation error returned by +// GetModuleReq.Validate if the designated constraints aren't met. +type GetModuleReqValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e GetModuleReqValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e GetModuleReqValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e GetModuleReqValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e GetModuleReqValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e GetModuleReqValidationError) ErrorName() string { return "GetModuleReqValidationError" } + +// Error satisfies the builtin error interface +func (e GetModuleReqValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sGetModuleReq.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = GetModuleReqValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = GetModuleReqValidationError{} + +// Validate checks the field values on GetModuleRsp with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *GetModuleRsp) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on GetModuleRsp with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in GetModuleRspMultiError, or +// nil if none found. +func (m *GetModuleRsp) ValidateAll() error { + return m.validate(true) +} + +func (m *GetModuleRsp) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + for idx, item := range m.GetModules() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, GetModuleRspValidationError{ + field: fmt.Sprintf("Modules[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, GetModuleRspValidationError{ + field: fmt.Sprintf("Modules[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return GetModuleRspValidationError{ + field: fmt.Sprintf("Modules[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return GetModuleRspMultiError(errors) + } + + return nil +} + +// GetModuleRspMultiError is an error wrapping multiple validation errors +// returned by GetModuleRsp.ValidateAll() if the designated constraints aren't met. +type GetModuleRspMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m GetModuleRspMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m GetModuleRspMultiError) AllErrors() []error { return m } + +// GetModuleRspValidationError is the validation error returned by +// GetModuleRsp.Validate if the designated constraints aren't met. +type GetModuleRspValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e GetModuleRspValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e GetModuleRspValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e GetModuleRspValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e GetModuleRspValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e GetModuleRspValidationError) ErrorName() string { return "GetModuleRspValidationError" } + +// Error satisfies the builtin error interface +func (e GetModuleRspValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sGetModuleRsp.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = GetModuleRspValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = GetModuleRspValidationError{} diff --git a/proto/micro/dashboard_micro.pb.go b/proto/micro/dashboard_micro.pb.go index 5d3c19c..2d09b9d 100644 --- a/proto/micro/dashboard_micro.pb.go +++ b/proto/micro/dashboard_micro.pb.go @@ -22,12 +22,16 @@ var ( type DashboardServiceClient interface { ListPackage(ctx context.Context, req *go_generate.ListPackageReq, opts ...client.CallOption) (*go_generate.ListPackageRsp, error) - UpdateInfo(ctx context.Context, req *go_generate.UpdateInfoPackageRsp, opts ...client.CallOption) (*go_generate.UpdateInfoPackageReq, error) - AddComment(ctx context.Context, req *go_generate.CommentRsp, opts ...client.CallOption) (*go_generate.CommentReq, error) + UpdatePackage(ctx context.Context, req *go_generate.UpdatePackageReq, opts ...client.CallOption) (*go_generate.UpdatePackageRsp, error) + AddComment(ctx context.Context, req *go_generate.AddCommentReq, opts ...client.CallOption) (*go_generate.AddCommentRsp, error) + AddPackage(ctx context.Context, req *go_generate.AddPackageReq, opts ...client.CallOption) (*go_generate.AddPackageRsp, error) + GetModule(ctx context.Context, req *go_generate.GetModuleReq, opts ...client.CallOption) (*go_generate.GetModuleRsp, error) } type DashboardServiceServer interface { ListPackage(ctx context.Context, req *go_generate.ListPackageReq, rsp *go_generate.ListPackageRsp) error - UpdateInfo(ctx context.Context, req *go_generate.UpdateInfoPackageRsp, rsp *go_generate.UpdateInfoPackageReq) error - AddComment(ctx context.Context, req *go_generate.CommentRsp, rsp *go_generate.CommentReq) error + UpdatePackage(ctx context.Context, req *go_generate.UpdatePackageReq, rsp *go_generate.UpdatePackageRsp) error + AddComment(ctx context.Context, req *go_generate.AddCommentReq, rsp *go_generate.AddCommentRsp) error + AddPackage(ctx context.Context, req *go_generate.AddPackageReq, rsp *go_generate.AddPackageRsp) error + GetModule(ctx context.Context, req *go_generate.GetModuleReq, rsp *go_generate.GetModuleRsp) error } diff --git a/proto/micro/dashboard_micro_http.pb.go b/proto/micro/dashboard_micro_http.pb.go index 91d7e05..769cc56 100644 --- a/proto/micro/dashboard_micro_http.pb.go +++ b/proto/micro/dashboard_micro_http.pb.go @@ -31,17 +31,17 @@ func (c *dashboardServiceClient) ListPackage(ctx context.Context, req *go_genera return rsp, nil } -func (c *dashboardServiceClient) UpdateInfo(ctx context.Context, req *go_generate.UpdateInfoPackageRsp, opts ...client.CallOption) (*go_generate.UpdateInfoPackageReq, error) { - rsp := &go_generate.UpdateInfoPackageReq{} - err := c.c.Call(ctx, c.c.NewRequest(c.name, "DashboardService.UpdateInfo", req), rsp, opts...) +func (c *dashboardServiceClient) UpdatePackage(ctx context.Context, req *go_generate.UpdatePackageReq, opts ...client.CallOption) (*go_generate.UpdatePackageRsp, error) { + rsp := &go_generate.UpdatePackageRsp{} + err := c.c.Call(ctx, c.c.NewRequest(c.name, "DashboardService.UpdatePackage", req), rsp, opts...) if err != nil { return nil, err } return rsp, nil } -func (c *dashboardServiceClient) AddComment(ctx context.Context, req *go_generate.CommentRsp, opts ...client.CallOption) (*go_generate.CommentReq, error) { - rsp := &go_generate.CommentReq{} +func (c *dashboardServiceClient) AddComment(ctx context.Context, req *go_generate.AddCommentReq, opts ...client.CallOption) (*go_generate.AddCommentRsp, error) { + rsp := &go_generate.AddCommentRsp{} err := c.c.Call(ctx, c.c.NewRequest(c.name, "DashboardService.AddComment", req), rsp, opts...) if err != nil { return nil, err @@ -49,6 +49,24 @@ func (c *dashboardServiceClient) AddComment(ctx context.Context, req *go_generat return rsp, nil } +func (c *dashboardServiceClient) AddPackage(ctx context.Context, req *go_generate.AddPackageReq, opts ...client.CallOption) (*go_generate.AddPackageRsp, error) { + rsp := &go_generate.AddPackageRsp{} + err := c.c.Call(ctx, c.c.NewRequest(c.name, "DashboardService.AddPackage", req), rsp, opts...) + if err != nil { + return nil, err + } + return rsp, nil +} + +func (c *dashboardServiceClient) GetModule(ctx context.Context, req *go_generate.GetModuleReq, opts ...client.CallOption) (*go_generate.GetModuleRsp, error) { + rsp := &go_generate.GetModuleRsp{} + err := c.c.Call(ctx, c.c.NewRequest(c.name, "DashboardService.GetModule", req), rsp, opts...) + if err != nil { + return nil, err + } + return rsp, nil +} + type dashboardServiceServer struct { DashboardServiceServer } @@ -57,19 +75,29 @@ func (h *dashboardServiceServer) ListPackage(ctx context.Context, req *go_genera return h.DashboardServiceServer.ListPackage(ctx, req, rsp) } -func (h *dashboardServiceServer) UpdateInfo(ctx context.Context, req *go_generate.UpdateInfoPackageRsp, rsp *go_generate.UpdateInfoPackageReq) error { - return h.DashboardServiceServer.UpdateInfo(ctx, req, rsp) +func (h *dashboardServiceServer) UpdatePackage(ctx context.Context, req *go_generate.UpdatePackageReq, rsp *go_generate.UpdatePackageRsp) error { + return h.DashboardServiceServer.UpdatePackage(ctx, req, rsp) } -func (h *dashboardServiceServer) AddComment(ctx context.Context, req *go_generate.CommentRsp, rsp *go_generate.CommentReq) error { +func (h *dashboardServiceServer) AddComment(ctx context.Context, req *go_generate.AddCommentReq, rsp *go_generate.AddCommentRsp) error { return h.DashboardServiceServer.AddComment(ctx, req, rsp) } +func (h *dashboardServiceServer) AddPackage(ctx context.Context, req *go_generate.AddPackageReq, rsp *go_generate.AddPackageRsp) error { + return h.DashboardServiceServer.AddPackage(ctx, req, rsp) +} + +func (h *dashboardServiceServer) GetModule(ctx context.Context, req *go_generate.GetModuleReq, rsp *go_generate.GetModuleRsp) error { + return h.DashboardServiceServer.GetModule(ctx, req, rsp) +} + func RegisterDashboardServiceServer(s server.Server, sh DashboardServiceServer, opts ...server.HandlerOption) error { type dashboardService interface { ListPackage(ctx context.Context, req *go_generate.ListPackageReq, rsp *go_generate.ListPackageRsp) error - UpdateInfo(ctx context.Context, req *go_generate.UpdateInfoPackageRsp, rsp *go_generate.UpdateInfoPackageReq) error - AddComment(ctx context.Context, req *go_generate.CommentRsp, rsp *go_generate.CommentReq) error + UpdatePackage(ctx context.Context, req *go_generate.UpdatePackageReq, rsp *go_generate.UpdatePackageRsp) error + AddComment(ctx context.Context, req *go_generate.AddCommentReq, rsp *go_generate.AddCommentRsp) error + AddPackage(ctx context.Context, req *go_generate.AddPackageReq, rsp *go_generate.AddPackageRsp) error + GetModule(ctx context.Context, req *go_generate.GetModuleReq, rsp *go_generate.GetModuleRsp) error } type DashboardService struct { dashboardService diff --git a/service/client_git/client.go b/service/client_git/client.go new file mode 100644 index 0000000..de49bdc --- /dev/null +++ b/service/client_git/client.go @@ -0,0 +1,218 @@ +package client_git + +import ( + "context" + "fmt" + "github.com/pkg/errors" + "go.unistack.org/unistack-org/pkgdash/internal" + "go.unistack.org/unistack-org/pkgdash/models" + "io" + "net/url" + "os" + "sort" + "strings" + + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing/filemode" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/storage/memory" + "go.unistack.org/micro/v3/logger" + pb "go.unistack.org/unistack-org/pkgdash/proto/go_generate" + "go.unistack.org/unistack-org/pkgdash/storage" + "golang.org/x/mod/modfile" + "golang.org/x/mod/module" +) + +type Client interface { + Run(ctx context.Context, st storage.Storage) chan *pb.AddPackageReq + IsClose() bool + Done() <-chan struct{} +} + +type client struct { + worker chan *pb.AddPackageReq + closed bool + lock chan struct{} +} + +func NewClient(cap uint) Client { + return &client{ + make(chan *pb.AddPackageReq, cap), + false, + make(chan struct{}), + } +} + +func (c *client) Run(ctx context.Context, st storage.Storage) chan *pb.AddPackageReq { + go func() { + defer close(c.worker) + for { + select { + case data := <-c.worker: + go func() { + runner(ctx, st, data) + }() + case <-ctx.Done(): + logger.Info(ctx, ctx.Err()) + return + } + } + }() + + return c.worker +} + +func (c *client) IsClose() bool { + return c.closed +} + +// Done for locked goroutine +func (c *client) Done() <-chan struct{} { + return c.lock +} + +func runner(ctx context.Context, st storage.Storage, req *pb.AddPackageReq) { + modules, err := getGoModule(ctx, req.Url.Value) + if err != nil { + logger.Error(ctx, err) + return + } + + logger.Infof(ctx, "success get list mod", modules) + + if req.Modules, err = st.InsertButchModules(ctx, modules); err != nil { + logger.Error(ctx, err) + return + } + + if err = st.AddPackage(ctx, req); err != nil { + logger.Error(ctx, err) + } +} + +func getGoModule(ctx context.Context, gitUrl string) ([]models.Module, error) { + u, err := url.Parse(gitUrl) + if err != nil { + logger.Fatal(ctx, err) + } + + var rev string + if idx := strings.Index(u.Path, "@"); idx > 0 { + rev = u.Path[idx+1:] + } + + cloneOpts := &git.CloneOptions{ + URL: gitUrl, + Progress: os.Stdout, + } + + if len(rev) == 0 { + cloneOpts.SingleBranch = true + cloneOpts.Depth = 1 + } + + if err = cloneOpts.Validate(); err != nil { + return nil, err + } + + repo, err := git.CloneContext(ctx, memory.NewStorage(), nil, cloneOpts) + if err != nil { + return nil, err + } + + ref, err := repo.Head() + if err != nil { + return nil, fmt.Errorf("failed to get head: %v", err) + } + + commit, err := repo.CommitObject(ref.Hash()) + if err != nil { + return nil, fmt.Errorf("failed to get commit: %v", err) + } + + tree, err := commit.Tree() + if err != nil { + return nil, err + } + + unique := make(map[string]models.Module) + var mvs []module.Version + err = tree.Files().ForEach(func(file *object.File) error { + if file == nil { + err = errors.New("file pointer is nil") + logger.Error(ctx, err) + return err + } + + switch file.Mode { + case filemode.Regular: + if strings.HasSuffix(file.Name, "go.mod") { + if mvs, err = Direct(file); err != nil { + return err + } + for i := range mvs { + unique[mvs[i].Path] = models.Module{ + Name: mvs[i].Path, + Version: mvs[i].Version, + LastVersion: mvs[i].Version, + } + } + internal.Updates(internal.UpdateOptions{ + Pre: false, + Major: false, + Cached: false, + Modules: mvs, + OnUpdate: func(u internal.Update) { + if u.Err != nil { + logger.Errorf(ctx, "%s: failed: %v\n", u.Module.Path, u.Err) + } else { + val := unique[u.Module.Path] + val.LastVersion = u.Version + unique[u.Module.Path] = val + } + }, + }) + } + } + return nil + }) + + result := make([]models.Module, 0, len(unique)) + for _, v := range unique { + result = append(result, v) + } + + sort.Slice(result, func(i, j int) bool { + return result[i].Name < result[j].Name + }) + + return result, err +} + +func Direct(file *object.File) ([]module.Version, error) { + r, err := file.Reader() + if err != nil { + return nil, err + } + defer r.Close() + data, err := io.ReadAll(r) + if err != nil { + return nil, err + } + modfile, err := modfile.ParseLax("go.mod", data, nil) + if err != nil { + return nil, err + } + var mods []module.Version + for _, req := range modfile.Require { + // if !req.Indirect { + mods = append(mods, req.Mod) + //} + } + /* + sort.Slice(mods, func(i, j int) bool { + return mods[i].Path < mods[j].Path + }) + */ + return mods, nil +} diff --git a/service/client_git/client_test.go b/service/client_git/client_test.go new file mode 100644 index 0000000..a779ad5 --- /dev/null +++ b/service/client_git/client_test.go @@ -0,0 +1,86 @@ +package client_git + +import ( + "context" + "database/sql" + "fmt" + pb "go.unistack.org/unistack-org/pkgdash/proto/go_generate" + "go.unistack.org/unistack-org/pkgdash/storage" + "go.unistack.org/unistack-org/pkgdash/storage/postgres" + "go.unistack.org/unistack-org/pkgdash/storage/sqlite" + "google.golang.org/protobuf/types/known/wrapperspb" + "testing" +) + +func TestClientPG(t *testing.T) { + dsn := fmt.Sprintf("user=%s password=%s host=%s port=%s dbname=%s sslmode=disable", "test", "123", "localhost", "5432", "postgres") + conn, err := sql.Open("postgres", dsn) + if err != nil { + t.Fatal(err) + } + defer conn.Close() + if err = conn.Ping(); err != nil { + t.Fatal(err) + } + + st, err := postgres.NewStorage(conn) + if err != nil { + t.Fatal(err) + } + + s, ok := st.(storage.Storage) + if !ok { + t.Fatal("typecast error") + } + + ctx, cancel := context.WithCancel(context.Background()) + _ = cancel + cli := NewClient(1) + + ch := cli.Run(ctx, s) + + data := &pb.AddPackageReq{ + Name: wrapperspb.String("test"), + Url: wrapperspb.String("https://github.com/dantedenis/service_history.git"), + } + + ch <- data + + <-cli.Done() +} + +func TestClientLite(t *testing.T) { + conn, err := sql.Open("sqlite3", "../../identifier.sqlite") + if err != nil { + t.Fatal(err) + } + defer conn.Close() + if err = conn.Ping(); err != nil { + t.Fatal(err) + } + + st, err := sqlite.NewStorage(conn) + if err != nil { + t.Fatal(err) + } + + s, ok := st.(storage.Storage) + if !ok { + t.Fatal("typecast error") + } + + ctx, cancel := context.WithCancel(context.Background()) + _ = cancel + cli := NewClient(1) + + ch := cli.Run(ctx, s) + + data := &pb.AddPackageReq{ + Name: wrapperspb.String("test"), + Url: wrapperspb.String("https://github.com/dantedenis/service_history.git"), + } + + ch <- data + + <-cli.Done() +} diff --git a/service/service.go b/service/service.go index d3f527b..8b8fb75 100644 --- a/service/service.go +++ b/service/service.go @@ -6,13 +6,13 @@ import ( intcfg "go.unistack.org/unistack-org/pkgdash/config" "go.unistack.org/unistack-org/pkgdash/handler" "go.unistack.org/unistack-org/pkgdash/handler/encoders" + "go.unistack.org/unistack-org/pkgdash/service/client_git" "net/http" //pbmicro "go.unistack.org/unistack-org/pkgdash/proto/micro" "go.unistack.org/unistack-org/pkgdash/storage" cmsservice "go.unistack.org/cms-service" - grpcsrv "go.unistack.org/micro-server-grpc/v3" "go.unistack.org/micro/v3" "go.unistack.org/micro/v3/config" "go.unistack.org/micro/v3/logger" @@ -43,12 +43,7 @@ func NewService(ctx context.Context) (micro.Service, error) { router = microuter.NewRouter() } - mgsrv := grpcsrv.NewServer( - server.Register(reg), - ) - svc := micro.NewService( - micro.Server(mgsrv), micro.Register(reg), micro.Router(router), micro.Config(cs...), @@ -59,28 +54,28 @@ func NewService(ctx context.Context) (micro.Service, error) { logger.Fatalf(ctx, "failed init writer: %v", err) } - h := handler.NewHandler(svc, writer) + h := handler.NewHandler(svc, writer, client_git.NewClient(5)) - if err := svc.Init( + if err = svc.Init( micro.AfterStart(func(_ context.Context) error { return h.Init(svc.Options().Context) }), micro.BeforeStart(func(ctx context.Context) error { - if err := config.Load(ctx, cs, config.LoadOverride(true)); err != nil { + if err = config.Load(ctx, cs, config.LoadOverride(true)); err != nil { return err } - if err := config.Validate(ctx, cfg); err != nil { + if err = config.Validate(ctx, cfg); err != nil { return err } - if err := svc.Init( + if err = svc.Init( micro.Name(cfg.Service.Name), micro.Version(cfg.Service.Version), ); err != nil { return err } - if err := svc.Server("http").Init( + if err = svc.Server("http").Init( server.Address(cfg.App.Address), server.Name(cfg.Service.Name), server.Version(cfg.Service.Version), @@ -133,9 +128,11 @@ func NewService(ctx context.Context) (micro.Service, error) { mux := http.NewServeMux() - mux.HandleFunc("/listPackage", h.ListPackage) - mux.HandleFunc("/updateInfo", h.UpdateInfo) - mux.HandleFunc("/addComment", h.AddComment) + mux.HandleFunc("/listPackage", handler.Methods(http.MethodGet, h.ListPackage)) + mux.HandleFunc("/updatePackage", handler.Methods(http.MethodPost, h.UpdatePackage)) + mux.HandleFunc("/addComment", handler.Methods(http.MethodPut, h.AddComment)) + mux.HandleFunc("/addPackage", handler.Methods(http.MethodPost, h.AddPackage)) + mux.HandleFunc("/getModule", handler.Methods(http.MethodGet, h.GetModule)) if err = svc.Server().Handle(svc.Server().NewHandler(mux)); err != nil { logger.Fatalf(ctx, "failed to register handler: %v", err) diff --git a/storage/migrations/postgres/000001_init_schema.up.sql b/storage/migrations/postgres/000001_init_schema.up.sql index 02c4ecc..2e7fdd1 100644 --- a/storage/migrations/postgres/000001_init_schema.up.sql +++ b/storage/migrations/postgres/000001_init_schema.up.sql @@ -1,12 +1,12 @@ create table if not exists dashboard ( id serial not null unique primary key , - "uniq_id" uuid not null unique default gen_random_uuid() , - package integer + "uuid" uuid not null unique default gen_random_uuid() , + package integer[] default '{}'::integer[] ); create table if not exists comment ( id serial not null unique primary key , - text text , + "text" text , created timestamp not null default current_timestamp , updated timestamp ); @@ -14,13 +14,14 @@ create table if not exists comment ( create table if not exists module ( id serial not null unique primary key , name varchar not null , - version varchar not null + version varchar not null , + last_version varchar not null ); create table if not exists issue ( id serial not null unique primary key , --package integer references package(id) , - modules integer[] , + modules integer[] default '{}'::integer[], status integer default 0 , "desc" varchar ); @@ -29,9 +30,10 @@ create table if not exists package ( id serial not null unique primary key , name varchar not null , url varchar , - modules integer[] , - issues integer[] , - comments integer[] + modules integer[] default '{}'::integer[], + issues integer[] default '{}'::integer[], + comments integer[] default '{}'::integer[] ); +create unique index module_info on module(name, version); diff --git a/storage/migrations/sqlite/000001_init_schema.down.sql b/storage/migrations/sqlite/000001_init_schema.down.sql new file mode 100644 index 0000000..b9ce01f --- /dev/null +++ b/storage/migrations/sqlite/000001_init_schema.down.sql @@ -0,0 +1,5 @@ +drop table if exists dashboard ; +drop table if exists package ; +drop table if exists module ; +drop table if exists issue ; +drop table if exists comment; \ No newline at end of file diff --git a/storage/migrations/sqlite/000001_init_schema.up.sql b/storage/migrations/sqlite/000001_init_schema.up.sql new file mode 100644 index 0000000..8893211 --- /dev/null +++ b/storage/migrations/sqlite/000001_init_schema.up.sql @@ -0,0 +1,38 @@ +create table if not exists dashboard ( + id integer primary key autoincrement not null , + "uuid" uuid not null unique , + package integer[] default '{}' +); + +create table if not exists comment ( + id integer primary key autoincrement not null , + "text" text , + created timestamp not null default current_timestamp , + updated timestamp +); + +create table if not exists module ( + id integer primary key autoincrement not null , + name varchar not null , + version varchar not null , + last_version varchar not null +); + +create table if not exists issue ( + id serial not null unique primary key , + --package integer references package(id) , + modules integer[] default '[]', + status integer default 0 , + "desc" varchar +); + +create table if not exists package ( + id integer primary key autoincrement not null , + name varchar not null , + url varchar , + modules integer[] default '[]', + issues integer[] default '[]', + comments integer[] default '[]' +); + + diff --git a/storage/postgres/quries.go b/storage/postgres/quries.go index accfcad..aa0e3c8 100644 --- a/storage/postgres/quries.go +++ b/storage/postgres/quries.go @@ -2,6 +2,27 @@ package postgres const ( queryListPackage = ` -select * from package; +select + id, + name, + url, + comments + --modules, + --issues, + from package; +` + queryAddComment = ` +with insert_comm as ( + insert into comment(text) values ($1) returning id +) +update package set comments = array_append(comments, (select * from insert_comm)) where id=$2; +` + queryAddPackage = ` +insert into package(name, url, modules) values ($1, $2, $3); +` + queryInsMsgGetIDs = ` +insert into module(name, version, last_version) values +%s +returning id; ` ) diff --git a/storage/postgres/storage.go b/storage/postgres/storage.go index dfe5875..ad50e56 100644 --- a/storage/postgres/storage.go +++ b/storage/postgres/storage.go @@ -1,14 +1,21 @@ package postgres import ( + "context" "database/sql" "embed" "errors" - "go.unistack.org/unistack-org/pkgdash/config" + "fmt" + pb "go.unistack.org/unistack-org/pkgdash/proto/go_generate" + "strings" "github.com/golang-migrate/migrate/v4" - "github.com/golang-migrate/migrate/v4/database/pgx" + mpgx "github.com/golang-migrate/migrate/v4/database/pgx" "github.com/golang-migrate/migrate/v4/source/iofs" + "github.com/lib/pq" + "go.unistack.org/micro/v3/logger" + "go.unistack.org/unistack-org/pkgdash/config" + "go.unistack.org/unistack-org/pkgdash/models" ) const ( @@ -31,8 +38,8 @@ func NewStorageFS(fs embed.FS) func(*sql.DB) (interface{}, error) { } func (s *Postgres) MigrateUp() error { - driver, err := pgx.WithInstance(s.db, &pgx.Config{ - MigrationsTable: pgx.DefaultMigrationsTable, + driver, err := mpgx.WithInstance(s.db, &mpgx.Config{ + MigrationsTable: mpgx.DefaultMigrationsTable, DatabaseName: config.ServiceName, }) if err != nil { @@ -57,8 +64,8 @@ func (s *Postgres) MigrateUp() error { } func (s *Postgres) MigrateDown() error { - driver, err := pgx.WithInstance(s.db, &pgx.Config{ - MigrationsTable: pgx.DefaultMigrationsTable, + driver, err := mpgx.WithInstance(s.db, &mpgx.Config{ + MigrationsTable: mpgx.DefaultMigrationsTable, DatabaseName: config.ServiceName, }) if err != nil { @@ -81,3 +88,150 @@ func (s *Postgres) MigrateDown() error { return nil } + +func (s *Postgres) UpdatePackage(ctx context.Context, req *pb.UpdatePackageReq) error { + panic("need implement") +} + +func (s *Postgres) ListPackage(ctx context.Context) (models.ListPackage, error) { + rows, err := s.db.QueryContext(ctx, queryListPackage) + if err != nil { + return nil, err + } + + defer func() { + if err = rows.Close(); err != nil { + return + } + err = rows.Err() + }() + + result := make([]*models.Package, 0) + for rows.Next() { + tmp := &models.Package{} + if err = rows.Scan( + &tmp.ID, + &tmp.Name, + &tmp.URL, + pq.Array(&tmp.Comments), + ); err != nil { + return nil, err + } + } + + return result, err +} + +func (s *Postgres) AddComment(ctx context.Context, req *pb.AddCommentReq) error { + tx, err := s.db.BeginTx(ctx, nil) + if err != nil { + return err + } + + defer func() { + if err != nil { + if rollbackErr := tx.Rollback(); rollbackErr != nil { + logger.Errorf(ctx, "AddComment: unable to rollback: %v", rollbackErr) + } + } else { + err = tx.Commit() + } + }() + + res, err := tx.ExecContext(ctx, queryAddComment, req.Text, req.IdPackage.Value) + if err != nil { + return err + } + + if aff, affErr := res.RowsAffected(); err != nil { + err = affErr + } else if aff == 0 { + err = errors.New("rows affected is 0") + } + + return err +} + +func (s *Postgres) AddPackage(ctx context.Context, req *pb.AddPackageReq) error { + tx, err := s.db.BeginTx(ctx, nil) + if err != nil { + return err + } + + defer func() { + if err != nil { + if rollbackErr := tx.Rollback(); rollbackErr != nil { + logger.Errorf(ctx, "AddPackage: unable to rollback: %v", rollbackErr) + } + } else { + err = tx.Commit() + } + }() + + res, err := tx.ExecContext(ctx, queryAddPackage, req.Name.Value, req.Url.Value, pq.Array(req.Modules)) + if err != nil { + return err + } + + if aff, affErr := res.RowsAffected(); err != nil { + err = affErr + } else if aff == 0 { + err = errors.New("rows affected is 0") + } + + return err +} + +func (s *Postgres) InsertButchModules(ctx context.Context, req []models.Module) ([]uint64, error) { + tx, err := s.db.BeginTx(ctx, nil) + if err != nil { + return nil, err + } + defer func() { + if err != nil { + if rollbackErr := tx.Rollback(); rollbackErr != nil { + logger.Errorf(ctx, "AddPackage: unable to rollback: %v", rollbackErr) + } + } else { + err = tx.Commit() + } + }() + + query := generateQuery(req) + + rows, err := tx.QueryContext(ctx, query) + if err != nil { + return nil, err + } + defer func() { + if err = rows.Close(); err != nil { + return + } + err = rows.Err() + }() + + result := make([]uint64, 0) + for rows.Next() { + tmp := uint64(0) + if err = rows.Scan(&tmp); err != nil { + return nil, err + } + + result = append(result, tmp) + } + + return result, err +} + +func generateQuery(rsp []models.Module) string { + const pattern = `%c('%s', '%s', '%s')` + build := strings.Builder{} + comma := ' ' + for i := range rsp { + str := fmt.Sprintf(pattern, comma, rsp[i].Name, rsp[i].Version, rsp[i].LastVersion) + build.WriteString(str) + comma = ',' + } + + return fmt.Sprintf(queryInsMsgGetIDs, build.String()) +} diff --git a/storage/postgres/storage_test.go b/storage/postgres/storage_test.go new file mode 100644 index 0000000..2fcbd67 --- /dev/null +++ b/storage/postgres/storage_test.go @@ -0,0 +1,37 @@ +package postgres + +import ( + "fmt" + "go.unistack.org/unistack-org/pkgdash/models" + "testing" +) + +func TestGenerate(t *testing.T) { + m := []models.Module{ + { + ID: 1, + Name: "test", + Version: "1.2.3", + Package: 2, + LastVersion: "23.31", + }, + { + ID: 1, + Name: "321test", + Version: "1.3", + Package: 4, + LastVersion: "2111.31", + }, + { + ID: 1, + Name: "testabcd", + Version: "1.2.3", + Package: 2, + LastVersion: "153453.31", + }, + } + + str := generateQuery(m) + + fmt.Println(str) +} diff --git a/storage/sqlite/quries.go b/storage/sqlite/quries.go new file mode 100644 index 0000000..2b6922b --- /dev/null +++ b/storage/sqlite/quries.go @@ -0,0 +1,32 @@ +package sqlite + +const ( + queryListPackage = ` +select + id, + name, + url, + comments + --modules, + --issues, + from package; +` + queryAddComment = ` +insert into comment(text) values ($1) ; +update package +set comments = json_insert(comments, '$[#]', ( select last_insert_rowid() as id from comment )) +where id = $2 ; +` + queryAddPackage = ` +insert into package(name, url, modules) values ($1, $2, $3); +` + queryInsMsgGetIDs = ` +insert into module(name, version, last_version) values +%s +returning id; +` + queryGetModule = ` +select id, name, version, last_version from module +where id in %s ; +` +) diff --git a/storage/sqlite/storage.go b/storage/sqlite/storage.go new file mode 100644 index 0000000..21bb39d --- /dev/null +++ b/storage/sqlite/storage.go @@ -0,0 +1,287 @@ +package sqlite + +import ( + "context" + "database/sql" + "embed" + "errors" + "fmt" + "strings" + + _ "github.com/mattn/go-sqlite3" + + "github.com/golang-migrate/migrate/v4" + "github.com/golang-migrate/migrate/v4/database/sqlite" + "github.com/golang-migrate/migrate/v4/source/iofs" + "github.com/lib/pq" + "go.unistack.org/micro/v3/logger" + "go.unistack.org/unistack-org/pkgdash/config" + "go.unistack.org/unistack-org/pkgdash/models" + pb "go.unistack.org/unistack-org/pkgdash/proto/go_generate" +) + +const ( + pathMigration = `migrations/sqlite` +) + +type Sqlite struct { + db *sql.DB + fs embed.FS +} + +func NewStorage(db *sql.DB) (interface{}, error) { + return &Sqlite{db: db}, nil +} + +func NewStorageFS(fs embed.FS) func(*sql.DB) (interface{}, error) { + return func(db *sql.DB) (interface{}, error) { + return &Sqlite{db: db, fs: fs}, nil + } +} + +func (s *Sqlite) MigrateUp() error { + driver, err := sqlite.WithInstance(s.db, &sqlite.Config{ + MigrationsTable: sqlite.DefaultMigrationsTable, + DatabaseName: config.ServiceName, + }) + if err != nil { + return err + } + source, err := iofs.New(s.fs, pathMigration) + if err != nil { + return err + } + + // TODO: pass own logger + m, err := migrate.NewWithInstance("fs", source, config.ServiceName, driver) + if err != nil { + return err + } + + if err = m.Up(); err != nil && !errors.Is(err, migrate.ErrNoChange) { + return err + } + + return nil +} + +func (s *Sqlite) MigrateDown() error { + driver, err := sqlite.WithInstance(s.db, &sqlite.Config{ + MigrationsTable: sqlite.DefaultMigrationsTable, + DatabaseName: config.ServiceName, + }) + if err != nil { + return err + } + source, err := iofs.New(s.fs, pathMigration) + if err != nil { + return err + } + + // TODO: pass own logger + m, err := migrate.NewWithInstance("fs", source, config.ServiceName, driver) + if err != nil { + return err + } + + if err = m.Down(); err != nil && !errors.Is(err, migrate.ErrNoChange) { + return err + } + + return nil +} + +func (s *Sqlite) UpdatePackage(ctx context.Context, req *pb.UpdatePackageReq) error { + panic("need implement") +} + +func (s *Sqlite) ListPackage(ctx context.Context) (models.ListPackage, error) { + rows, err := s.db.QueryContext(ctx, queryListPackage) + if err != nil { + return nil, err + } + + defer func() { + if err = rows.Close(); err != nil { + return + } + err = rows.Err() + }() + + result := make([]*models.Package, 0) + for rows.Next() { + tmp := &models.Package{} + if err = rows.Scan( + &tmp.ID, + &tmp.Name, + &tmp.URL, + pq.Array(&tmp.Comments), + ); err != nil { + return nil, err + } + } + + return result, err +} + +func (s *Sqlite) AddComment(ctx context.Context, req *pb.AddCommentReq) error { + tx, err := s.db.BeginTx(ctx, nil) + if err != nil { + return err + } + + defer func() { + if err != nil { + if rollbackErr := tx.Rollback(); rollbackErr != nil { + logger.Errorf(ctx, "AddComment: unable to rollback: %v", rollbackErr) + } + } else { + err = tx.Commit() + } + }() + + res, err := tx.ExecContext(ctx, queryAddComment, req.Text, req.IdPackage.Value) + if err != nil { + return err + } + + if aff, affErr := res.RowsAffected(); err != nil { + err = affErr + } else if aff == 0 { + err = errors.New("rows affected is 0") + } + + return err +} + +func (s *Sqlite) AddPackage(ctx context.Context, req *pb.AddPackageReq) error { + tx, err := s.db.BeginTx(ctx, nil) + if err != nil { + return err + } + + defer func() { + if err != nil { + if rollbackErr := tx.Rollback(); rollbackErr != nil { + logger.Errorf(ctx, "AddPackage: unable to rollback: %v", rollbackErr) + } + } else { + err = tx.Commit() + } + }() + + res, err := tx.ExecContext(ctx, queryAddPackage, req.Name.Value, req.Url.Value, pq.Array(req.Modules)) + if err != nil { + return err + } + + if aff, affErr := res.RowsAffected(); err != nil { + err = affErr + } else if aff == 0 { + err = errors.New("rows affected is 0") + } + + return err +} + +func (s *Sqlite) InsertButchModules(ctx context.Context, req []models.Module) ([]uint64, error) { + tx, err := s.db.BeginTx(ctx, nil) + if err != nil { + return nil, err + } + defer func() { + if err != nil { + if rollbackErr := tx.Rollback(); rollbackErr != nil { + logger.Errorf(ctx, "AddPackage: unable to rollback: %v", rollbackErr) + } + } else { + err = tx.Commit() + } + }() + + query := generateQuery(req) + + rows, err := tx.QueryContext(ctx, query) + if err != nil { + return nil, err + } + defer func() { + if err = rows.Close(); err != nil { + return + } + err = rows.Err() + }() + + result := make([]uint64, 0) + for rows.Next() { + tmp := uint64(0) + if err = rows.Scan(&tmp); err != nil { + return nil, err + } + + result = append(result, tmp) + } + + return result, err +} + +func (s *Sqlite) GetModule(ctx context.Context, req *pb.GetModuleReq) (result models.ListModule, err error) { + query := "" + if len(req.Id) < 1 { + query = fmt.Sprintf(queryGetModule, "() or 1=1") + } else { + query = fmt.Sprintf(queryGetModule, generateArrayIneq(len(req.Id))) + } + + rows, err := s.db.QueryContext(ctx, query, convertSliceUInt(req.Id...)...) + if err != nil { + return nil, err + } + defer func() { + if err = rows.Close(); err != nil { + return + } + err = rows.Err() + }() + + for rows.Next() { + tmp := &models.Module{} + if err = rows.Scan( + &tmp.ID, + &tmp.Name, + &tmp.Version, + &tmp.LastVersion, + ); err != nil { + return nil, err + } + + result = append(result, tmp) + } + + return result, err +} + +func convertSliceUInt(arg ...uint64) []interface{} { + result := make([]interface{}, 0, len(arg)) + for i := range arg { + result = append(result, arg[i]) + } + return result +} + +func generateQuery(rsp []models.Module) string { + const pattern = `%c('%s', '%s', '%s')` + build := strings.Builder{} + comma := ' ' + for i := range rsp { + str := fmt.Sprintf(pattern, comma, rsp[i].Name, rsp[i].Version, rsp[i].LastVersion) + build.WriteString(str) + comma = ',' + } + + return fmt.Sprintf(queryInsMsgGetIDs, build.String()) +} + +func generateArrayIneq(count int) string { + return "(?" + strings.Repeat(",?", count-1) + ")" +} diff --git a/storage/storage.go b/storage/storage.go index 9328115..188562d 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -5,7 +5,9 @@ import ( "database/sql" "embed" "go.unistack.org/unistack-org/pkgdash/models" + pb "go.unistack.org/unistack-org/pkgdash/proto/go_generate" "go.unistack.org/unistack-org/pkgdash/storage/postgres" + "go.unistack.org/unistack-org/pkgdash/storage/sqlite" cmsstorage "go.unistack.org/cms-service/storage" ) @@ -19,12 +21,18 @@ var ( func init() { storages.RegisterStorage("postgres", postgres.NewStorageFS(fs)) + storages.RegisterStorage("sqlite", sqlite.NewStorageFS(fs)) } type Storage interface { cmsstorage.Migrator - List(ctx context.Context) ([]*models.Package, error) + ListPackage(ctx context.Context) (models.ListPackage, error) + UpdatePackage(ctx context.Context, req *pb.UpdatePackageReq) error + AddComment(ctx context.Context, req *pb.AddCommentReq) error + AddPackage(ctx context.Context, req *pb.AddPackageReq) error + InsertButchModules(ctx context.Context, req []models.Module) ([]uint64, error) + GetModule(ctx context.Context, req *pb.GetModuleReq) (models.ListModule, error) } func NewStorage(name string, db *sql.DB) (interface{}, error) { diff --git a/storage/storage_test.go b/storage/storage_test.go new file mode 100644 index 0000000..8e5f91f --- /dev/null +++ b/storage/storage_test.go @@ -0,0 +1,42 @@ +package storage + +import ( + "context" + "database/sql" + "fmt" + pb "go.unistack.org/unistack-org/pkgdash/proto/go_generate" + "go.unistack.org/unistack-org/pkgdash/storage/sqlite" + "testing" +) + +func TestGetModule(t *testing.T) { + conn, err := sql.Open("sqlite3", "/Users/devstigneev_local/GolandProjects/unistack/pkgdash/identifier.sqlite") + if err != nil { + t.Fatal(err) + } + defer conn.Close() + if err = conn.Ping(); err != nil { + t.Fatal(err) + } + + st, err := sqlite.NewStorage(conn) + if err != nil { + t.Fatal(err) + } + + s, ok := st.(Storage) + if !ok { + t.Fatal("typecast error") + } + + req := &pb.GetModuleReq{ + Id: []uint64{1, 2, 5, 40}, + } + + module, err := s.GetModule(context.Background(), req) + if err != nil { + t.Fatal(err) + } + + fmt.Println(module) +}