From 8ea49a32ac3286232d76aeccf4e0d93a72e22e46 Mon Sep 17 00:00:00 2001 From: Pavel Date: Fri, 12 Jul 2024 11:26:15 +0300 Subject: [PATCH] separate one server on two admin and client servers --- go.sum | 16 ++-- internal/app/app.go | 46 ++++++++-- .../admin_promocode}/promocode_controller.go | 63 +------------ .../admin_promocode}/route.go | 3 +- .../admin_recovery/recovery_controller.go | 50 ++++++++++ .../controller/admin/admin_recovery/route.go | 12 +++ .../client_promocode/promocode_controller.go | 91 +++++++++++++++++++ .../client/client_promocode/route.go | 11 +++ .../client_recovery}/recovery_controller.go | 21 +---- .../client_recovery}/route.go | 4 +- internal/initialize/config.go | 6 +- 11 files changed, 216 insertions(+), 107 deletions(-) rename internal/controller/{promocode => admin/admin_promocode}/promocode_controller.go (79%) rename internal/controller/{promocode => admin/admin_promocode}/route.go (87%) create mode 100644 internal/controller/admin/admin_recovery/recovery_controller.go create mode 100644 internal/controller/admin/admin_recovery/route.go create mode 100644 internal/controller/client/client_promocode/promocode_controller.go create mode 100644 internal/controller/client/client_promocode/route.go rename internal/controller/{recovery => client/client_recovery}/recovery_controller.go (87%) rename internal/controller/{recovery => client/client_recovery}/route.go (72%) diff --git a/go.sum b/go.sum index 9d70600..b4e6802 100644 --- a/go.sum +++ b/go.sum @@ -5,6 +5,7 @@ github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHg github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bkaradzic/go-lz4 v1.0.0 h1:RXc4wYsyz985CkXXeX04y4VnZFGG8Rd43pRaHsOXAKk= github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4= github.com/caarlos0/env/v8 v8.0.0 h1:POhxHhSpuxrLMIdvTGARuZqR4Jjm8AYmoi/JKlcScs0= github.com/caarlos0/env/v8 v8.0.0/go.mod h1:7K4wMY9bH0esiXSSHlfHLX5xKGQMnkH5Fk4TDSSSzfo= @@ -24,6 +25,8 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= 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/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -91,6 +94,7 @@ github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042 github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.19 h1:tYLzDnjDXh9qIxSTKHwXwOYmm9d887Y7Y1ZkyXYHAN4= github.com/pierrec/lz4/v4 v4.1.19/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= @@ -120,6 +124,8 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/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/themakers/bdd v0.0.0-20210316111417-6b1dfe326f33 h1:N9f/Q+2Ssa+yDcbfaoLTYvXmdeyUUxsJKdPUVsjSmiA= +github.com/themakers/bdd v0.0.0-20210316111417-6b1dfe326f33/go.mod h1:rpcH99JknBh8seZmlOlUg51gasZH6QH34oXNsIwYT6E= github.com/themakers/hlog v0.0.0-20191205140925-235e0e4baddf h1:TJJm6KcBssmbWzplF5lzixXl1RBAi/ViPs1GaSOkhwo= github.com/themakers/hlog v0.0.0-20191205140925-235e0e4baddf/go.mod h1:1FsorU3vnXO9xS9SrhUp8fRb/6H/Zfll0rPt1i4GWaA= github.com/twmb/franz-go v1.15.4 h1:qBCkHaiutetnrXjAUWA99D9FEcZVMt2AYwkH3vWEQTw= @@ -150,8 +156,8 @@ go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwD go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= -go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= +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.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= @@ -159,8 +165,6 @@ go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -287,10 +291,6 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -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/backend/penahub_common v0.0.0-20240607142502-8257e6c4aa5a h1:dGW8ErUVdwGJBq6uc5AHYn6Yt10CDNkMIpV+yrDDTLs= -penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240607142502-8257e6c4aa5a/go.mod h1:+bPxq2wfW5S1gd+83vZYmHm33AE7nEBfznWS8AM1TKE= penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240607202348-efe5f2bf3e8c h1:CWb4UcuNXhd1KTNOmy2U0TJO4+Qxgxrj5cwkyFqbgrk= penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240607202348-efe5f2bf3e8c/go.mod h1:+bPxq2wfW5S1gd+83vZYmHm33AE7nEBfznWS8AM1TKE= penahub.gitlab.yandexcloud.net/devops/linters/golang.git v0.0.0-20240725131128-102f5d56f156 h1:IpItA0b6uvawjNk3KzI5X92Z7Iwn1FX7s2TfcJ8tRus= diff --git a/internal/app/app.go b/internal/app/app.go index 1095cea..3e06a12 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -1,8 +1,10 @@ package app import ( - "codeword/internal/controller/promocode" - "codeword/internal/controller/recovery" + "codeword/internal/controller/admin/admin_promocode" + "codeword/internal/controller/admin/admin_recovery" + "codeword/internal/controller/client/client_promocode" + "codeword/internal/controller/client/client_recovery" "codeword/internal/controller/rpc_controllers" "codeword/internal/initialize" "codeword/internal/models" @@ -128,13 +130,21 @@ func Run(ctx context.Context, cfg initialize.Config, logger *zap.Logger, build B jwtUtil := middleware.NewJWT(&cfg) - recoveryController := recovery.NewRecoveryController(recovery.Deps{ + clientRecoveryController := client_recovery.NewRecoveryController(client_recovery.Deps{ Logger: logger, Service: recoveryService, DefaultURL: cfg.DefaultRedirectionURL, RecoveryURL: cfg.RecoveryUrl, }) - promoCodeController := promocode.NewPromoCodeController(promocode.Deps{Logger: logger, PromoCodeService: promoService}) + clientPromoCodeController := client_promocode.NewPromoCodeController(client_promocode.Deps{Logger: logger, PromoCodeService: promoService}) + + adminRecoveryController := admin_recovery.NewRecoveryController(admin_recovery.Deps{ + Logger: logger, + Service: recoveryService, + DefaultURL: cfg.DefaultRedirectionURL, + RecoveryURL: cfg.RecoveryUrl, + }) + adminPromoCodeController := admin_promocode.NewPromoCodeController(admin_promocode.Deps{Logger: logger, PromoCodeService: promoService}) controllerRpc := rpc_controllers.InitRpcControllers(promoService) grpcServer, err := grpc.NewGRPC(logger) @@ -159,16 +169,30 @@ func Run(ctx context.Context, cfg initialize.Config, logger *zap.Logger, build B go recoveryWC.Start(ctx) go purgeWC.Start(ctx) - server := httpserver.NewServer(httpserver.ServerConfig{ + clientServer := httpserver.NewServer(httpserver.ServerConfig{ Logger: logger, - Controllers: []httpserver.Controller{recoveryController, promoCodeController}, + Controllers: []httpserver.Controller{clientRecoveryController, clientPromoCodeController}, + Hlogger: loggerHlog, + JWT: jwtUtil, + }) + + adminServer := httpserver.NewServer(httpserver.ServerConfig{ + Logger: logger, + Controllers: []httpserver.Controller{adminRecoveryController, adminPromoCodeController}, Hlogger: loggerHlog, JWT: jwtUtil, }) go func() { - if err := server.Start(cfg.HTTPHost + ":" + cfg.HTTPPort); err != nil { - logger.Error("Server startup error", zap.Error(err)) + if err := clientServer.Start(cfg.HTTPClientHost + ":" + cfg.HTTPClientPort); err != nil { + logger.Error("Client server startup error", zap.Error(err)) + cancel() + } + }() + + go func() { + if err := adminServer.Start(cfg.HTTPAdminHost + ":" + cfg.HTTPAdminPort); err != nil { + logger.Error("Admin server startup error", zap.Error(err)) cancel() } }() @@ -178,9 +202,11 @@ func Run(ctx context.Context, cfg initialize.Config, logger *zap.Logger, build B Port: cfg.GrpcPort, }) - server.ListRoutes() + clientServer.ListRoutes() + adminServer.ListRoutes() - shutdownGroup.Add(closer.CloserFunc(server.Shutdown)) + shutdownGroup.Add(closer.CloserFunc(clientServer.Shutdown)) + shutdownGroup.Add(closer.CloserFunc(adminServer.Shutdown)) shutdownGroup.Add(closer.CloserFunc(grpcServer.Stop)) shutdownGroup.Add(closer.CloserFunc(mdb.Client().Disconnect)) shutdownGroup.Add(closer.CloserFunc(recoveryWC.Stop)) diff --git a/internal/controller/promocode/promocode_controller.go b/internal/controller/admin/admin_promocode/promocode_controller.go similarity index 79% rename from internal/controller/promocode/promocode_controller.go rename to internal/controller/admin/admin_promocode/promocode_controller.go index cdf7a1d..50f2c48 100644 --- a/internal/controller/promocode/promocode_controller.go +++ b/internal/controller/admin/admin_promocode/promocode_controller.go @@ -1,4 +1,4 @@ -package promocode +package admin_promocode import ( "codeword/internal/models" @@ -174,67 +174,6 @@ func (p *PromoCodeController) GetList(c *fiber.Ctx) error { }) } -func (p *PromoCodeController) Activate(c *fiber.Ctx) error { - userID := middleware.ExtractUserID(c) - hlogger := log_mw.ExtractLogger(c) - fmt.Println("SKER1", userID) - if userID == "" { - return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "failed to get jwt payload"}) - } - - var req models.ActivateReq - if err := c.BodyParser(&req); err != nil { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid request payload"}) - } - - if req.Codeword == "" && req.FastLink == "" { - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "codeword or fastlink is required"}) - } - fmt.Println("SKER2", req) - - promocode, err := p.promoCodeService.ActivatePromo(c.Context(), &req, userID) - fmt.Println("SKER3", err) - if err != nil { - p.logger.Error("Failed to activate promocode", zap.Error(err)) - - switch { - case errors.Is(err, repository.ErrPromoCodeNotFound): - return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "PromoCode not found"}) - case errors.Is(err, repository.ErrPromoCodeAlreadyActivated): - return c.Status(fiber.StatusForbidden).JSON(fiber.Map{"error": "PromoCode already activated"}) - case errors.Is(err, repository.ErrPromoCodeExpired): - hlogger.Emit(models.InfoPromocodeDeadlined{ - - CtxID: promocode.ID.String(), - }) - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) - case errors.Is(err, repository.ErrPromoCodeExhausted): - hlogger.Emit(models.InfoPromocodeExhausted{ - CtxID: promocode.ID.String(), - }) - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "PromoCode exhausted"}) - default: - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Internal Server Error"}) - } - } - - if req.Codeword != "" { - hlogger.Emit(models.InfoPromocodeActivated{ - CtxID: promocode.ID.String(), - CtxUserID: userID, - CtxCode: req.Codeword, - }) - } else if req.FastLink != "" { - hlogger.Emit(models.InfoFastlinkActivated{ - CtxID: promocode.ID.String(), - CtxUserID: userID, - CtxPromocodeID: req.FastLink, - }) - } - - return c.Status(fiber.StatusOK).JSON(models.ActivateResp{Greetings: promocode.Greetings}) -} - func (p *PromoCodeController) Delete(c *fiber.Ctx) error { userID := middleware.ExtractUserID(c) hlogger := log_mw.ExtractLogger(c) diff --git a/internal/controller/promocode/route.go b/internal/controller/admin/admin_promocode/route.go similarity index 87% rename from internal/controller/promocode/route.go rename to internal/controller/admin/admin_promocode/route.go index 077a0dd..4036489 100644 --- a/internal/controller/promocode/route.go +++ b/internal/controller/admin/admin_promocode/route.go @@ -1,4 +1,4 @@ -package promocode +package admin_promocode import "github.com/gofiber/fiber/v2" @@ -6,7 +6,6 @@ func (p *PromoCodeController) Register(router fiber.Router) { router.Post("/create", p.CreatePromoCode) router.Put("/edit", p.EditPromoCode) router.Post("/getList", p.GetList) - router.Post("/activate", p.Activate) router.Delete("/:promocodeID", p.Delete) router.Post("/fastlink", p.CreateFastLink) router.Post("/stats", p.GetStats) diff --git a/internal/controller/admin/admin_recovery/recovery_controller.go b/internal/controller/admin/admin_recovery/recovery_controller.go new file mode 100644 index 0000000..f5669a5 --- /dev/null +++ b/internal/controller/admin/admin_recovery/recovery_controller.go @@ -0,0 +1,50 @@ +package admin_recovery + +import ( + "codeword/internal/services" + "fmt" + "github.com/gofiber/fiber/v2" + "go.uber.org/zap" + "time" +) + +type Deps struct { + Logger *zap.Logger + Service *services.RecoveryService + DefaultURL string + RecoveryURL string +} + +type RecoveryController struct { + logger *zap.Logger + service *services.RecoveryService + defaultURL string + recoveryURL string +} + +func NewRecoveryController(deps Deps) *RecoveryController { + return &RecoveryController{ + logger: deps.Logger, + service: deps.Service, + defaultURL: deps.DefaultURL, + recoveryURL: deps.RecoveryURL, + } +} + +func (r *RecoveryController) HandleLiveness(c *fiber.Ctx) error { + return c.SendStatus(fiber.StatusOK) +} + +func (r *RecoveryController) HandlePingDB(c *fiber.Ctx) error { + startTime := time.Now() + if err := r.service.Ping(c.Context()); err != nil { + r.logger.Error("Failed to ping the database", zap.Error(err)) + return c.Status(fiber.StatusServiceUnavailable).SendString("DB ping failed") + } + duration := time.Since(startTime) + + durationMillis := duration.Milliseconds() + responseMessage := fmt.Sprintf("DB ping success - Time taken: %d ms", durationMillis) + + return c.Status(fiber.StatusOK).SendString(responseMessage) +} diff --git a/internal/controller/admin/admin_recovery/route.go b/internal/controller/admin/admin_recovery/route.go new file mode 100644 index 0000000..e148013 --- /dev/null +++ b/internal/controller/admin/admin_recovery/route.go @@ -0,0 +1,12 @@ +package admin_recovery + +import "github.com/gofiber/fiber/v2" + +func (r *RecoveryController) Register(router fiber.Router) { + router.Get("/liveness", r.HandleLiveness) + router.Get("/readiness", r.HandlePingDB) +} + +func (r *RecoveryController) Name() string { + return "" +} diff --git a/internal/controller/client/client_promocode/promocode_controller.go b/internal/controller/client/client_promocode/promocode_controller.go new file mode 100644 index 0000000..2939ec2 --- /dev/null +++ b/internal/controller/client/client_promocode/promocode_controller.go @@ -0,0 +1,91 @@ +package client_promocode + +import ( + "codeword/internal/models" + "codeword/internal/repository" + "codeword/internal/services" + "codeword/internal/utils/middleware" + "errors" + "fmt" + "github.com/gofiber/fiber/v2" + "go.uber.org/zap" + "penahub.gitlab.yandexcloud.net/backend/penahub_common/log_mw" +) + +type Deps struct { + Logger *zap.Logger + PromoCodeService *services.PromoCodeService +} + +type PromoCodeController struct { + logger *zap.Logger + promoCodeService *services.PromoCodeService +} + +func NewPromoCodeController(deps Deps) *PromoCodeController { + return &PromoCodeController{ + logger: deps.Logger, + promoCodeService: deps.PromoCodeService, + } +} + +func (p *PromoCodeController) Activate(c *fiber.Ctx) error { + userID := middleware.ExtractUserID(c) + hlogger := log_mw.ExtractLogger(c) + fmt.Println("SKER1", userID) + if userID == "" { + return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "failed to get jwt payload"}) + } + + var req models.ActivateReq + if err := c.BodyParser(&req); err != nil { + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid request payload"}) + } + + if req.Codeword == "" && req.FastLink == "" { + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "codeword or fastlink is required"}) + } + fmt.Println("SKER2", req) + + promocode, err := p.promoCodeService.ActivatePromo(c.Context(), &req, userID) + fmt.Println("SKER3", err) + if err != nil { + p.logger.Error("Failed to activate promocode", zap.Error(err)) + + switch { + case errors.Is(err, repository.ErrPromoCodeNotFound): + return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "PromoCode not found"}) + case errors.Is(err, repository.ErrPromoCodeAlreadyActivated): + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{"error": "PromoCode already activated"}) + case errors.Is(err, repository.ErrPromoCodeExpired): + hlogger.Emit(models.InfoPromocodeDeadlined{ + + CtxID: promocode.ID.String(), + }) + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + case errors.Is(err, repository.ErrPromoCodeExhausted): + hlogger.Emit(models.InfoPromocodeExhausted{ + CtxID: promocode.ID.String(), + }) + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "PromoCode exhausted"}) + default: + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Internal Server Error"}) + } + } + + if req.Codeword != "" { + hlogger.Emit(models.InfoPromocodeActivated{ + CtxID: promocode.ID.String(), + CtxUserID: userID, + CtxCode: req.Codeword, + }) + } else if req.FastLink != "" { + hlogger.Emit(models.InfoFastlinkActivated{ + CtxID: promocode.ID.String(), + CtxUserID: userID, + CtxPromocodeID: req.FastLink, + }) + } + + return c.Status(fiber.StatusOK).JSON(models.ActivateResp{Greetings: promocode.Greetings}) +} diff --git a/internal/controller/client/client_promocode/route.go b/internal/controller/client/client_promocode/route.go new file mode 100644 index 0000000..954614d --- /dev/null +++ b/internal/controller/client/client_promocode/route.go @@ -0,0 +1,11 @@ +package client_promocode + +import "github.com/gofiber/fiber/v2" + +func (p *PromoCodeController) Register(router fiber.Router) { + router.Post("/activate", p.Activate) +} + +func (p *PromoCodeController) Name() string { + return "promocode" +} diff --git a/internal/controller/recovery/recovery_controller.go b/internal/controller/client/client_recovery/recovery_controller.go similarity index 87% rename from internal/controller/recovery/recovery_controller.go rename to internal/controller/client/client_recovery/recovery_controller.go index 543e0ce..5f53b3d 100644 --- a/internal/controller/recovery/recovery_controller.go +++ b/internal/controller/client/client_recovery/recovery_controller.go @@ -1,4 +1,4 @@ -package recovery +package client_recovery import ( "codeword/internal/models" @@ -6,7 +6,6 @@ import ( "codeword/internal/services" "encoding/base64" "errors" - "fmt" "github.com/gofiber/fiber/v2" "go.uber.org/zap" "penahub.gitlab.yandexcloud.net/backend/penahub_common/log_mw" @@ -36,24 +35,6 @@ func NewRecoveryController(deps Deps) *RecoveryController { } } -func (r *RecoveryController) HandleLiveness(c *fiber.Ctx) error { - return c.SendStatus(fiber.StatusOK) -} - -func (r *RecoveryController) HandlePingDB(c *fiber.Ctx) error { - startTime := time.Now() - if err := r.service.Ping(c.Context()); err != nil { - r.logger.Error("Failed to ping the database", zap.Error(err)) - return c.Status(fiber.StatusServiceUnavailable).SendString("DB ping failed") - } - duration := time.Since(startTime) - - durationMillis := duration.Milliseconds() - responseMessage := fmt.Sprintf("DB ping success - Time taken: %d ms", durationMillis) - - return c.Status(fiber.StatusOK).SendString(responseMessage) -} - func (r *RecoveryController) HandleRecoveryRequest(c *fiber.Ctx) error { hlogger := log_mw.ExtractLogger(c) var req models.RecoveryRequest diff --git a/internal/controller/recovery/route.go b/internal/controller/client/client_recovery/route.go similarity index 72% rename from internal/controller/recovery/route.go rename to internal/controller/client/client_recovery/route.go index c2d6431..86cd7f2 100644 --- a/internal/controller/recovery/route.go +++ b/internal/controller/client/client_recovery/route.go @@ -1,10 +1,8 @@ -package recovery +package client_recovery import "github.com/gofiber/fiber/v2" func (r *RecoveryController) Register(router fiber.Router) { - router.Get("/liveness", r.HandleLiveness) - router.Get("/readiness", r.HandlePingDB) router.Post("/recover", r.HandleRecoveryRequest) router.Get("/recover/:sign", r.HandleRecoveryLink) } diff --git a/internal/initialize/config.go b/internal/initialize/config.go index d6077e0..284d518 100644 --- a/internal/initialize/config.go +++ b/internal/initialize/config.go @@ -8,8 +8,10 @@ import ( type Config struct { AppName string `env:"APP_NAME" envDefault:"codeword"` - HTTPHost string `env:"HTTP_HOST" envDefault:"localhost"` - HTTPPort string `env:"HTTP_PORT" envDefault:"3000"` + HTTPClientHost string `env:"HTTP_CLIENT_HOST" envDefault:"localhost"` + HTTPClientPort string `env:"HTTP_CLIENT_PORT" envDefault:"3000"` + HTTPAdminHost string `env:"HTTP_ADMIN_HOST" envDefault:"localhost"` + HTTPAdminPort string `env:"HTTP_ADMIN_PORT" envDefault:"3001"` MongoHost string `env:"MONGO_HOST" envDefault:"127.0.0.1"` MongoPort string `env:"MONGO_PORT" envDefault:"27020"` MongoUser string `env:"MONGO_USER" envDefault:"test"`