diff --git a/.gitignore b/.gitignore index fbd854a..e58e5a2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,2 @@ .env .idea -/pkg/go/gen -/ms-tester diff --git a/Makefile b/Makefile index 4ee8e6c..eb340fb 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,9 @@ tag = latest - gen: - @buf generate -dev: - @make gen + @oapi-codegen --config=config.yaml ./proto/tester/v1/openapi.yaml +dev: gen @go run main.go - -build: - @make gen +build: gen @docker build . -t ms-tester:${tag} @#docker push ms-tester:${tag} diff --git a/buf.gen.yaml b/buf.gen.yaml deleted file mode 100644 index 651a0a1..0000000 --- a/buf.gen.yaml +++ /dev/null @@ -1,12 +0,0 @@ -version: v1 -managed: - enabled: true - go_package_prefix: - default: git.sch9.ru/new_gate/ms-tester/pkg/go/gen -plugins: - - name: go - out: pkg/go/gen - opt: paths=source_relative - - name: go-grpc - out: pkg/go/gen - opt: paths=source_relative diff --git a/buf.yaml b/buf.yaml deleted file mode 100644 index 1a51945..0000000 --- a/buf.yaml +++ /dev/null @@ -1,7 +0,0 @@ -version: v1 -breaking: - use: - - FILE -lint: - use: - - DEFAULT diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..7e2a9cf --- /dev/null +++ b/config.yaml @@ -0,0 +1,5 @@ +package: testerv1 +generate: + fiber-server: true + models: true +output: ./proto/tester/v1/tester.go \ No newline at end of file diff --git a/config/config.go b/config/config.go index 863aebd..081a0bf 100644 --- a/config/config.go +++ b/config/config.go @@ -1,14 +1,14 @@ package config type Config struct { - Env string `env:"ENV" env-default:"prod"` - Pandoc string `env:"PANDOC" required:"true"` + Env string `env:"ENV" env-default:"prod"` + //Pandoc string `env:"PANDOC" required:"true"` Address string `env:"ADDRESS" required:"true"` PostgresDSN string `env:"POSTGRES_DSN" required:"true"` - RabbitDSN string `env:"RABBIT_DSN" required:"true"` - InstanceName string `env:"INSTANCE_NAME" required:"true"` - RQueueName string `env:"R_QUEUE_NAME" required:"true"` - TQueueName string `env:"T_QUEUE_NAME" required:"true"` - NQueueName string `env:"N_QUEUE_NAME" required:"true"` + //RabbitDSN string `env:"RABBIT_DSN" required:"true"` + //InstanceName string `env:"INSTANCE_NAME" required:"true"` + //RQueueName string `env:"R_QUEUE_NAME" required:"true"` + //TQueueName string `env:"T_QUEUE_NAME" required:"true"` + //NQueueName string `env:"N_QUEUE_NAME" required:"true"` } diff --git a/go.mod b/go.mod index 51da307..53a9986 100644 --- a/go.mod +++ b/go.mod @@ -4,63 +4,46 @@ go 1.22.0 require ( github.com/DATA-DOG/go-sqlmock v1.5.2 - github.com/golang/protobuf v1.5.4 + github.com/gofiber/fiber/v2 v2.52.6 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/rabbitmq/amqp091-go v1.10.0 - github.com/seaweedfs/seaweedfs v0.0.0-20241029024439-228946369cad github.com/stretchr/testify v1.9.0 github.com/valkey-io/valkey-go v1.0.47 go.uber.org/zap v1.27.0 - google.golang.org/grpc v1.67.1 google.golang.org/protobuf v1.35.1 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cognusion/imaging v1.0.1 // indirect + github.com/andybalholm/brotli v1.1.0 // indirect + github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect + github.com/google/uuid v1.6.0 // 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/magiconair/properties v1.8.7 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/kr/pretty v0.3.1 // 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/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.20.5 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.55.0 // indirect - github.com/prometheus/procfs v0.15.1 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect - github.com/sagikazarmark/locafero v0.4.0 // indirect - github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/seaweedfs/goexif v1.0.3 // indirect - github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect - github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.19.0 // indirect - github.com/subosito/gotenv v1.6.0 // indirect - github.com/viant/ptrie v1.0.1 // 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 go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.28.0 // indirect - golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect - golang.org/x/image v0.21.0 // indirect golang.org/x/net v0.30.0 // indirect golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.26.0 // indirect + golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.19.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect ) require ( - github.com/BurntSushi/toml v1.2.1 // indirect + github.com/BurntSushi/toml v1.3.2 // indirect github.com/jackc/pgx/v5 v5.6.0 github.com/jmoiron/sqlx v1.4.0 github.com/joho/godotenv v1.5.1 // indirect diff --git a/go.sum b/go.sum index 8158274..1f0207f 100644 --- a/go.sum +++ b/go.sum @@ -1,37 +1,28 @@ -cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ= -cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg= -cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= -cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= 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/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -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/cognusion/imaging v1.0.1 h1:jJa1+jYHvr2zS5zZxoluYthH5KbVz4LEvD3xy/W2L90= -github.com/cognusion/imaging v1.0.1/go.mod h1:ucYm08RsFoQvYXEV5XMsRBppxrWzD1AGxm6iod5/rvM= +github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= +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/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 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/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= -github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk= -github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= 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/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +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/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/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/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= @@ -48,6 +39,7 @@ github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= 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= @@ -55,78 +47,47 @@ 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= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +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/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -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/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= -github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= 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.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= -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.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= -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/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/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= -github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= -github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= -github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= -github.com/seaweedfs/goexif v1.0.3 h1:ve/OjI7dxPW8X9YQsv3JuVMaxEyF9Rvfd04ouL+Bz30= -github.com/seaweedfs/goexif v1.0.3/go.mod h1:Oni780Z236sXpIQzk1XoJlTwqrJ02smEin9zQeff7Fk= -github.com/seaweedfs/seaweedfs v0.0.0-20241029024439-228946369cad h1:t8l2DVWgplSF4FgfsKaOFoxH17jR8PmJCNlNN6LdZ8s= -github.com/seaweedfs/seaweedfs v0.0.0-20241029024439-228946369cad/go.mod h1:mODWTWSH21WxAUlAKoQ//CHaC/qKVGEdznOSpiAiOXM= -github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= -github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= -github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +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/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= 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.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 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/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= -github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= 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/viant/assertly v0.9.0 h1:uB3jO+qmWQcrSCHQRxA2kk88eXAdaklUUDxxCU5wBHQ= -github.com/viant/assertly v0.9.0/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= -github.com/viant/ptrie v1.0.1 h1:3fFC8XqCSchf11sCSS5sbb8eGDNEP2g2Hj96lNdHlZY= -github.com/viant/ptrie v1.0.1/go.mod h1:Y+mwwNCIUgFrCZcrG4/QChfi4ubvnNBsyrENBIgigu0= -github.com/viant/toolbox v0.34.5 h1:szWNPiGHjo8Dd4v2a59saEhG31DRL2Xf3aJ0ZtTSuqc= -github.com/viant/toolbox v0.34.5/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= +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= 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= @@ -137,31 +98,21 @@ golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= 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/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s= -golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78= 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/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +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/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= 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= 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= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/contests/delivery.go b/internal/contests/delivery.go deleted file mode 100644 index 874d361..0000000 --- a/internal/contests/delivery.go +++ /dev/null @@ -1,17 +0,0 @@ -package contests - -import ( - "context" - contestv1 "git.sch9.ru/new_gate/ms-tester/pkg/go/gen/proto/contest/v1" - "google.golang.org/protobuf/types/known/emptypb" -) - -type ContestHandlers interface { - CreateContest(ctx context.Context, req *contestv1.CreateContestRequest) (*contestv1.CreateContestResponse, error) - ReadContest(ctx context.Context, req *contestv1.ReadContestRequest) (*contestv1.ReadContestResponse, error) - DeleteContest(ctx context.Context, req *contestv1.DeleteContestRequest) (*emptypb.Empty, error) - AddTask(ctx context.Context, req *contestv1.AddTaskRequest) (*contestv1.AddTaskResponse, error) - DeleteTask(ctx context.Context, req *contestv1.DeleteTaskRequest) (*emptypb.Empty, error) - AddParticipant(ctx context.Context, req *contestv1.AddParticipantRequest) (*contestv1.AddParticipantResponse, error) - DeleteParticipant(ctx context.Context, req *contestv1.DeleteParticipantRequest) (*emptypb.Empty, error) -} diff --git a/internal/contests/delivery/grpc/handlers.go b/internal/contests/delivery/grpc/handlers.go deleted file mode 100644 index 36047a4..0000000 --- a/internal/contests/delivery/grpc/handlers.go +++ /dev/null @@ -1,83 +0,0 @@ -package grpc - -import ( - "context" - "git.sch9.ru/new_gate/ms-tester/internal/contests" - contestv1 "git.sch9.ru/new_gate/ms-tester/pkg/go/gen/proto/contest/v1" - "git.sch9.ru/new_gate/ms-tester/pkg/utils" - "google.golang.org/grpc" - "google.golang.org/protobuf/types/known/emptypb" -) - -type ContestHandlers struct { - contestv1.UnimplementedContestServiceServer - - contestUC contests.ContestUseCase -} - -func NewContestHandlers(gserver *grpc.Server, contestUC contests.ContestUseCase) { - handlers := &ContestHandlers{contestUC: contestUC} - - contestv1.RegisterContestServiceServer(gserver, handlers) -} - -func (h *ContestHandlers) CreateContest(ctx context.Context, req *contestv1.CreateContestRequest) (*contestv1.CreateContestResponse, error) { - id, err := h.contestUC.CreateContest(ctx, req.GetTitle()) - if err != nil { - return nil, err - } - return &contestv1.CreateContestResponse{Id: id}, nil -} - -func (h *ContestHandlers) ReadContest(ctx context.Context, req *contestv1.ReadContestRequest) (*contestv1.ReadContestResponse, error) { - contest, err := h.contestUC.ReadContestById(ctx, req.GetId()) - if err != nil { - return nil, err - } - return &contestv1.ReadContestResponse{Contest: &contestv1.ReadContestResponse_Contest{ - Id: *contest.Id, - Title: *contest.Title, - CreatedAt: utils.TimestampP(contest.CreatedAt), - UpdatedAt: utils.TimestampP(contest.UpdatedAt), - }}, nil -} - -func (h *ContestHandlers) DeleteContest(ctx context.Context, req *contestv1.DeleteContestRequest) (*emptypb.Empty, error) { - err := h.contestUC.DeleteContest(ctx, req.GetId()) - if err != nil { - return nil, err - } - return &emptypb.Empty{}, nil -} - -func (h *ContestHandlers) AddTask(ctx context.Context, req *contestv1.AddTaskRequest) (*contestv1.AddTaskResponse, error) { - id, err := h.contestUC.AddTask(ctx, req.GetContestId(), req.GetProblemId()) - if err != nil { - return nil, err - } - return &contestv1.AddTaskResponse{Id: id}, nil -} - -func (h *ContestHandlers) DeleteTask(ctx context.Context, req *contestv1.DeleteTaskRequest) (*emptypb.Empty, error) { - err := h.contestUC.DeleteTask(ctx, req.GetTaskId()) - if err != nil { - return nil, err - } - return &emptypb.Empty{}, nil -} - -func (h *ContestHandlers) AddParticipant(ctx context.Context, req *contestv1.AddParticipantRequest) (*contestv1.AddParticipantResponse, error) { - id, err := h.contestUC.AddParticipant(ctx, req.GetContestId(), req.GetUserId()) - if err != nil { - return nil, err - } - return &contestv1.AddParticipantResponse{Id: id}, nil -} - -func (h *ContestHandlers) DeleteParticipant(ctx context.Context, req *contestv1.DeleteParticipantRequest) (*emptypb.Empty, error) { - err := h.contestUC.DeleteParticipant(ctx, req.GetParticipantId()) - if err != nil { - return nil, err - } - return &emptypb.Empty{}, nil -} diff --git a/internal/contests/pg_repository.go b/internal/contests/pg_repository.go deleted file mode 100644 index 0443e32..0000000 --- a/internal/contests/pg_repository.go +++ /dev/null @@ -1,16 +0,0 @@ -package contests - -import ( - "context" - "git.sch9.ru/new_gate/ms-tester/internal/models" -) - -type ContestRepository interface { - CreateContest(ctx context.Context, title string) (int32, error) - ReadContestById(ctx context.Context, id int32) (*models.Contest, error) - DeleteContest(ctx context.Context, id int32) error - AddTask(ctx context.Context, contestId int32, taskId int32) (int32, error) - DeleteTask(ctx context.Context, taskId int32) error - AddParticipant(ctx context.Context, contestId int32, userId int32) (int32, error) - DeleteParticipant(ctx context.Context, participantId int32) error -} diff --git a/internal/contests/usecase.go b/internal/contests/usecase.go deleted file mode 100644 index 7892518..0000000 --- a/internal/contests/usecase.go +++ /dev/null @@ -1,16 +0,0 @@ -package contests - -import ( - "context" - "git.sch9.ru/new_gate/ms-tester/internal/models" -) - -type ContestUseCase interface { - CreateContest(ctx context.Context, title string) (int32, error) - ReadContestById(ctx context.Context, id int32) (*models.Contest, error) - DeleteContest(ctx context.Context, id int32) error - AddTask(ctx context.Context, contestId int32, taskId int32) (int32, error) - DeleteTask(ctx context.Context, taskId int32) error - AddParticipant(ctx context.Context, contestId int32, userId int32) (int32, error) - DeleteParticipant(ctx context.Context, participantId int32) error -} diff --git a/internal/models/language.go b/internal/models/language.go index 62ccced..324b3af 100644 --- a/internal/models/language.go +++ b/internal/models/language.go @@ -1,13 +1,13 @@ package models -type Language struct { - Name string - CompileCmd []string //source: src;result:executable - RunCmd []string //source: executable -} - -var Languages = [...]Language{ - {Name: "gcc std=c90", - CompileCmd: []string{"gcc", "src", "-std=c90", "-o", "executable"}, - RunCmd: []string{"executable"}}, -} +//type Language struct { +// Name string +// CompileCmd []string //source: src;result:executable +// RunCmd []string //source: executable +//} +// +//var Languages = []Language{ +// {Name: "gcc std=c90", +// CompileCmd: []string{"gcc", "src", "-std=c90", "-o", "executable"}, +// RunCmd: []string{"executable"}}, +//} diff --git a/internal/models/participant.go b/internal/models/participant.go index 69c61c3..6ed0c83 100644 --- a/internal/models/participant.go +++ b/internal/models/participant.go @@ -1,12 +1,10 @@ package models -import "time" - -type Participant struct { - Id *int32 `db:"id"` - UserId *int32 `db:"user_id"` - ContestId *int32 `db:"contest_id"` - Name *string `db:"name"` - CreatedAt *time.Time `db:"created_at"` - UpdatedAt *time.Time `db:"updated_at"` -} +//type Participant struct { +// Id *int32 `db:"id"` +// UserId *int32 `db:"user_id"` +// ContestId *int32 `db:"contest_id"` +// Name *string `db:"name"` +// CreatedAt *time.Time `db:"created_at"` +// UpdatedAt *time.Time `db:"updated_at"` +//} diff --git a/internal/models/result.go b/internal/models/result.go index d6852b2..ef413b4 100644 --- a/internal/models/result.go +++ b/internal/models/result.go @@ -1,30 +1,26 @@ package models -import ( - "errors" -) - -type Result int32 - -const ( - NotTested Result = 1 // change only with schema change - Accepted Result = 2 - WrongAnswer Result = 3 - PresentationError Result = 4 - CompilationError Result = 5 - MemoryLimitExceeded Result = 6 - TimeLimitExceeded Result = 7 - RuntimeError Result = 8 - SystemFailDuringTesting Result = 9 - Testing Result = 10 -) - -var ErrBadResult = errors.New("bad result") - -func (result Result) Valid() error { - switch result { - case NotTested, Accepted, TimeLimitExceeded, MemoryLimitExceeded, CompilationError, SystemFailDuringTesting: - return nil - } - return ErrBadResult -} +//type Result int32 +// +//const ( +// NotTested Result = 1 // change only with schema change +// Accepted Result = 2 +// WrongAnswer Result = 3 +// PresentationError Result = 4 +// CompilationError Result = 5 +// MemoryLimitExceeded Result = 6 +// TimeLimitExceeded Result = 7 +// RuntimeError Result = 8 +// SystemFailDuringTesting Result = 9 +// Testing Result = 10 +//) +// +//var ErrBadResult = errors.New("bad result") +// +//func (result Result) Valid() error { +// switch result { +// case NotTested, Accepted, TimeLimitExceeded, MemoryLimitExceeded, CompilationError, SystemFailDuringTesting: +// return nil +// } +// return ErrBadResult +//} diff --git a/internal/models/role.go b/internal/models/role.go deleted file mode 100644 index d978058..0000000 --- a/internal/models/role.go +++ /dev/null @@ -1,52 +0,0 @@ -package models - -import ( - "errors" -) - -type Role int32 - -const ( - RoleSpectator Role = 0 - RoleParticipant Role = 1 - RoleModerator Role = 2 - RoleAdmin Role = 3 -) - -func (role Role) IsAdmin() bool { - return role == RoleAdmin -} - -func (role Role) IsModerator() bool { - return role == RoleModerator -} - -func (role Role) IsParticipant() bool { - return role == RoleParticipant -} - -func (role Role) IsSpectator() bool { - return role == RoleSpectator -} - -func (role Role) AtLeast(other Role) bool { - return role >= other -} - -func (role Role) AtMost(other Role) bool { - return role <= other -} - -var ErrBadRole = errors.New("bad role") - -func (role Role) Valid() error { - switch role { - case RoleSpectator, RoleParticipant, RoleModerator, RoleAdmin: - return nil - } - return ErrBadRole -} - -func (role Role) AsPointer() *Role { - return &role -} diff --git a/internal/models/solution.go b/internal/models/solution.go index 7c8bc24..227c233 100644 --- a/internal/models/solution.go +++ b/internal/models/solution.go @@ -1,15 +1,13 @@ package models -import "time" - -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"` -} +//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"` +//} diff --git a/internal/models/task.go b/internal/models/task.go index aa945a1..bf2323e 100644 --- a/internal/models/task.go +++ b/internal/models/task.go @@ -1,12 +1,10 @@ package models -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 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"` +//} diff --git a/internal/problems/delivery.go b/internal/problems/delivery.go deleted file mode 100644 index 5a14019..0000000 --- a/internal/problems/delivery.go +++ /dev/null @@ -1,13 +0,0 @@ -package problems - -import ( - "context" - problemv1 "git.sch9.ru/new_gate/ms-tester/pkg/go/gen/proto/problem/v1" - "google.golang.org/protobuf/types/known/emptypb" -) - -type Handlers interface { - CreateProblem(ctx context.Context, req *problemv1.CreateProblemRequest) (*problemv1.CreateProblemResponse, error) - ReadProblem(ctx context.Context, req *problemv1.ReadProblemRequest) (*problemv1.ReadProblemResponse, error) - DeleteProblem(ctx context.Context, req *problemv1.DeleteProblemRequest) (*emptypb.Empty, error) -} diff --git a/internal/problems/delivery/grpc/handlers.go b/internal/problems/delivery/grpc/handlers.go deleted file mode 100644 index 8143a6f..0000000 --- a/internal/problems/delivery/grpc/handlers.go +++ /dev/null @@ -1,61 +0,0 @@ -package grpc - -import ( - "context" - "git.sch9.ru/new_gate/ms-tester/internal/problems" - problemv1 "git.sch9.ru/new_gate/ms-tester/pkg/go/gen/proto/problem/v1" - "git.sch9.ru/new_gate/ms-tester/pkg/utils" - "google.golang.org/grpc" - "google.golang.org/protobuf/types/known/emptypb" -) - -type problemHandlers struct { - problemv1.UnimplementedProblemServiceServer - - problemUC problems.ProblemUseCase -} - -func NewProblemHandlers(gserver *grpc.Server, problemUC problems.ProblemUseCase) { - handlers := &problemHandlers{problemUC: problemUC} - - problemv1.RegisterProblemServiceServer(gserver, handlers) -} - -func (h *problemHandlers) CreateProblem(ctx context.Context, req *problemv1.CreateProblemRequest) (*problemv1.CreateProblemResponse, error) { - id, err := h.problemUC.CreateProblem(ctx, req.GetTitle()) - if err != nil { - return nil, err - } - return &problemv1.CreateProblemResponse{Id: id}, nil -} - -func (h *problemHandlers) ReadProblem(ctx context.Context, req *problemv1.ReadProblemRequest) (*problemv1.ReadProblemResponse, error) { - problem, err := h.problemUC.ReadProblemById(ctx, req.GetId()) - if err != nil { - return nil, err - } - return &problemv1.ReadProblemResponse{ - Problem: &problemv1.ReadProblemResponse_Problem{ - Id: *problem.Id, - Title: *problem.Title, - 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: utils.TimestampP(problem.CreatedAt), - UpdatedAt: utils.TimestampP(problem.UpdatedAt), - }, - }, nil -} - -func (h *problemHandlers) DeleteProblem(ctx context.Context, req *problemv1.DeleteProblemRequest) (*emptypb.Empty, error) { - err := h.problemUC.DeleteProblem(ctx, req.GetId()) - if err != nil { - return nil, err - } - return &emptypb.Empty{}, nil -} diff --git a/internal/problems/delivery/rabbitmq/sub.go b/internal/problems/delivery/rabbitmq/sub.go deleted file mode 100644 index 32c1f5b..0000000 --- a/internal/problems/delivery/rabbitmq/sub.go +++ /dev/null @@ -1,57 +0,0 @@ -package rabbitmq - -import ( - "fmt" - "git.sch9.ru/new_gate/ms-tester/internal/problems" - "github.com/golang/protobuf/proto" - amqp "github.com/rabbitmq/amqp091-go" - "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" -) - -func NewNotificationSubscriber(ch *amqp.Channel, queueName string, instanceName string, problemUC problems.ProblemUseCase) { - _, err := ch.QueueDeclare( - queueName, - true, - false, - false, - false, - nil, - ) - if err != nil { - panic(err) - } - - msgs, err := ch.Consume( - queueName, - instanceName, - false, - false, - false, - false, - nil, - ) - - if err != nil { - panic(err) // FIXME - } - - go func() { - for d := range msgs { - err = d.Ack(false) - if err != nil { - panic(err) // FIXME - } - - msg := filer_pb.EventNotification{} - - err = proto.Unmarshal(d.Body, &msg) - if err != nil { - panic(err) // FIXME - } - - fmt.Println(msg.String()) // TODO: instead, call appropriate problemUC handler - } - }() - - return -} diff --git a/internal/problems/pg_repository.go b/internal/problems/pg_repository.go deleted file mode 100644 index 7063c38..0000000 --- a/internal/problems/pg_repository.go +++ /dev/null @@ -1,12 +0,0 @@ -package problems - -import ( - "context" - "git.sch9.ru/new_gate/ms-tester/internal/models" -) - -type ProblemPostgresRepository interface { - CreateProblem(ctx context.Context, title string) (int32, error) - ReadProblemById(ctx context.Context, id int32) (*models.Problem, error) - DeleteProblem(ctx context.Context, id int32) error -} diff --git a/internal/problems/usecase.go b/internal/problems/usecase.go deleted file mode 100644 index f97a3e3..0000000 --- a/internal/problems/usecase.go +++ /dev/null @@ -1,18 +0,0 @@ -package problems - -import ( - "context" - "git.sch9.ru/new_gate/ms-tester/internal/models" -) - -type ProblemPolicyAgent interface { - CanCreateProblem(ctx context.Context) error - CanReadProblem(ctx context.Context) error - CanDeleteProblem(ctx context.Context) error -} - -type ProblemUseCase interface { - CreateProblem(ctx context.Context, title string) (int32, error) - ReadProblemById(ctx context.Context, id int32) (*models.Problem, error) - DeleteProblem(ctx context.Context, id int32) error -} diff --git a/internal/tester/delivery.go b/internal/tester/delivery.go index 94992b7..79fb2b3 100644 --- a/internal/tester/delivery.go +++ b/internal/tester/delivery.go @@ -1,10 +1,21 @@ package tester import ( - testerv1 "git.sch9.ru/new_gate/ms-tester/pkg/go/gen/proto/tester/v1" - "google.golang.org/grpc" + testerv1 "git.sch9.ru/new_gate/ms-tester/proto/tester/v1" + "github.com/gofiber/fiber/v2" ) type Handlers interface { - CreateSolution(*testerv1.CreateSolutionRequest, grpc.ServerStreamingServer[testerv1.TestingState]) error + ListContests(c *fiber.Ctx) error + CreateContest(c *fiber.Ctx) error + DeleteContest(c *fiber.Ctx, id int32) error + GetContest(c *fiber.Ctx, id int32) error + DeleteParticipant(c *fiber.Ctx, id int32, params testerv1.DeleteParticipantParams) error + AddParticipant(c *fiber.Ctx, id int32, params testerv1.AddParticipantParams) error + DeleteTask(c *fiber.Ctx, id int32, params testerv1.DeleteTaskParams) error + AddTask(c *fiber.Ctx, id int32, params testerv1.AddTaskParams) error + ListProblems(c *fiber.Ctx) error + CreateProblem(c *fiber.Ctx) error + DeleteProblem(c *fiber.Ctx, id int32) error + GetProblem(c *fiber.Ctx, id int32) error } diff --git a/internal/tester/delivery/grpc/handlers.go b/internal/tester/delivery/grpc/handlers.go deleted file mode 100644 index 61d4e2e..0000000 --- a/internal/tester/delivery/grpc/handlers.go +++ /dev/null @@ -1,41 +0,0 @@ -package grpc - -import ( - "git.sch9.ru/new_gate/ms-tester/internal/tester" - testerv1 "git.sch9.ru/new_gate/ms-tester/pkg/go/gen/proto/tester/v1" - "google.golang.org/grpc" -) - -func NewTesterHandlers(gserver *grpc.Server, testerUC tester.TesterUseCase) { - handlers := &testerHandlers{ - testerUC: testerUC, - } - - testerv1.RegisterTesterServiceServer(gserver, handlers) -} - -type testerHandlers struct { - testerv1.UnimplementedTesterServiceServer - - testerUC tester.TesterUseCase -} - -func (h *testerHandlers) CreateSolution(req *testerv1.CreateSolutionRequest, stream testerv1.TesterService_CreateSolutionServer) error { - id, err := h.testerUC.CreateSolution(stream.Context(), req.GetTaskId(), req.GetSolution(), req.GetLanguage()) - if err != nil { - return err - } - - ch, err := h.testerUC.ProcessTesting(stream.Context(), id) - if err != nil { - return err - } - for state := range ch { - err = stream.Send(&testerv1.TestingState{Msg: state}) - if err != nil { - return err - } - } - - return nil -} diff --git a/internal/tester/delivery/rabbitmq/pubsub.go b/internal/tester/delivery/rabbitmq/pubsub.go deleted file mode 100644 index dc27c99..0000000 --- a/internal/tester/delivery/rabbitmq/pubsub.go +++ /dev/null @@ -1,107 +0,0 @@ -package rabbitmq - -import ( - "context" - "fmt" - "git.sch9.ru/new_gate/ms-tester/internal/tester" - runnerv1 "git.sch9.ru/new_gate/ms-tester/pkg/go/gen/proto/runner/v1" - "github.com/golang/protobuf/proto" - amqp "github.com/rabbitmq/amqp091-go" -) - -func NewTesterProducer(ch *amqp.Channel, tQueueName string, rQueueName string, testerUC tester.TesterUseCase) { - _, err := ch.QueueDeclare( - tQueueName, - true, - false, - false, - false, - nil, - ) - if err != nil { - panic(err) - } - - go func() { - for d := range testerUC.TestingChannel() { - for i := 0; i < 15; i++ { - msg := runnerv1.Instruction{ - Instruction: &runnerv1.Instruction_Run{ - Run: &runnerv1.Run{ - SolutionId: d, - TestId: 0, - BindingKey: rQueueName, - }, - }} - - body, err := proto.Marshal(&msg) - if err != nil { - panic(err) - } - - err = ch.Publish( - "", - tQueueName, - false, - false, - amqp.Publishing{ - ContentType: "text/plain", - Body: body, - }, - ) - if err != nil { - panic(err) - } - } - } - }() - return -} - -func NewTesterConsumer(ch *amqp.Channel, rQueueName string, instanceName string, testerUC tester.TesterUseCase) { - _, err := ch.QueueDeclare( - rQueueName, - true, - false, - false, - false, - nil, - ) - if err != nil { - panic(err) - } - - msgs, err := ch.Consume( - rQueueName, - "", - false, - true, // each tester must have exclusive results queue - false, - false, - nil, - ) - if err != nil { - panic(err) - } - - go func() { - for d := range msgs { - err = d.Ack(false) - if err != nil { - panic(err) - } - - msg := runnerv1.Result{} - err = proto.Unmarshal(d.Body, &msg) - if err != nil { - panic(err) - } - fmt.Println(msg.String()) - - err = testerUC.ProcessResult(context.Background(), msg.GetRun().SolutionId, msg.GetRun().String()) - if err != nil { - fmt.Println(err) - } - } - }() -} diff --git a/internal/tester/delivery/rest/handlers.go b/internal/tester/delivery/rest/handlers.go new file mode 100644 index 0000000..e926057 --- /dev/null +++ b/internal/tester/delivery/rest/handlers.go @@ -0,0 +1,145 @@ +package rest + +import ( + "git.sch9.ru/new_gate/ms-tester/internal/tester" + testerv1 "git.sch9.ru/new_gate/ms-tester/proto/tester/v1" + "github.com/gofiber/fiber/v2" +) + +type TesterHandlers struct { + problemsUC tester.ProblemUseCase + contestsUC tester.ContestUseCase +} + +func NewTesterHandlers(problemsUC tester.ProblemUseCase, contestsUC tester.ContestRepository) *TesterHandlers { + return &TesterHandlers{ + problemsUC: problemsUC, + contestsUC: contestsUC, + } +} + +func (h *TesterHandlers) ListContests(c *fiber.Ctx) error { + return c.SendStatus(fiber.StatusNotImplemented) +} + +func (h *TesterHandlers) ListProblems(c *fiber.Ctx) error { + return c.SendStatus(fiber.StatusNotImplemented) +} + +func (h *TesterHandlers) CreateContest(c *fiber.Ctx) error { + id, err := h.contestsUC.CreateContest(c.Context(), "Название контеста") + if err != nil { + return err + } + + return c.JSON(testerv1.CreateContestResponse{ + Id: id, + }) +} + +func (h *TesterHandlers) DeleteContest(c *fiber.Ctx, id int32) error { + err := h.contestsUC.DeleteContest(c.Context(), id) + if err != nil { + return err + } + + return c.SendStatus(fiber.StatusOK) +} + +func (h *TesterHandlers) GetContest(c *fiber.Ctx, id int32) error { + contest, err := h.contestsUC.ReadContestById(c.Context(), id) + if err != nil { + return err + } + + return c.JSON(testerv1.GetContestResponse{ + Contest: testerv1.Contest{ + Id: *contest.Id, + Title: *contest.Title, + CreatedAt: *contest.CreatedAt, + UpdatedAt: *contest.UpdatedAt, + }, + }) +} + +func (h *TesterHandlers) DeleteParticipant(c *fiber.Ctx, id int32, params testerv1.DeleteParticipantParams) error { + err := h.contestsUC.DeleteParticipant(c.Context(), params.ParticipantId) + if err != nil { + return err + } + + return c.SendStatus(fiber.StatusOK) +} + +func (h *TesterHandlers) AddParticipant(c *fiber.Ctx, id int32, params testerv1.AddParticipantParams) error { + id, err := h.contestsUC.AddParticipant(c.Context(), id, params.UserId) + if err != nil { + return err + } + + return c.JSON(testerv1.AddParticipantResponse{ + Id: id, + }) +} + +func (h *TesterHandlers) DeleteTask(c *fiber.Ctx, id int32, params testerv1.DeleteTaskParams) error { + err := h.contestsUC.DeleteTask(c.Context(), params.TaskId) + if err != nil { + return err + } + + return c.SendStatus(fiber.StatusOK) +} + +func (h *TesterHandlers) AddTask(c *fiber.Ctx, id int32, params testerv1.AddTaskParams) error { + id, err := h.contestsUC.AddTask(c.Context(), id, params.ProblemId) + if err != nil { + return err + } + + return c.SendStatus(fiber.StatusNotImplemented) +} + +func (h *TesterHandlers) CreateProblem(c *fiber.Ctx) error { + id, err := h.problemsUC.CreateProblem(c.Context(), "Название задачи") + if err != nil { + return err + } + + return c.JSON(testerv1.CreateProblemResponse{ + Id: id, + }) +} + +func (h *TesterHandlers) DeleteProblem(c *fiber.Ctx, id int32) error { + err := h.problemsUC.DeleteProblem(c.Context(), id) + if err != nil { + return err + } + + return c.SendStatus(fiber.StatusOK) + +} + +func (h *TesterHandlers) GetProblem(c *fiber.Ctx, id int32) error { + problem, err := h.problemsUC.ReadProblemById(c.Context(), id) + if err != nil { + return err + } + + 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, + }}, + ) +} diff --git a/internal/tester/pg_repository.go b/internal/tester/pg_repository.go index bf83756..b77abbf 100644 --- a/internal/tester/pg_repository.go +++ b/internal/tester/pg_repository.go @@ -1,4 +1,22 @@ package tester -type TesterRepository interface { +import ( + "context" + "git.sch9.ru/new_gate/ms-tester/internal/models" +) + +type ProblemPostgresRepository interface { + CreateProblem(ctx context.Context, title string) (int32, error) + ReadProblemById(ctx context.Context, id int32) (*models.Problem, error) + DeleteProblem(ctx context.Context, id int32) error +} + +type ContestRepository interface { + CreateContest(ctx context.Context, title string) (int32, error) + ReadContestById(ctx context.Context, id int32) (*models.Contest, error) + DeleteContest(ctx context.Context, id int32) error + AddTask(ctx context.Context, contestId int32, taskId int32) (int32, error) + DeleteTask(ctx context.Context, taskId int32) error + AddParticipant(ctx context.Context, contestId int32, userId int32) (int32, error) + DeleteParticipant(ctx context.Context, participantId int32) error } diff --git a/internal/tester/repository/error.go b/internal/tester/repository/error.go new file mode 100644 index 0000000..cdd4408 --- /dev/null +++ b/internal/tester/repository/error.go @@ -0,0 +1,23 @@ +package repository + +import ( + "errors" + "git.sch9.ru/new_gate/ms-tester/pkg/utils" + "github.com/jackc/pgerrcode" + "github.com/jackc/pgx/v5/pgconn" +) + +func handlePgErr(err error) error { + var pgErr *pgconn.PgError + if !errors.As(err, &pgErr) { + return utils.StorageError(err, utils.ErrUnknown, "unexpected error from postgres") + } + if pgerrcode.IsIntegrityConstraintViolation(pgErr.Code) { + // TODO: probably should specify which constraint + return utils.StorageError(err, utils.ErrConflict, pgErr.Message) + } + if pgerrcode.IsNoData(pgErr.Code) { + return utils.StorageError(err, utils.ErrNotFound, pgErr.Message) + } + return utils.StorageError(err, utils.ErrUnimplemented, "unimplemented error") +} diff --git a/internal/contests/repository/pg_repository.go b/internal/tester/repository/pg_contests_repository.go similarity index 66% rename from internal/contests/repository/pg_repository.go rename to internal/tester/repository/pg_contests_repository.go index 48ff720..6cc5ca1 100644 --- a/internal/contests/repository/pg_repository.go +++ b/internal/tester/repository/pg_contests_repository.go @@ -2,11 +2,7 @@ package repository import ( "context" - "errors" "git.sch9.ru/new_gate/ms-tester/internal/models" - "git.sch9.ru/new_gate/ms-tester/pkg/utils" - "github.com/jackc/pgerrcode" - "github.com/jackc/pgx/v5/pgconn" "github.com/jmoiron/sqlx" "go.uber.org/zap" ) @@ -23,7 +19,7 @@ func NewContestRepository(db *sqlx.DB, logger *zap.Logger) *ContestRepository { } } -const createContestQuery = "INSERT INTO contest (title) VALUES (?) RETURNING id" +const createContestQuery = "INSERT INTO contests (title) VALUES (?) RETURNING id" func (r *ContestRepository) CreateContest(ctx context.Context, title string) (int32, error) { query := r.db.Rebind(createContestQuery) @@ -44,7 +40,7 @@ func (r *ContestRepository) CreateContest(ctx context.Context, title string) (in return id, nil } -const readContestByIdQuery = "SELECT * from contest WHERE id=? LIMIT 1" +const readContestByIdQuery = "SELECT * from contests WHERE id=? LIMIT 1" func (r *ContestRepository) ReadContestById(ctx context.Context, id int32) (*models.Contest, error) { var contest models.Contest @@ -56,7 +52,7 @@ func (r *ContestRepository) ReadContestById(ctx context.Context, id int32) (*mod return &contest, nil } -const deleteContestQuery = "DELETE FROM contest WHERE id=?" +const deleteContestQuery = "DELETE FROM contests WHERE id=?" func (r *ContestRepository) DeleteContest(ctx context.Context, id int32) error { query := r.db.Rebind(deleteContestQuery) @@ -68,7 +64,7 @@ func (r *ContestRepository) DeleteContest(ctx context.Context, id int32) error { return nil } -const addTaskQuery = "INSERT INTO task (problem_id, contest_id, position) VALUES (?, ?,COALESCE(SELECT MAX(position) FROM task WHERE contest_id = ? ,0) + 1) RETURNING id" +const addTaskQuery = "INSERT INTO tasks (problem_id, contest_id, position) VALUES (?, ?,COALESCE(SELECT MAX(position) FROM task WHERE contest_id = ? ,0) + 1) RETURNING id" func (r *ContestRepository) AddTask(ctx context.Context, contestId int32, problem_id int32) (int32, error) { query := r.db.Rebind(addTaskQuery) @@ -86,7 +82,7 @@ func (r *ContestRepository) AddTask(ctx context.Context, contestId int32, proble return id, nil } -const deleteTaskQuery = "DELETE FROM task WHERE id=?" +const deleteTaskQuery = "DELETE FROM tasks WHERE id=?" func (r *ContestRepository) DeleteTask(ctx context.Context, taskId int32) error { query := r.db.Rebind(deleteTaskQuery) @@ -97,7 +93,7 @@ func (r *ContestRepository) DeleteTask(ctx context.Context, taskId int32) error return nil } -const addParticipantQuery = "INSERT INTO participant (user_id ,contest_id, name) VALUES (?, ?, ?) RETURNING id" +const addParticipantQuery = "INSERT INTO participants (user_id ,contest_id, name) VALUES (?, ?, ?) RETURNING id" func (r *ContestRepository) AddParticipant(ctx context.Context, contestId int32, userId int32) (int32, error) { query := r.db.Rebind(addParticipantQuery) @@ -116,7 +112,7 @@ func (r *ContestRepository) AddParticipant(ctx context.Context, contestId int32, return id, nil } -const deleteParticipantQuery = "DELETE FROM participant WHERE id=?" +const deleteParticipantQuery = "DELETE FROM participants WHERE id=?" func (r *ContestRepository) DeleteParticipant(ctx context.Context, participantId int32) error { query := r.db.Rebind(deleteParticipantQuery) @@ -126,18 +122,3 @@ func (r *ContestRepository) DeleteParticipant(ctx context.Context, participantId } return nil } - -func handlePgErr(err error) error { - var pgErr *pgconn.PgError - if !errors.As(err, &pgErr) { - return utils.StorageError(err, utils.ErrUnknown, "unexpected error from postgres") - } - if pgerrcode.IsIntegrityConstraintViolation(pgErr.Code) { - // TODO: probably should specify which constraint - return utils.StorageError(err, utils.ErrConflict, pgErr.Message) - } - if pgerrcode.IsNoData(pgErr.Code) { - return utils.StorageError(err, utils.ErrNotFound, pgErr.Message) - } - return utils.StorageError(err, utils.ErrUnimplemented, "unimplemented error") -} diff --git a/internal/contests/repository/pg_repository_test.go b/internal/tester/repository/pg_contests_repository_test.go similarity index 100% rename from internal/contests/repository/pg_repository_test.go rename to internal/tester/repository/pg_contests_repository_test.go diff --git a/internal/problems/repository/pg_repository.go b/internal/tester/repository/pg_problems_repository.go similarity index 68% rename from internal/problems/repository/pg_repository.go rename to internal/tester/repository/pg_problems_repository.go index e8537f5..6c66414 100644 --- a/internal/problems/repository/pg_repository.go +++ b/internal/tester/repository/pg_problems_repository.go @@ -2,11 +2,7 @@ package repository import ( "context" - "errors" "git.sch9.ru/new_gate/ms-tester/internal/models" - "git.sch9.ru/new_gate/ms-tester/pkg/utils" - "github.com/jackc/pgerrcode" - "github.com/jackc/pgx/v5/pgconn" "github.com/jmoiron/sqlx" "go.uber.org/zap" ) @@ -66,18 +62,3 @@ func (r *ProblemRepository) DeleteProblem(ctx context.Context, id int32) error { return nil } - -func handlePgErr(err error) error { - var pgErr *pgconn.PgError - if !errors.As(err, &pgErr) { - return utils.StorageError(err, utils.ErrUnknown, "unexpected error from postgres") - } - if pgerrcode.IsIntegrityConstraintViolation(pgErr.Code) { - // TODO: probably should specify which constraint - return utils.StorageError(err, utils.ErrConflict, pgErr.Message) - } - if pgerrcode.IsNoData(pgErr.Code) { - return utils.StorageError(err, utils.ErrNotFound, pgErr.Message) - } - return utils.StorageError(err, utils.ErrUnimplemented, "unimplemented error") -} diff --git a/internal/problems/repository/pg_repository_test.go b/internal/tester/repository/pg_problems_repository_test.go similarity index 100% rename from internal/problems/repository/pg_repository_test.go rename to internal/tester/repository/pg_problems_repository_test.go diff --git a/internal/tester/repository/pg_repository.go b/internal/tester/repository/pg_repository.go deleted file mode 100644 index 50a4378..0000000 --- a/internal/tester/repository/pg_repository.go +++ /dev/null @@ -1 +0,0 @@ -package repository diff --git a/internal/tester/usecase.go b/internal/tester/usecase.go index b005777..064dde1 100644 --- a/internal/tester/usecase.go +++ b/internal/tester/usecase.go @@ -2,11 +2,21 @@ package tester import ( "context" + "git.sch9.ru/new_gate/ms-tester/internal/models" ) -type TesterUseCase interface { - CreateSolution(ctx context.Context, taskId int32, solution string, language int32) (int32, error) - ProcessTesting(ctx context.Context, solutionId int32) (<-chan string, error) - ProcessResult(ctx context.Context, solutionId int32, result string) error - TestingChannel() chan int32 +type ProblemUseCase interface { + CreateProblem(ctx context.Context, title string) (int32, error) + ReadProblemById(ctx context.Context, id int32) (*models.Problem, error) + DeleteProblem(ctx context.Context, id int32) error +} + +type ContestUseCase interface { + CreateContest(ctx context.Context, title string) (int32, error) + ReadContestById(ctx context.Context, id int32) (*models.Contest, error) + DeleteContest(ctx context.Context, id int32) error + AddTask(ctx context.Context, contestId int32, taskId int32) (int32, error) + DeleteTask(ctx context.Context, taskId int32) error + AddParticipant(ctx context.Context, contestId int32, userId int32) (int32, error) + DeleteParticipant(ctx context.Context, participantId int32) error } diff --git a/internal/contests/usecase/usecase.go b/internal/tester/usecase/contests_usecase.go similarity index 90% rename from internal/contests/usecase/usecase.go rename to internal/tester/usecase/contests_usecase.go index 633bab3..4c425eb 100644 --- a/internal/contests/usecase/usecase.go +++ b/internal/tester/usecase/contests_usecase.go @@ -2,16 +2,16 @@ package usecase import ( "context" - "git.sch9.ru/new_gate/ms-tester/internal/contests" "git.sch9.ru/new_gate/ms-tester/internal/models" + "git.sch9.ru/new_gate/ms-tester/internal/tester" ) type ContestUseCase struct { - contestRepo contests.ContestRepository + contestRepo tester.ContestRepository } func NewContestUseCase( - contestRepo contests.ContestRepository, + contestRepo tester.ContestRepository, ) *ContestUseCase { return &ContestUseCase{ contestRepo: contestRepo, diff --git a/internal/problems/usecase/usecase.go b/internal/tester/usecase/problems_usecase.go similarity index 64% rename from internal/problems/usecase/usecase.go rename to internal/tester/usecase/problems_usecase.go index 4ba9231..b3eb827 100644 --- a/internal/problems/usecase/usecase.go +++ b/internal/tester/usecase/problems_usecase.go @@ -3,22 +3,21 @@ package usecase import ( "context" "git.sch9.ru/new_gate/ms-tester/internal/models" - "git.sch9.ru/new_gate/ms-tester/internal/problems" - "git.sch9.ru/new_gate/ms-tester/pkg/external/pandoc" + "git.sch9.ru/new_gate/ms-tester/internal/tester" ) type ProblemUseCase struct { - problemRepo problems.ProblemPostgresRepository - pandocClient pandoc.PandocClient + problemRepo tester.ProblemPostgresRepository + //pandocClient pandoc.PandocClient } func NewProblemUseCase( - problemRepo problems.ProblemPostgresRepository, - pandocClient pandoc.PandocClient, + problemRepo tester.ProblemPostgresRepository, + // pandocClient pandoc.PandocClient, ) *ProblemUseCase { return &ProblemUseCase{ - problemRepo: problemRepo, - pandocClient: pandocClient, + problemRepo: problemRepo, + //pandocClient: pandocClient, } } diff --git a/internal/tester/usecase/usecase.go b/internal/tester/usecase/usecase.go deleted file mode 100644 index 18bac8c..0000000 --- a/internal/tester/usecase/usecase.go +++ /dev/null @@ -1,107 +0,0 @@ -package usecase - -import ( - "context" - "errors" - "fmt" - "math/rand" - "sync" -) - -const ( - MaxSimultaneousTestingProcesses = 5000 - MaxMessagesPerSolution = 500 -) - -type TesterUseCase struct { - publicChannels sync.Map - privateChannels sync.Map - testingChannel chan int32 -} - -func NewTesterUseCase() *TesterUseCase { - return &TesterUseCase{ - testingChannel: make(chan int32, MaxSimultaneousTestingProcesses), - } -} - -func (u *TesterUseCase) CreateSolution(ctx context.Context, taskId int32, solution string, language int32) (int32, error) { - return rand.Int31(), nil -} - -func (u *TesterUseCase) ProcessTesting(ctx context.Context, solutionId int32) (<-chan string, error) { - u.testingChannel <- solutionId - - publicChannel := u.newPublicChannel(solutionId) - - go func() { - privateChannel := u.newPrivateChannel(solutionId) - defer func() { - err := u.closeAndDeletePrivateChannel(solutionId) - if err != nil { - panic(err) - } - err = u.closeAndDeletePublicChannel(solutionId) - if err != nil { - panic(err) - } - }() - - c := 0 - for res := range privateChannel { - c += 1 - publicChannel <- res - if c == 15 { - fmt.Println("finished") - break - } - } - }() - - return publicChannel, nil -} - -func (u *TesterUseCase) ProcessResult(ctx context.Context, solutionId int32, result string) error { - ch, ok := u.privateChannels.Load(solutionId) - if !ok { - return errors.New("") - } - ch.(chan string) <- result - return nil -} - -func (u *TesterUseCase) TestingChannel() chan int32 { - return u.testingChannel -} - -func (u *TesterUseCase) newPublicChannel(solutionId int32) chan string { - userCh := make(chan string, MaxMessagesPerSolution) - u.publicChannels.Store(solutionId, userCh) - return userCh -} - -func (u *TesterUseCase) newPrivateChannel(solutionId int32) chan string { - userCh := make(chan string, MaxMessagesPerSolution) - u.privateChannels.Store(solutionId, userCh) - return userCh -} - -func (u *TesterUseCase) closeAndDeletePublicChannel(solutionId int32) error { - ch, ok := u.publicChannels.Load(solutionId) - if !ok { - return errors.New("") - } - close(ch.(chan string)) - u.publicChannels.Delete(solutionId) - return nil -} - -func (u *TesterUseCase) closeAndDeletePrivateChannel(solutionId int32) error { - ch, ok := u.privateChannels.Load(solutionId) - if !ok { - return errors.New("") - } - close(ch.(chan string)) - u.privateChannels.Delete(solutionId) - return nil -} diff --git a/main.go b/main.go index b0fd5e7..950e3cc 100644 --- a/main.go +++ b/main.go @@ -3,25 +3,15 @@ package main import ( "fmt" "git.sch9.ru/new_gate/ms-tester/config" - contestsDelivery "git.sch9.ru/new_gate/ms-tester/internal/contests/delivery/grpc" - contestsRepository "git.sch9.ru/new_gate/ms-tester/internal/contests/repository" - contestsUseCase "git.sch9.ru/new_gate/ms-tester/internal/contests/usecase" - problemsDelivery "git.sch9.ru/new_gate/ms-tester/internal/problems/delivery/grpc" - problemsSub "git.sch9.ru/new_gate/ms-tester/internal/problems/delivery/rabbitmq" - problemsRepository "git.sch9.ru/new_gate/ms-tester/internal/problems/repository" - problemsUseCase "git.sch9.ru/new_gate/ms-tester/internal/problems/usecase" - testerDelivery "git.sch9.ru/new_gate/ms-tester/internal/tester/delivery/grpc" - testerPubSub "git.sch9.ru/new_gate/ms-tester/internal/tester/delivery/rabbitmq" + "git.sch9.ru/new_gate/ms-tester/internal/tester/delivery/rest" + problemsRepository "git.sch9.ru/new_gate/ms-tester/internal/tester/repository" testerUseCase "git.sch9.ru/new_gate/ms-tester/internal/tester/usecase" - "git.sch9.ru/new_gate/ms-tester/pkg/external/pandoc" "git.sch9.ru/new_gate/ms-tester/pkg/external/postgres" - "git.sch9.ru/new_gate/ms-tester/pkg/external/rabbitmq" + testerv1 "git.sch9.ru/new_gate/ms-tester/proto/tester/v1" + "github.com/gofiber/fiber/v2" + fiberlogger "github.com/gofiber/fiber/v2/middleware/logger" "github.com/ilyakaznacheev/cleanenv" "go.uber.org/zap" - "google.golang.org/grpc" - "google.golang.org/grpc/reflection" - "net" - "net/http" "os" "os/signal" "syscall" @@ -43,65 +33,46 @@ func main() { panic(fmt.Sprintf(`error reading config: env expected "prod" or "dev", got "%s"`, cfg.Env)) } + logger.Info("connecting to postgres") db, err := postgres.NewPostgresDB(cfg.PostgresDSN) if err != nil { panic(err) } defer db.Close() + logger.Info("successfully connected to postgres") - pandocClient := pandoc.NewPandocClient(&http.Client{}, cfg.Pandoc) + //pandocClient := pandoc.NewPandocClient(&http.Client{}, cfg.Pandoc) problemRepo := problemsRepository.NewProblemRepository(db, logger) - problemUC := problemsUseCase.NewProblemUseCase(problemRepo, pandocClient) + problemUC := testerUseCase.NewProblemUseCase(problemRepo) - contestRepo := contestsRepository.NewContestRepository(db, logger) - contestUC := contestsUseCase.NewContestUseCase(contestRepo) + contestRepo := problemsRepository.NewContestRepository(db, logger) + contestUC := testerUseCase.NewContestUseCase(contestRepo) - testerUC := testerUseCase.NewTesterUseCase() + server := fiber.New() - conn, err := rabbitmq.NewRabbitClient(cfg.RabbitDSN) - if err != nil { - panic(err) - } - defer conn.Close() - ch, err := conn.Channel() - if err != nil { - panic(err) - } - defer ch.Close() - err = ch.Qos( - 1, - 0, - true, - ) - if err != nil { - panic(err) - } - - problemsSub.NewNotificationSubscriber(ch, cfg.NQueueName, cfg.InstanceName, problemUC) - - testerPubSub.NewTesterProducer(ch, cfg.TQueueName, cfg.RQueueName, testerUC) - testerPubSub.NewTesterConsumer(ch, cfg.RQueueName, cfg.InstanceName, testerUC) - - gserver := grpc.NewServer() - defer gserver.GracefulStop() - - problemsDelivery.NewProblemHandlers(gserver, problemUC) - contestsDelivery.NewContestHandlers(gserver, contestUC) - testerDelivery.NewTesterHandlers(gserver, testerUC) - reflection.Register(gserver) - - ln, err := net.Listen("tcp", cfg.Address) - if err != nil { - panic(err) - } + testerv1.RegisterHandlersWithOptions(server, rest.NewTesterHandlers(problemUC, contestUC), testerv1.FiberServerOptions{ + Middlewares: []testerv1.MiddlewareFunc{ + fiberlogger.New(), + //rest.AuthMiddleware(cfg.JWTSecret, userUC), + //cors.New(cors.Config{ + // AllowOrigins: "http://localhost:3000", + // AllowMethods: "GET,POST,PUT,DELETE,OPTIONS", + // AllowHeaders: "Content-Type,Set-Cookie,Credentials", + // AllowCredentials: true, + //}), + }, + }) go func() { - if err = gserver.Serve(ln); err != nil { - panic(err) + err := server.Listen(cfg.Address) + if err != nil { + logger.Fatal(fmt.Sprintf("error starting server: %s", err.Error())) } }() - fmt.Println("server started") + + logger.Info(fmt.Sprintf("server started on %s", cfg.Address)) + stop := make(chan os.Signal, 1) signal.Notify(stop, syscall.SIGTERM, syscall.SIGINT) diff --git a/migrations/20240727123308_initial.sql b/migrations/20240727123308_initial.sql index 8b40b4c..0ca2e5b 100644 --- a/migrations/20240727123308_initial.sql +++ b/migrations/20240727123308_initial.sql @@ -1,5 +1,14 @@ -- +goose Up -- +goose StatementBegin +CREATE FUNCTION updated_at_update() RETURNS TRIGGER + LANGUAGE plpgsql AS +$$ +BEGIN + NEW.updated_at = NOW(); +RETURN NEW; +END; +$$; + CREATE TABLE IF NOT EXISTS problems ( id serial NOT NULL, @@ -103,15 +112,6 @@ CREATE TRIGGER on_solutions_update FOR EACH ROW EXECUTE PROCEDURE updated_at_update(); -CREATE FUNCTION updated_at_update() RETURNS TRIGGER - LANGUAGE plpgsql AS -$$ -BEGIN - NEW.updated_at = NOW(); - RETURN NEW; -END; -$$; - -- +goose StatementEnd -- +goose Down