From 2dc837be389a51a493bd6bf37c35c0cc0e0850a3 Mon Sep 17 00:00:00 2001 From: Pasha Date: Fri, 15 Nov 2024 14:21:04 +0300 Subject: [PATCH] update with pagination --- blueprint.yaml | 1 + database.puml | 20 ++--- go.mod | 22 +++-- go.sum | 34 ++++++++ internal/controllers/promocode.go | 104 ++++++++++++------------ internal/controllers/recover.go | 16 ++-- internal/models/discount.go | 4 +- internal/models/editpromocodereq.go | 8 +- internal/models/getpromocodeslistreq.go | 4 +- internal/models/privilege.go | 4 +- internal/models/promocode.go | 20 ++--- internal/models/promocodereq.go | 4 +- internal/repository/promocode.go | 65 +++++++++------ internal/repository/recover.go | 19 ++++- internal/repository/stats.go | 15 +++- internal/service/promocode.go | 60 +++++++------- internal/service/recover.go | 8 +- internal/sqlc/db_query/queries.sql | 5 ++ sqlc.yaml | 15 ++++ 19 files changed, 268 insertions(+), 160 deletions(-) create mode 100644 internal/sqlc/db_query/queries.sql create mode 100644 sqlc.yaml diff --git a/blueprint.yaml b/blueprint.yaml index f7da08a..8fe7f66 100644 --- a/blueprint.yaml +++ b/blueprint.yaml @@ -18,3 +18,4 @@ Modules: service_save_path: ./internal/service repository_save_path: ./internal/repository server_save_path: ./internal/server/http + db: postgres diff --git a/database.puml b/database.puml index e723239..b722dd3 100644 --- a/database.puml +++ b/database.puml @@ -12,6 +12,11 @@ map Discount { threshold => **integer** } +map Filter { + active => **boolean** + text => **string** +} + map Privilege { amount => **integer** privilegeID => **string** @@ -19,17 +24,17 @@ map Privilege { map PromoCode { id => **string** //primary_key// + createdAt => **string** //date-time// + dueTo => **integer** + offLimit => **boolean** + codeword => **string** + outdated => **boolean** activationCount => **integer** bonus => **bonus** - codeword => **string** - createdAt => **string** //date-time// delete => **boolean** description => **string** fastLinks => **[]string** - dueTo => **integer** greetings => **string** - offLimit => **boolean** - outdated => **boolean** } map Bonus { @@ -37,11 +42,6 @@ map Bonus { privilege => **privilege** } -map Filter { - active => **boolean** - text => **string** -} - Bonus::discount -> Discount Bonus::privilege -> Privilege diff --git a/go.mod b/go.mod index 36a0201..b6d6699 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module codeword -go 1.21 +go 1.21.0 + +toolchain go1.23.1 require ( github.com/caarlos0/env/v8 v8.0.0 @@ -10,7 +12,7 @@ require ( github.com/joho/godotenv v1.5.1 github.com/pioz/faker v1.7.3 github.com/rs/xid v1.5.0 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 github.com/twmb/franz-go v1.15.4 go.mongodb.org/mongo-driver v1.13.1 go.uber.org/zap v1.27.0 @@ -25,18 +27,27 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/getkin/kin-openapi v0.122.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.1 // indirect github.com/google/uuid v1.4.0 // indirect + github.com/invopop/yaml v0.3.1 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/klauspost/compress v1.16.7 // indirect - github.com/kr/pretty v0.1.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/mailru/easyjson v0.7.7 // 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.15 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect + github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/pierrec/lz4/v4 v4.1.19 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rivo/uniseg v0.2.0 // indirect + github.com/rs/zerolog v1.33.0 // indirect github.com/twmb/franz-go/pkg/kmsg v1.7.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.50.0 // indirect @@ -49,10 +60,11 @@ require ( golang.org/x/crypto v0.17.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/sys v0.17.0 // indirect golang.org/x/text v0.14.0 // indirect google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect - gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + penahub.gitlab.yandexcloud.net/pena-services/blueprint v0.0.0-20241114114746-100696f35c90 // indirect ) diff --git a/go.sum b/go.sum index 0b63c53..dfaa89c 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ github.com/caarlos0/env/v8 v8.0.0 h1:POhxHhSpuxrLMIdvTGARuZqR4Jjm8AYmoi/JKlcScs0 github.com/caarlos0/env/v8 v8.0.0/go.mod h1:7K4wMY9bH0esiXSSHlfHLX5xKGQMnkH5Fk4TDSSSzfo= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -11,8 +13,15 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/r github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/getkin/kin-openapi v0.122.0 h1:WB9Jbl0Hp/T79/JF9xlSW5Kl9uYdk/AWD0yAd9HOM10= +github.com/getkin/kin-openapi v0.122.0/go.mod h1:PCWw/lfBrJY4HcdqE3jj+QFkaFK8ABoqo7PvqVhXXqw= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofiber/fiber/v2 v2.51.0 h1:JNACcZy5e2tGApWB2QrRpenTWn0fq0hkFm6k0C86gKQ= github.com/gofiber/fiber/v2 v2.51.0/go.mod h1:xaQRZQJGqnKOQnbQw+ltvku3/h8QxvNi8o6JiJ7Ll0U= github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= @@ -28,24 +37,35 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso= +github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= 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.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 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.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= @@ -54,20 +74,28 @@ github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= +github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/pierrec/lz4/v4 v4.1.19 h1:tYLzDnjDXh9qIxSTKHwXwOYmm9d887Y7Y1ZkyXYHAN4= github.com/pierrec/lz4/v4 v4.1.19/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pioz/faker v1.7.3 h1:Tez8Emuq0UN+/d6mo3a9m/9ZZ/zdfJk0c5RtRatrceM= github.com/pioz/faker v1.7.3/go.mod h1:xSpay5w/oz1a6+ww0M3vfpe40pSIykeUPeWEc3TvVlc= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/twmb/franz-go v1.15.4 h1:qBCkHaiutetnrXjAUWA99D9FEcZVMt2AYwkH3vWEQTw= github.com/twmb/franz-go v1.15.4/go.mod h1:rC18hqNmfo8TMc1kz7CQmHL74PLNF8KVvhflxiiJZCU= github.com/twmb/franz-go/pkg/kmsg v1.7.0 h1:a457IbvezYfA5UkiBvyV3zj0Is3y1i8EJgqjJYoij2E= @@ -121,8 +149,11 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/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.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -153,6 +184,7 @@ google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHh gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= @@ -162,3 +194,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240202120244-c4ef330cfe5d h1:gbaDt35HMDqOK84WYmDIlXMI7rstUcRqNttaT6Kx1do= penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240202120244-c4ef330cfe5d/go.mod h1:lTmpjry+8evVkXWbEC+WMOELcFkRD1lFMc7J09mOndM= +penahub.gitlab.yandexcloud.net/pena-services/blueprint v0.0.0-20241114114746-100696f35c90 h1:sSDKSdjexf5e6BOOxcuODf9FrctQGtDPb/udma5nq18= +penahub.gitlab.yandexcloud.net/pena-services/blueprint v0.0.0-20241114114746-100696f35c90/go.mod h1:NJEEmcYZDD5IzHOMvGgCWwtE0T6nNnaCBEQKPRapHts= diff --git a/internal/controllers/promocode.go b/internal/controllers/promocode.go index 2602850..f601d57 100644 --- a/internal/controllers/promocode.go +++ b/internal/controllers/promocode.go @@ -19,24 +19,70 @@ func NewPromocodeController(service *service.PromocodeService) *PromocodeControl func (c *PromocodeController) Register(router fiber.Router) { + router.Post("/promocode/activate", c.Activate) + + router.Post("/promocode/getList", c.Getlist) + + router.Delete("/promocode/{promocodeID}", c.Delete) + router.Post("/promocode/create", c.Createpromocode) router.Put("/promocode/edit", c.Editpromocode) router.Post("/promocode/fastlink", c.Createfastlink) - router.Delete("/promocode/{promocodeID}", c.Delete) - - router.Post("/promocode/activate", c.Activate) - - router.Post("/promocode/getList", c.Getlist) - } func (c *PromocodeController) Name() string { return "" } +func (c *PromocodeController) Activate(ctx *fiber.Ctx) error { + // Обработчик для метода Activate + + var request models.ActivateReq + if err := ctx.BodyParser(&request); err != nil { + return ctx.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid request payload"}) + } + + response, err := c.PromocodeService.Activate(ctx.Context(), &request) + + if err != nil { + return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error") + } + return ctx.Status(fiber.StatusOK).JSON(response) + +} + +func (c *PromocodeController) Getlist(ctx *fiber.Ctx) error { + // Обработчик для метода Getlist + + var request models.GetPromoCodesListReq + if err := ctx.BodyParser(&request); err != nil { + return ctx.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid request payload"}) + } + + response, err := c.PromocodeService.Getlist(ctx.Context(), &request) + + if err != nil { + return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error") + } + return ctx.Status(fiber.StatusOK).JSON(response) + +} + +func (c *PromocodeController) Delete(ctx *fiber.Ctx) error { + // Обработчик для метода Delete + + err := c.PromocodeService.Delete(ctx.Context()) + + if err != nil { + return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error") + } + return ctx.SendStatus(fiber.StatusOK) + +} + func (c *PromocodeController) Createpromocode(ctx *fiber.Ctx) error { // Обработчик для метода Createpromocode @@ -87,49 +133,3 @@ func (c *PromocodeController) Createfastlink(ctx *fiber.Ctx) error { return ctx.Status(fiber.StatusOK).JSON(response) } - -func (c *PromocodeController) Delete(ctx *fiber.Ctx) error { - // Обработчик для метода Delete - - err := c.PromocodeService.Delete(ctx.Context()) - - if err != nil { - return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error") - } - return ctx.SendStatus(fiber.StatusOK) - -} - -func (c *PromocodeController) Activate(ctx *fiber.Ctx) error { - // Обработчик для метода Activate - - var request models.ActivateReq - if err := ctx.BodyParser(&request); err != nil { - return ctx.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid request payload"}) - } - - response, err := c.PromocodeService.Activate(ctx.Context(), &request) - - if err != nil { - return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error") - } - return ctx.Status(fiber.StatusOK).JSON(response) - -} - -func (c *PromocodeController) Getlist(ctx *fiber.Ctx) error { - // Обработчик для метода Getlist - - var request models.GetPromoCodesListReq - if err := ctx.BodyParser(&request); err != nil { - return ctx.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid request payload"}) - } - - response, err := c.PromocodeService.Getlist(ctx.Context(), &request) - - if err != nil { - return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error") - } - return ctx.Status(fiber.StatusOK).JSON(response) - -} diff --git a/internal/controllers/recover.go b/internal/controllers/recover.go index dfe1c05..a0696ea 100644 --- a/internal/controllers/recover.go +++ b/internal/controllers/recover.go @@ -19,13 +19,13 @@ func NewRecoverController(service *service.RecoverService) *RecoverController { func (c *RecoverController) Register(router fiber.Router) { - router.Get("/readiness", c.Readiness) + router.Get("/liveness", c.Liveness) router.Post("/recover", c.Recovery) router.Get("/recover/{sign}", c.Recoverylink) - router.Get("/liveness", c.Liveness) + router.Get("/readiness", c.Readiness) } @@ -33,10 +33,10 @@ func (c *RecoverController) Name() string { return "" } -func (c *RecoverController) Readiness(ctx *fiber.Ctx) error { - // Обработчик для метода Readiness +func (c *RecoverController) Liveness(ctx *fiber.Ctx) error { + // Обработчик для метода Liveness - err := c.RecoverService.Readiness(ctx.Context()) + err := c.RecoverService.Liveness(ctx.Context()) if err != nil { return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error") @@ -74,10 +74,10 @@ func (c *RecoverController) Recoverylink(ctx *fiber.Ctx) error { } -func (c *RecoverController) Liveness(ctx *fiber.Ctx) error { - // Обработчик для метода Liveness +func (c *RecoverController) Readiness(ctx *fiber.Ctx) error { + // Обработчик для метода Readiness - err := c.RecoverService.Liveness(ctx.Context()) + err := c.RecoverService.Readiness(ctx.Context()) if err != nil { return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error") diff --git a/internal/models/discount.go b/internal/models/discount.go index 9c08e7b..22ace44 100644 --- a/internal/models/discount.go +++ b/internal/models/discount.go @@ -1,12 +1,12 @@ package models type Discount struct { - /* - Уровень скидки*/ - Layer int `json:"layer"` /* - Цель скидки*/ Target string `json:"target"` /* - Порог скидки*/ Threshold int `json:"threshold"` /* - Множитель скидки*/ Factor int `json:"factor"` + /* - Уровень скидки*/ + Layer int `json:"layer"` } diff --git a/internal/models/editpromocodereq.go b/internal/models/editpromocodereq.go index d689031..79b75eb 100644 --- a/internal/models/editpromocodereq.go +++ b/internal/models/editpromocodereq.go @@ -1,6 +1,10 @@ package models type EditPromoCodeReq struct { + /* - Приветственное сообщение после активации промокода*/ + Greetings string `json:"Greetings"` + /* - Идентификатор промокода, который требуется обновить*/ + ID string `json:"ID"` /* - Количество активаций промокода*/ Activationcount int `json:"ActivationCount"` /* - Флаг удаления промокода*/ @@ -9,8 +13,4 @@ type EditPromoCodeReq struct { Description string `json:"Description"` /* - Дата окончания промокода в формате Unix time*/ Dueto int `json:"DueTo"` - /* - Приветственное сообщение после активации промокода*/ - Greetings string `json:"Greetings"` - /* - Идентификатор промокода, который требуется обновить*/ - ID string `json:"ID"` } diff --git a/internal/models/getpromocodeslistreq.go b/internal/models/getpromocodeslistreq.go index 40ed511..0d4eab3 100644 --- a/internal/models/getpromocodeslistreq.go +++ b/internal/models/getpromocodeslistreq.go @@ -1,10 +1,10 @@ package models type GetPromoCodesListReq struct { + /* - Номер страницы*/ + Page int `json:"page"` /* - */ Filter Filter `json:"filter"` /* - Максимальное количество элементов на странице*/ Limit int `json:"limit"` - /* - Номер страницы*/ - Page int `json:"page"` } diff --git a/internal/models/privilege.go b/internal/models/privilege.go index 53ae962..a1a7373 100644 --- a/internal/models/privilege.go +++ b/internal/models/privilege.go @@ -1,8 +1,8 @@ package models type Privilege struct { - /* - Количество привилегии*/ - Amount int `json:"amount"` /* - Идентификатор привилегии*/ Privilegeid string `json:"privilegeID"` + /* - Количество привилегии*/ + Amount int `json:"amount"` } diff --git a/internal/models/promocode.go b/internal/models/promocode.go index aae1de6..5e9d24c 100644 --- a/internal/models/promocode.go +++ b/internal/models/promocode.go @@ -3,26 +3,26 @@ package models type PromoCode struct { /* - Идентификатор промокода*/ ID string `json:"id"` - /* - Количество активаций промокода*/ - Activationcount int `json:"activationCount"` /* - Бонус, предоставляемый с промокодом*/ Bonus Bonus `json:"bonus"` - /* - Кодовое слово для активации промокода*/ - Codeword string `json:"codeword"` - /* - Дата и время создания промокода*/ - Createdat string `json:"createdAt"` /* - Флаг*/ Delete bool `json:"delete"` /* - Описание промокода*/ Description string `json:"description"` /* - Список быстрых ссылок для активации промокода*/ Fastlinks []string `json:"fastLinks"` - /* - Дата истечения действия промокода в формате Unix time*/ - Dueto int `json:"dueTo"` /* - Приветственное сообщение после активации промокода*/ Greetings string `json:"greetings"` - /* - Флаг*/ - Offlimit bool `json:"offLimit"` + /* - Количество активаций промокода*/ + Activationcount int `json:"activationCount"` /* - Флаг*/ Outdated bool `json:"outdated"` + /* - Кодовое слово для активации промокода*/ + Codeword string `json:"codeword"` + /* - Дата и время создания промокода*/ + Createdat string `json:"createdAt"` + /* - Дата истечения действия промокода в формате Unix time*/ + Dueto int `json:"dueTo"` + /* - Флаг*/ + Offlimit bool `json:"offLimit"` } diff --git a/internal/models/promocodereq.go b/internal/models/promocodereq.go index 98fc76f..40d5530 100644 --- a/internal/models/promocodereq.go +++ b/internal/models/promocodereq.go @@ -1,8 +1,6 @@ package models type PromoCodeReq struct { - /* - Количество активаций промокода*/ - Activationcount int `json:"activationCount"` /* - Бонус*/ Bonus Bonus `json:"bonus"` /* - Кодовое слово для активации промокода*/ @@ -15,4 +13,6 @@ type PromoCodeReq struct { Fastlinks []string `json:"fastLinks"` /* - Приветственное сообщение после активации промокода*/ Greetings string `json:"greetings"` + /* - Количество активаций промокода*/ + Activationcount int `json:"activationCount"` } diff --git a/internal/repository/promocode.go b/internal/repository/promocode.go index 8925a49..7973446 100644 --- a/internal/repository/promocode.go +++ b/internal/repository/promocode.go @@ -3,13 +3,53 @@ package repository import ( "codeword/internal/models" "context" + "database/sql" ) type PromocodeRepository struct { + queries *sqlcgen.Queries + pool *sql.DB } -func NewPromocodeRepository() *PromocodeRepository { - return &PromocodeRepository{} +type PromocodeDeps struct { + Queries *sqlcgen.Queries + Pool *sql.DB +} + +func NewPromocodeRepository(deps PromocodeDeps) *PromocodeRepository { + return &PromocodeRepository{ + queries: deps.Queries, + pool: deps.Pool, + } +} + +func (r *PromocodeRepository) Activate(ctx context.Context, request *models.ActivateReq) (*models.ActivateResp, error) { + //TODO:IMPLEMENT ME + + return &models.ActivateResp{}, nil + +} + +func (r *PromocodeRepository) Getlist(ctx context.Context, request *models.GetPromoCodesListReq) (*models.GetPromoCodesListResp, error) { + + rows, err := r.queries.Getlist(ctx, sqlcgen.GetlistParams{ + Page: request.Page, + Limit: request.Size, + }) + + if err != nil { + return nil, err + } + + return &models.GetPromoCodesListResp{}, nil + +} + +func (r *PromocodeRepository) Delete(ctx context.Context) error { + //TODO:IMPLEMENT ME + + return nil + } func (r *PromocodeRepository) Createpromocode(ctx context.Context, request *models.PromoCodeReq) (*models.PromoCode, error) { @@ -32,24 +72,3 @@ func (r *PromocodeRepository) Createfastlink(ctx context.Context, request *model return &models.CreateFastLinkResp{}, nil } - -func (r *PromocodeRepository) Delete(ctx context.Context) error { - //TODO:IMPLEMENT ME - - return nil - -} - -func (r *PromocodeRepository) Activate(ctx context.Context, request *models.ActivateReq) (*models.ActivateResp, error) { - //TODO:IMPLEMENT ME - - return &models.ActivateResp{}, nil - -} - -func (r *PromocodeRepository) Getlist(ctx context.Context, request *models.GetPromoCodesListReq) (*models.GetPromoCodesListResp, error) { - //TODO:IMPLEMENT ME - - return &models.GetPromoCodesListResp{}, nil - -} diff --git a/internal/repository/recover.go b/internal/repository/recover.go index a442e0e..6626648 100644 --- a/internal/repository/recover.go +++ b/internal/repository/recover.go @@ -3,16 +3,27 @@ package repository import ( "codeword/internal/models" "context" + "database/sql" ) type RecoverRepository struct { + queries *sqlcgen.Queries + pool *sql.DB } -func NewRecoverRepository() *RecoverRepository { - return &RecoverRepository{} +type RecoverDeps struct { + Queries *sqlcgen.Queries + Pool *sql.DB } -func (r *RecoverRepository) Readiness(ctx context.Context) error { +func NewRecoverRepository(deps RecoverDeps) *RecoverRepository { + return &RecoverRepository{ + queries: deps.Queries, + pool: deps.Pool, + } +} + +func (r *RecoverRepository) Liveness(ctx context.Context) error { //TODO:IMPLEMENT ME return nil @@ -33,7 +44,7 @@ func (r *RecoverRepository) Recoverylink(ctx context.Context) error { } -func (r *RecoverRepository) Liveness(ctx context.Context) error { +func (r *RecoverRepository) Readiness(ctx context.Context) error { //TODO:IMPLEMENT ME return nil diff --git a/internal/repository/stats.go b/internal/repository/stats.go index 285cf89..e828336 100644 --- a/internal/repository/stats.go +++ b/internal/repository/stats.go @@ -3,13 +3,24 @@ package repository import ( "codeword/internal/models" "context" + "database/sql" ) type StatsRepository struct { + queries *sqlcgen.Queries + pool *sql.DB } -func NewStatsRepository() *StatsRepository { - return &StatsRepository{} +type StatsDeps struct { + Queries *sqlcgen.Queries + Pool *sql.DB +} + +func NewStatsRepository(deps StatsDeps) *StatsRepository { + return &StatsRepository{ + queries: deps.Queries, + pool: deps.Pool, + } } func (r *StatsRepository) Getstats(ctx context.Context, request *models.PromoCodeStatsReq) (*models.PromoCodeStatsResp, error) { diff --git a/internal/service/promocode.go b/internal/service/promocode.go index de03788..b8d9b02 100644 --- a/internal/service/promocode.go +++ b/internal/service/promocode.go @@ -16,6 +16,36 @@ func NewPromocodeService(repository *repository.PromocodeRepository) *PromocodeS } } +func (s *PromocodeService) Activate(ctx context.Context, request *models.ActivateReq) (*models.ActivateResp, error) { + + response, err := s.PromocodeRepository.Activate(ctx, request) + if err != nil { + return nil, err + } + return response, nil + +} + +func (s *PromocodeService) Getlist(ctx context.Context, request *models.GetPromoCodesListReq) (*models.GetPromoCodesListResp, error) { + + response, err := s.PromocodeRepository.Getlist(ctx, request) + if err != nil { + return nil, err + } + return response, nil + +} + +func (s *PromocodeService) Delete(ctx context.Context) error { + + err := s.PromocodeRepository.Delete(ctx) + if err != nil { + return err + } + return nil + +} + func (s *PromocodeService) Createpromocode(ctx context.Context, request *models.PromoCodeReq) (*models.PromoCode, error) { response, err := s.PromocodeRepository.Createpromocode(ctx, request) @@ -45,33 +75,3 @@ func (s *PromocodeService) Createfastlink(ctx context.Context, request *models.C return response, nil } - -func (s *PromocodeService) Delete(ctx context.Context) error { - - err := s.PromocodeRepository.Delete(ctx) - if err != nil { - return err - } - return nil - -} - -func (s *PromocodeService) Activate(ctx context.Context, request *models.ActivateReq) (*models.ActivateResp, error) { - - response, err := s.PromocodeRepository.Activate(ctx, request) - if err != nil { - return nil, err - } - return response, nil - -} - -func (s *PromocodeService) Getlist(ctx context.Context, request *models.GetPromoCodesListReq) (*models.GetPromoCodesListResp, error) { - - response, err := s.PromocodeRepository.Getlist(ctx, request) - if err != nil { - return nil, err - } - return response, nil - -} diff --git a/internal/service/recover.go b/internal/service/recover.go index b6185dc..f8b97ca 100644 --- a/internal/service/recover.go +++ b/internal/service/recover.go @@ -16,9 +16,9 @@ func NewRecoverService(repository *repository.RecoverRepository) *RecoverService } } -func (s *RecoverService) Readiness(ctx context.Context) error { +func (s *RecoverService) Liveness(ctx context.Context) error { - err := s.RecoverRepository.Readiness(ctx) + err := s.RecoverRepository.Liveness(ctx) if err != nil { return err } @@ -46,9 +46,9 @@ func (s *RecoverService) Recoverylink(ctx context.Context) error { } -func (s *RecoverService) Liveness(ctx context.Context) error { +func (s *RecoverService) Readiness(ctx context.Context) error { - err := s.RecoverRepository.Liveness(ctx) + err := s.RecoverRepository.Readiness(ctx) if err != nil { return err } diff --git a/internal/sqlc/db_query/queries.sql b/internal/sqlc/db_query/queries.sql new file mode 100644 index 0000000..98bf263 --- /dev/null +++ b/internal/sqlc/db_query/queries.sql @@ -0,0 +1,5 @@ +-- name: Getlist :many +SELECT * +FROM {{ .TableName }} AS a +ORDER BY a.created_at DESC +LIMIT $2 OFFSET ($1-1)*$2; diff --git a/sqlc.yaml b/sqlc.yaml new file mode 100644 index 0000000..1c66c25 --- /dev/null +++ b/sqlc.yaml @@ -0,0 +1,15 @@ +version: "1" +packages: + - name: "sqlcgen" + path: ".internal/sqlc/sqlcgen" + queries: ".internal/sqlc/db_query/queries.sql" + schema: + - "todo" + engine: "postgresql" + emit_json_tags: true + emit_db_tags: true + emit_prepared_queries: false + emit_interface: false + emit_exact_table_names: false + emit_empty_slices: false + sql_package: "database/sql"