From 81d7aa23662cb870b5db7ae33277988ca9094c0b Mon Sep 17 00:00:00 2001 From: Vyacheslav1557 Date: Sun, 2 Mar 2025 00:29:31 +0500 Subject: [PATCH] feat(tester): extend GetContestResponse --- config/config.go | 1 + go.mod | 48 ++++-- go.sum | 151 +++++++++++++--- internal/interceptors/interceptors.go | 143 ---------------- internal/models/problem.go | 24 +-- internal/models/session.go | 162 ++++++++++++++++++ internal/models/solution.go | 26 +-- internal/models/task.go | 30 +++- internal/tester/delivery/rest/handlers.go | 63 +++++-- internal/tester/delivery/rest/middlewares.go | 71 ++++++++ internal/tester/pg_repository.go | 1 + .../repository/pg_contests_repository.go | 34 +++- .../repository/pg_problems_repository.go | 11 +- internal/tester/usecase.go | 1 + internal/tester/usecase/contests_usecase.go | 4 + main.go | 5 +- proto | 2 +- 17 files changed, 539 insertions(+), 238 deletions(-) delete mode 100644 internal/interceptors/interceptors.go create mode 100644 internal/models/session.go create mode 100644 internal/tester/delivery/rest/middlewares.go diff --git a/config/config.go b/config/config.go index 081a0bf..f26eb34 100644 --- a/config/config.go +++ b/config/config.go @@ -5,6 +5,7 @@ type Config struct { //Pandoc string `env:"PANDOC" required:"true"` Address string `env:"ADDRESS" required:"true"` PostgresDSN string `env:"POSTGRES_DSN" required:"true"` + JWTSecret string `env:"JWT_SECRET" required:"true"` //RabbitDSN string `env:"RABBIT_DSN" required:"true"` //InstanceName string `env:"INSTANCE_NAME" required:"true"` diff --git a/go.mod b/go.mod index 53a9986..7e379c4 100644 --- a/go.mod +++ b/go.mod @@ -1,45 +1,69 @@ module git.sch9.ru/new_gate/ms-tester -go 1.22.0 +go 1.23.6 require ( github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/gofiber/fiber/v2 v2.52.6 + github.com/golang-jwt/jwt/v4 v4.5.1 + github.com/google/uuid v1.6.0 github.com/ilyakaznacheev/cleanenv v1.5.0 github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438 github.com/oapi-codegen/runtime v1.1.1 + github.com/open-policy-agent/opa v1.2.0 github.com/rabbitmq/amqp091-go v1.10.0 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 github.com/valkey-io/valkey-go v1.0.47 go.uber.org/zap v1.27.0 - google.golang.org/protobuf v1.35.1 ) require ( + github.com/agnivade/levenshtein v1.2.1 // indirect github.com/andybalholm/brotli v1.1.0 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/google/uuid v1.6.0 // indirect + github.com/go-ini/ini v1.67.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/gorilla/mux v1.8.1 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect - github.com/klauspost/compress v1.17.9 // indirect - github.com/kr/pretty v0.3.1 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.21.0 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.62.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/tchap/go-patricia/v2 v2.3.2 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.51.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/yashtewari/glob-intersection v0.2.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/otel v1.34.0 // indirect + go.opentelemetry.io/otel/metric v1.34.0 // indirect + go.opentelemetry.io/otel/sdk v1.34.0 // indirect + go.opentelemetry.io/otel/trace v1.34.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.28.0 // indirect - golang.org/x/net v0.30.0 // indirect - golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.28.0 // indirect - golang.org/x/text v0.19.0 // indirect + golang.org/x/crypto v0.33.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect + google.golang.org/protobuf v1.36.3 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) require ( diff --git a/go.sum b/go.sum index 1f0207f..fc56889 100644 --- a/go.sum +++ b/go.sum @@ -6,23 +6,69 @@ github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbi github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= +github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM= +github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= +github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= +github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/bytecodealliance/wasmtime-go/v3 v3.0.2 h1:3uZCA/BLTIu+DqCfguByNMJa2HVHpXvjfy0Dy7g6fuA= +github.com/bytecodealliance/wasmtime-go/v3 v3.0.2/go.mod h1:RnUjnIXxEJcL6BgCvNyzCCRzZcxCgsZCi+RNlvYor5Q= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgraph-io/badger/v4 v4.5.1 h1:7DCIXrQjo1LKmM96YD+hLVJ2EEsyyoWxJfpdd56HLps= +github.com/dgraph-io/badger/v4 v4.5.1/go.mod h1:qn3Be0j3TfV4kPbVoK0arXCD1/nr1ftth6sbL5jxdoA= +github.com/dgraph-io/ristretto/v2 v2.1.0 h1:59LjpOJLNDULHh8MC4UaegN52lC4JnO2dITsie/Pa8I= +github.com/dgraph-io/ristretto/v2 v2.1.0/go.mod h1:uejeqfYXpUomfse0+lO+13ATz4TypQYLJZzBSAemuB4= +github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7cNTs5R6Hk4V2lcmLz2NsG2VnInyNo= +github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/foxcpp/go-mockdns v1.1.0 h1:jI0rD8M0wuYAxL7r/ynTrCQQq0BVqfB99Vgk7DlmewI= +github.com/foxcpp/go-mockdns v1.1.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld2qVbOu7Wk= +github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= +github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gofiber/fiber/v2 v2.52.6 h1:Rfp+ILPiYSvvVuIPvxrBns+HJp8qGLDnLJawAu27XVI= github.com/gofiber/fiber/v2 v2.52.6/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/google/flatbuffers v24.12.23+incompatible h1:ubBKR94NR4pXUCY/MUsRVzd9umNW7ht7EG9hHfS9FX8= +github.com/google/flatbuffers v24.12.23+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ= github.com/ilyakaznacheev/cleanenv v1.5.0 h1:0VNZXggJE2OYdXE87bfSSwGxeiGt9moSR2lOrsHHvr4= github.com/ilyakaznacheev/cleanenv v1.5.0/go.mod h1:a5aDzaJrLCQZsazHol1w8InnDcOX0OColm64SlIi6gk= github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438 h1:Dj0L5fhJ9F82ZJyVOmBx6msDp/kfd1t9GRfny/mfJA0= @@ -41,8 +87,8 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE= -github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= -github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -58,28 +104,48 @@ github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6T github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM= +github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro= github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/open-policy-agent/opa v1.2.0 h1:88NDVCM0of1eO6Z4AFeL3utTEtMuwloFmWWU7dRV1z0= +github.com/open-policy-agent/opa v1.2.0/go.mod h1:30euUmOvuBoebRCcJ7DMF42bRBOPznvt0ACUMYDUGVY= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw= github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tchap/go-patricia/v2 v2.3.2 h1:xTHFutuitO2zqKAQ5rCROYgUb7Or/+IC3fts9/Yc7nM= +github.com/tchap/go-patricia/v2 v2.3.2/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= github.com/valkey-io/valkey-go v1.0.47 h1:fW5+m2BaLAbxB1EWEEWmj+i2n+YcYFBDG/jKs6qu5j8= github.com/valkey-io/valkey-go v1.0.47/go.mod h1:BXlVAPIL9rFQinSFM+N32JfWzfCaUAqBpZkc4vPY6fM= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -88,28 +154,65 @@ github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1S github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/yashtewari/glob-intersection v0.2.0 h1:8iuHdN88yYuCzCdjt0gDe+6bAhUwBeEWqThExu54RFg= +github.com/yashtewari/glob-intersection v0.2.0/go.mod h1:LK7pIC3piUjovexikBbJ26Yml7g8xa5bsjfx2v1fwok= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= +go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= -golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= +golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f h1:gap6+3Gk41EItBuyi4XX/bp4oqJ3UwuIMl25yGinuAA= +google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:Ic02D47M+zbarjYYUlK57y316f2MoN0gjAwI3f2S95o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= +google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= +google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= @@ -118,3 +221,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= olympos.io/encoding/edn v0.0.0-20201019073823-d3554ca0b0a3 h1:slmdOY3vp8a7KQbHkL+FLbvbkgMqmXojpFUO/jENuqQ= olympos.io/encoding/edn v0.0.0-20201019073823-d3554ca0b0a3/go.mod h1:oVgVk4OWVDi43qWBEyGhXgYxt7+ED4iYNpTngSLX2Iw= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/internal/interceptors/interceptors.go b/internal/interceptors/interceptors.go deleted file mode 100644 index c0db291..0000000 --- a/internal/interceptors/interceptors.go +++ /dev/null @@ -1,143 +0,0 @@ -package interceptors - -//var defaultUser = &models.User{ -// UserId: nil, -// Role: models.RoleSpectator.AsPointer(), -// UpdatedAt: nil, -//} -// -//func extractToken(ctx context.Context) string { -// md, ok := metadata.FromIncomingContext(ctx) -// if !ok { -// return "" -// } -// tokens := md.Get("token") -// -// if len(tokens) == 0 { -// return "" -// } -// -// return tokens[0] -//} -// -//func (s *TesterServer) readSessionAndReadUser(ctx context.Context, token string) (*models.User, error) { -// // FIXME: possible bottle neck: should we cache it? (think of it in future) -// // FIXME: maybe use single connection instead of multiple requests -// userId, err := s.sessionClient.Read(ctx, &sessionv1.ReadSessionRequest{Token: token}) -// if err != nil { -// return nil, err -// } -// -// user, err := s.userService.ReadUserById(ctx, userId.GetUserId()) // FIXME: must be cached! -// if err != nil { -// if errors.Is(err, utils.ErrNotFound) { -// user = &models.User{ -// UserId: utils.AsInt32P(userId.GetUserId()), -// Role: models.RoleParticipant.AsPointer(), -// } -// err = s.userService.CreateUser(ctx, user) -// if err != nil { -// return nil, err -// } -// } else { -// return nil, err -// } -// } -// -// return user, nil -//} -// -//func insertUser(ctx context.Context, user *models.User) context.Context { -// return context.WithValue(ctx, "user", user) -//} -// -//func (s *TesterServer) AuthUnaryInterceptor() grpc.UnaryServerInterceptor { -// return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { -// token := extractToken(ctx) -// if token == "" { -// return handler(insertUser(ctx, defaultUser), req) -// } -// -// user, err := s.readSessionAndReadUser(ctx, token) -// if err != nil { -// return handler(insertUser(ctx, defaultUser), req) -// } -// -// return handler(insertUser(ctx, user), req) -// } -//} -// -//type ssWrapper struct { -// grpc.ServerStream -// ctx context.Context -//} -// -//func (s *ssWrapper) Context() context.Context { -// return s.ctx -//} -// -//func (s *TesterServer) AuthStreamInterceptor() grpc.StreamServerInterceptor { -// return func(server interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { -// ctx := ss.Context() -// -// token := extractToken(ctx) -// if token == "" { -// return handler(server, &ssWrapper{ServerStream: ss, ctx: insertUser(ctx, defaultUser)}) -// } -// -// user, err := s.readSessionAndReadUser(ctx, token) -// if err != nil { -// return handler(server, &ssWrapper{ServerStream: ss, ctx: insertUser(ctx, defaultUser)}) -// } -// -// return handler(server, &ssWrapper{ServerStream: ss, ctx: insertUser(ctx, user)}) -// } -//} -// -//func ToGrpcError(err error) error { -// if err == nil { -// return nil -// } -// -// // should I use map instead? -// switch { -// case errors.Is(err, utils.ErrValidationFailed): -// return status.Error(codes.InvalidArgument, err.Error()) -// case errors.Is(err, utils.ErrInternal): -// return status.Error(codes.Internal, err.Error()) -// case errors.Is(err, utils.ErrExternal): -// return status.Error(codes.Unavailable, err.Error()) -// case errors.Is(err, utils.ErrNoPermission): -// return status.Error(codes.PermissionDenied, err.Error()) -// case errors.Is(err, utils.ErrUnknown): -// return status.Error(codes.Unknown, err.Error()) -// case errors.Is(err, utils.ErrDeadlineExceeded): -// return status.Error(codes.DeadlineExceeded, err.Error()) -// case errors.Is(err, utils.ErrNotFound): -// return status.Error(codes.NotFound, err.Error()) -// case errors.Is(err, utils.ErrAlreadyExists): -// return status.Error(codes.AlreadyExists, err.Error()) -// case errors.Is(err, utils.ErrConflict): -// return status.Error(codes.Unimplemented, err.Error()) -// case errors.Is(err, utils.ErrUnimplemented): -// return status.Error(codes.Unimplemented, err.Error()) -// case errors.Is(err, utils.ErrUnauthenticated): -// return status.Error(codes.Unauthenticated, err.Error()) -// default: -// return status.Error(codes.Unknown, err.Error()) -// } -//} -// -//func (s *TesterServer) ErrUnwrappingUnaryInterceptor() grpc.UnaryServerInterceptor { -// return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { -// resp, err := handler(ctx, req) -// return resp, ToGrpcError(err) -// } -//} -// -//func (s *TesterServer) ErrUnwrappingStreamInterceptor() grpc.StreamServerInterceptor { -// return func(server interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { -// err := handler(server, ss) -// return ToGrpcError(err) -// } -//} diff --git a/internal/models/problem.go b/internal/models/problem.go index c334c10..e85fbe7 100644 --- a/internal/models/problem.go +++ b/internal/models/problem.go @@ -3,16 +3,16 @@ package models import "time" type Problem struct { - Id *int32 `db:"id"` - Title *string `db:"title"` - Legend *string `db:"legend"` - InputFormat *string `db:"input_format"` - OutputFormat *string `db:"output_format"` - Notes *string `db:"notes"` - Tutorial *string `db:"tutorial"` - LatexSummary *string `db:"latex_summary"` - TimeLimit *int32 `db:"time_limit"` - MemoryLimit *int32 `db:"memory_limit"` - CreatedAt *time.Time `db:"created_at"` - UpdatedAt *time.Time `db:"updated_at"` + Id int32 `db:"id"` + Title string `db:"title"` + Legend string `db:"legend"` + InputFormat string `db:"input_format"` + OutputFormat string `db:"output_format"` + Notes string `db:"notes"` + Tutorial string `db:"tutorial"` + LatexSummary string `db:"latex_summary"` + TimeLimit int32 `db:"time_limit"` + MemoryLimit int32 `db:"memory_limit"` + CreatedAt time.Time `db:"created_at"` + UpdatedAt time.Time `db:"updated_at"` } diff --git a/internal/models/session.go b/internal/models/session.go new file mode 100644 index 0000000..446475a --- /dev/null +++ b/internal/models/session.go @@ -0,0 +1,162 @@ +package models + +import ( + "context" + "errors" + "github.com/google/uuid" + "github.com/open-policy-agent/opa/v1/rego" +) + +type JWT struct { + SessionId string `json:"session_id"` + UserId int32 `json:"user_id"` + Role Role `json:"role"` + ExpiresAt int64 `json:"exp"` + IssuedAt int64 `json:"iat"` + NotBefore int64 `json:"nbf"` + Permissions []grant `json:"permissions"` +} + +func (j JWT) Valid() error { + if uuid.Validate(j.SessionId) != nil { + return errors.New("invalid session id") + } + if j.UserId == 0 { + return errors.New("empty user id") + } + if j.ExpiresAt == 0 { + return errors.New("empty expires at") + } + if j.IssuedAt == 0 { + return errors.New("empty issued at") + } + if j.NotBefore == 0 { + return errors.New("empty not before") + } + if len(j.Permissions) == 0 { + return errors.New("empty permissions") + } + return nil +} + +type Role int32 + +const ( + RoleGuest Role = -1 + RoleStudent Role = 0 + RoleTeacher Role = 1 + RoleAdmin Role = 2 +) + +func (r Role) String() string { + switch r { + case RoleGuest: + return "guest" + case RoleStudent: + return "student" + case RoleTeacher: + return "teacher" + case RoleAdmin: + return "admin" + } + + panic("invalid role") +} + +type Action string + +const ( + Create Action = "create" + Read Action = "read" + Update Action = "update" + Delete Action = "delete" +) + +type Resource string + +const ( + ResourceAnotherUser Resource = "another-user" + ResourceMeUser Resource = "me-user" + ResourceListUser Resource = "list-user" + + ResourceOwnSession Resource = "own-session" +) + +type grant struct { + Action Action `json:"action"` + Resource Resource `json:"resource"` +} + +var Grants = map[string][]grant{ + RoleGuest.String(): {}, + RoleStudent.String(): { + {Read, ResourceAnotherUser}, + {Read, ResourceMeUser}, + {Update, ResourceOwnSession}, + {Delete, ResourceOwnSession}, + }, + RoleTeacher.String(): { + {Create, ResourceAnotherUser}, + {Read, ResourceAnotherUser}, + {Read, ResourceMeUser}, + {Read, ResourceListUser}, + {Update, ResourceOwnSession}, + {Delete, ResourceOwnSession}, + }, + RoleAdmin.String(): { + {Create, ResourceAnotherUser}, + {Read, ResourceAnotherUser}, + {Read, ResourceMeUser}, + {Read, ResourceListUser}, + {Update, ResourceAnotherUser}, + {Update, ResourceOwnSession}, + {Delete, ResourceAnotherUser}, + {Delete, ResourceOwnSession}, + }, +} + +const module = `package app.rbac + +default allow := false + +allow if { + some grant in input.role_grants[input.role] + + input.action == grant.action + input.resource == grant.resource +} +` + +var query rego.PreparedEvalQuery + +func (r Role) HasPermission(action Action, resource Resource) bool { + ctx := context.TODO() + + input := map[string]interface{}{ + "action": action, + "resource": resource, + "role": r.String(), + "role_grants": Grants, + } + + results, err := query.Eval(ctx, rego.EvalInput(input)) + if err != nil { + panic(err) + } + + return results.Allowed() +} + +func init() { + var err error + ctx := context.TODO() + + query, err = rego.New( + rego.Query("data.app.rbac.allow"), + rego.Module("ms-auth.rego", module), + ).PrepareForEval(ctx) + + if err != nil { + panic(err) + } +} diff --git a/internal/models/solution.go b/internal/models/solution.go index 227c233..5e10a0c 100644 --- a/internal/models/solution.go +++ b/internal/models/solution.go @@ -1,13 +1,17 @@ package models -//type Solution struct { -// Id *int32 `db:"id"` -// TaskId *int32 `db:"task_id"` -// ParticipantId *int32 `db:"participant_id"` -// State *int32 `db:"state"` -// Score *int32 `db:"score"` -// Penalty *int32 `db:"penalty"` -// TotalScore *int32 `db:"total_score"` -// Language *int32 `db:"language"` -// CreatedAt *time.Time `db:"created_at"` -//} +import "time" + +type Solution struct { + Id int32 `db:"id"` + TaskId int32 `db:"task_id"` + ParticipantId int32 `db:"participant_id"` + Solution string `db:"solution"` + State int32 `db:"state"` + Score int32 `db:"score"` + Penalty int32 `db:"penalty"` + TotalScore int32 `db:"total_score"` + Language int32 `db:"language"` + UpdatedAt time.Time `db:"updated_at"` + CreatedAt time.Time `db:"created_at"` +} diff --git a/internal/models/task.go b/internal/models/task.go index bf2323e..aef2fe7 100644 --- a/internal/models/task.go +++ b/internal/models/task.go @@ -1,10 +1,24 @@ package models -//type Task struct { -// Id *int32 `db:"id"` -// ProblemId *int32 `db:"problem_id"` -// ContestId *int32 `db:"contest_id"` -// Position *int32 `db:"position"` -// CreatedAt *time.Time `db:"created_at"` -// UpdatedAt *time.Time `db:"updated_at"` -//} +import "time" + +type Task struct { + Id int32 `db:"id"` + ProblemId int32 `db:"problem_id"` + ContestId int32 `db:"contest_id"` + Position int32 `db:"position"` + CreatedAt time.Time `db:"created_at"` + UpdatedAt time.Time `db:"updated_at"` +} + +type RichTask struct { + Id int32 `db:"id"` + ProblemId int32 `db:"problem_id"` + ContestId int32 `db:"contest_id"` + Position int32 `db:"position"` + Title string `db:"title"` + MemoryLimit int32 `db:"memory_limit"` + TimeLimit int32 `db:"time_limit"` + CreatedAt time.Time `db:"created_at"` + UpdatedAt time.Time `db:"updated_at"` +} diff --git a/internal/tester/delivery/rest/handlers.go b/internal/tester/delivery/rest/handlers.go index b9a5edb..f95b233 100644 --- a/internal/tester/delivery/rest/handlers.go +++ b/internal/tester/delivery/rest/handlers.go @@ -53,14 +53,49 @@ func (h *TesterHandlers) GetContest(c *fiber.Ctx, id int32) error { return c.SendStatus(pkg.ToREST(err)) } - return c.JSON(testerv1.GetContestResponse{ + //token, ok := c.Locals(TokenKey).(*models.JWT) + //if !ok { + // return c.SendStatus(fiber.StatusUnauthorized) + //} + + tasks, err := h.contestsUC.ReadRichTasks(c.Context(), id) + if err != nil { + return c.SendStatus(pkg.ToREST(err)) + } + + resp := testerv1.GetContestResponse{ Contest: testerv1.Contest{ - Id: *contest.Id, + Id: id, Title: *contest.Title, CreatedAt: *contest.CreatedAt, UpdatedAt: *contest.UpdatedAt, }, - }) + Tasks: make([]struct { + BestSolution testerv1.BestSolution `json:"best_solution"` + Task testerv1.RichTask `json:"task"` + }, len(tasks)), + } + + for i, task := range tasks { + resp.Tasks[i] = struct { + BestSolution testerv1.BestSolution `json:"best_solution"` + Task testerv1.RichTask `json:"task"` + }{ + BestSolution: testerv1.BestSolution{}, + Task: testerv1.RichTask{ + Id: task.Id, + ProblemId: task.ProblemId, + Position: task.Position, + Title: task.Title, + MemoryLimit: task.MemoryLimit, + TimeLimit: task.TimeLimit, + CreatedAt: task.CreatedAt, + UpdatedAt: task.UpdatedAt, + }, + } + } + + return c.JSON(resp) } func (h *TesterHandlers) DeleteParticipant(c *fiber.Ctx, id int32, params testerv1.DeleteParticipantParams) error { @@ -130,17 +165,17 @@ func (h *TesterHandlers) GetProblem(c *fiber.Ctx, id int32) error { return c.JSON( testerv1.GetProblemResponse{Problem: testerv1.Problem{ - Id: *problem.Id, - Legend: *problem.Legend, - InputFormat: *problem.InputFormat, - OutputFormat: *problem.OutputFormat, - Notes: *problem.Notes, - Tutorial: *problem.Tutorial, - LatexSummary: *problem.LatexSummary, - TimeLimit: *problem.TimeLimit, - MemoryLimit: *problem.MemoryLimit, - CreatedAt: *problem.CreatedAt, - UpdatedAt: *problem.UpdatedAt, + Id: problem.Id, + Legend: problem.Legend, + InputFormat: problem.InputFormat, + OutputFormat: problem.OutputFormat, + Notes: problem.Notes, + Tutorial: problem.Tutorial, + LatexSummary: problem.LatexSummary, + TimeLimit: problem.TimeLimit, + MemoryLimit: problem.MemoryLimit, + CreatedAt: problem.CreatedAt, + UpdatedAt: problem.UpdatedAt, }}, ) } diff --git a/internal/tester/delivery/rest/middlewares.go b/internal/tester/delivery/rest/middlewares.go new file mode 100644 index 0000000..b0e984d --- /dev/null +++ b/internal/tester/delivery/rest/middlewares.go @@ -0,0 +1,71 @@ +package rest + +import ( + "fmt" + "git.sch9.ru/new_gate/ms-tester/internal/models" + "github.com/gofiber/fiber/v2" + "github.com/golang-jwt/jwt/v4" + "strings" +) + +const ( + TokenKey = "token" +) + +func AuthMiddleware(jwtSecret string) fiber.Handler { + return func(c *fiber.Ctx) error { + const op = "AuthMiddleware" + + authHeader := c.Get("Authorization", "") + if authHeader == "" { + c.Locals(TokenKey, nil) + return c.Next() + } + + authParts := strings.Split(authHeader, " ") + if len(authParts) != 2 || strings.ToLower(authParts[0]) != "bearer" { + c.Locals(TokenKey, nil) + return c.Next() + } + + parsedToken, err := jwt.ParseWithClaims(authParts[1], &models.JWT{}, func(token *jwt.Token) (interface{}, error) { + if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { + return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) + } + + return []byte(jwtSecret), nil + }) + if err != nil { + c.Locals(TokenKey, nil) + return c.Next() + } + + token, ok := parsedToken.Claims.(*models.JWT) + if !ok { + c.Locals(TokenKey, nil) + return c.Next() + } + + err = token.Valid() + if err != nil { + c.Locals(TokenKey, nil) + return c.Next() + } + + //ctx := c.Context() + + // check if session exists + //_, err = userUC.ReadSession(ctx, token.SessionId) + //if err != nil { + // if errors.Is(err, pkg.ErrNotFound) { + // c.Locals(TokenKey, nil) + // return c.Next() + // } + // + // return c.SendStatus(pkg.ToREST(err)) + //} + + c.Locals(TokenKey, token) + return c.Next() + } +} diff --git a/internal/tester/pg_repository.go b/internal/tester/pg_repository.go index b77abbf..365dca1 100644 --- a/internal/tester/pg_repository.go +++ b/internal/tester/pg_repository.go @@ -19,4 +19,5 @@ type ContestRepository interface { DeleteTask(ctx context.Context, taskId int32) error AddParticipant(ctx context.Context, contestId int32, userId int32) (int32, error) DeleteParticipant(ctx context.Context, participantId int32) error + ReadRichTasks(ctx context.Context, contestId int32) ([]*models.RichTask, error) } diff --git a/internal/tester/repository/pg_contests_repository.go b/internal/tester/repository/pg_contests_repository.go index 406cb90..dc706ab 100644 --- a/internal/tester/repository/pg_contests_repository.go +++ b/internal/tester/repository/pg_contests_repository.go @@ -4,18 +4,15 @@ import ( "context" "git.sch9.ru/new_gate/ms-tester/internal/models" "github.com/jmoiron/sqlx" - "go.uber.org/zap" ) type ContestRepository struct { - db *sqlx.DB - logger *zap.Logger + db *sqlx.DB } -func NewContestRepository(db *sqlx.DB, logger *zap.Logger) *ContestRepository { +func NewContestRepository(db *sqlx.DB) *ContestRepository { return &ContestRepository{ - db: db, - logger: logger, + db: db, } } @@ -136,3 +133,28 @@ func (r *ContestRepository) DeleteParticipant(ctx context.Context, participantId } return nil } + +const readTasksQuery = `SELECT tasks.id, + problem_id, + contest_id, + position, + title, + memory_limit, + time_limit, + tasks.created_at, + tasks.updated_at +FROM tasks + INNER JOIN problems ON tasks.problem_id = problems.id +WHERE contest_id = ? ORDER BY position` + +func (r *ContestRepository) ReadRichTasks(ctx context.Context, contestId int32) ([]*models.RichTask, error) { + const op = "ContestRepository.ReadTasks" + + var tasks []*models.RichTask + query := r.db.Rebind(readTasksQuery) + err := r.db.SelectContext(ctx, &tasks, query, contestId) + if err != nil { + return nil, handlePgErr(err, op) + } + return tasks, nil +} diff --git a/internal/tester/repository/pg_problems_repository.go b/internal/tester/repository/pg_problems_repository.go index 8758481..b171092 100644 --- a/internal/tester/repository/pg_problems_repository.go +++ b/internal/tester/repository/pg_problems_repository.go @@ -4,18 +4,17 @@ import ( "context" "git.sch9.ru/new_gate/ms-tester/internal/models" "github.com/jmoiron/sqlx" - "go.uber.org/zap" ) type ProblemRepository struct { - db *sqlx.DB - logger *zap.Logger + db *sqlx.DB + //logger *zap.Logger } -func NewProblemRepository(db *sqlx.DB, logger *zap.Logger) *ProblemRepository { +func NewProblemRepository(db *sqlx.DB) *ProblemRepository { return &ProblemRepository{ - db: db, - logger: logger, + db: db, + //logger: logger, } } diff --git a/internal/tester/usecase.go b/internal/tester/usecase.go index 064dde1..707bce5 100644 --- a/internal/tester/usecase.go +++ b/internal/tester/usecase.go @@ -19,4 +19,5 @@ type ContestUseCase interface { DeleteTask(ctx context.Context, taskId int32) error AddParticipant(ctx context.Context, contestId int32, userId int32) (int32, error) DeleteParticipant(ctx context.Context, participantId int32) error + ReadRichTasks(ctx context.Context, contestId int32) ([]*models.RichTask, error) } diff --git a/internal/tester/usecase/contests_usecase.go b/internal/tester/usecase/contests_usecase.go index 4c425eb..796978e 100644 --- a/internal/tester/usecase/contests_usecase.go +++ b/internal/tester/usecase/contests_usecase.go @@ -45,3 +45,7 @@ func (uc *ContestUseCase) AddParticipant(ctx context.Context, contestId int32, u func (uc *ContestUseCase) DeleteParticipant(ctx context.Context, participantId int32) error { return uc.contestRepo.DeleteParticipant(ctx, participantId) } + +func (uc *ContestUseCase) ReadRichTasks(ctx context.Context, contestId int32) ([]*models.RichTask, error) { + return uc.contestRepo.ReadRichTasks(ctx, contestId) +} diff --git a/main.go b/main.go index 0aaf32e..db45284 100644 --- a/main.go +++ b/main.go @@ -43,10 +43,10 @@ func main() { //pandocClient := pandoc.NewPandocClient(&http.Client{}, cfg.Pandoc) - problemRepo := problemsRepository.NewProblemRepository(db, logger) + problemRepo := problemsRepository.NewProblemRepository(db) problemUC := testerUseCase.NewProblemUseCase(problemRepo) - contestRepo := problemsRepository.NewContestRepository(db, logger) + contestRepo := problemsRepository.NewContestRepository(db) contestUC := testerUseCase.NewContestUseCase(contestRepo) server := fiber.New() @@ -54,6 +54,7 @@ func main() { testerv1.RegisterHandlersWithOptions(server, rest.NewTesterHandlers(problemUC, contestUC), testerv1.FiberServerOptions{ Middlewares: []testerv1.MiddlewareFunc{ fiberlogger.New(), + rest.AuthMiddleware(cfg.JWTSecret), //rest.AuthMiddleware(cfg.JWTSecret, userUC), //cors.New(cors.Config{ // AllowOrigins: "http://localhost:3000", diff --git a/proto b/proto index b7ea2e6..ab113ec 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit b7ea2e6cc71f7393f9afe722204c5c33b6a6f2b6 +Subproject commit ab113ecb9cff82e13047b3e4a65c769295251d88