From 44e8ac3eeacec6b0f00c9a65c97526a591be6246 Mon Sep 17 00:00:00 2001 From: skeris Date: Tue, 12 Aug 2025 21:16:48 +0300 Subject: [PATCH] create utm controller --- api/openapi.yaml | 115 +++++++++++++++++- internal/app/app.go | 2 +- .../controllers/http_controllers/utm/route.go | 13 ++ .../controllers/http_controllers/utm/utm.go | 70 +++++++++++ internal/initialize/controllers.go | 5 + 5 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 internal/controllers/http_controllers/utm/route.go create mode 100644 internal/controllers/http_controllers/utm/utm.go diff --git a/api/openapi.yaml b/api/openapi.yaml index 1bee531..87d5dae 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -2088,4 +2088,117 @@ paths: 'application/json': schema: type: string - default: if you get any content string send it to developer \ No newline at end of file + default: if you get any content string send it to developer + /utm/{quizID}: + get: + summary: Получить все UTM по quizID + parameters: + - name: quizID + in: path + required: true + description: Идентификатор опроса + schema: + type: integer + format: int64 + responses: + '200': + description: Список UTM + content: + application/json: + schema: + type: array + items: + type: object + properties: + id: + type: integer + format: int64 + example: 1 + quiz_id: + type: integer + format: int64 + example: 123 + utm: + type: string + example: utm_campaign=test + deleted: + type: boolean + example: false + created_at: + type: string + format: date-time + example: "2024-06-23T12:00:00Z" + '400': + description: Bad Request + '500': + description: Internal server error + + /utm: + post: + summary: Создать новую UTM запись + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - quiz_id + - utm + properties: + quiz_id: + type: integer + format: int64 + example: 123 + utm: + type: string + example: utm_campaign=test + responses: + '200': + description: Созданная UTM запись + content: + application/json: + schema: + type: object + properties: + id: + type: integer + format: int64 + example: 1 + quiz_id: + type: integer + format: int64 + example: 123 + utm: + type: string + example: utm_campaign=test + deleted: + type: boolean + example: false + created_at: + type: string + format: date-time + example: "2024-06-23T12:00:00Z" + '400': + description: Bad Request + '500': + description: Internal server error + + /utm/{utmID}: + delete: + summary: Мягкое удаление UTM по ID + parameters: + - name: utmID + in: path + required: true + description: Идентификатор UTM + schema: + type: integer + format: int64 + responses: + '200': + description: Success delete + '400': + description: Bad Request + '500': + description: Internal server error \ No newline at end of file diff --git a/internal/app/app.go b/internal/app/app.go index 25fe3d0..aaea501 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -163,7 +163,7 @@ func Run(ctx context.Context, cfg initialize.Config, build Build) error { srv := http.NewServer(http.ServerConfig{ Logger: zapLogger, Controllers: []http.Controller{controllers.HttpControllers.Account, controllers.HttpControllers.Telegram, controllers.HttpControllers.Result, - controllers.HttpControllers.Question, controllers.HttpControllers.Quiz, controllers.HttpControllers.Statistic}, + controllers.HttpControllers.Question, controllers.HttpControllers.Quiz, controllers.HttpControllers.Statistic, controllers.HttpControllers.UTM}, Hlogger: loggerHlog, }) diff --git a/internal/controllers/http_controllers/utm/route.go b/internal/controllers/http_controllers/utm/route.go new file mode 100644 index 0000000..1919066 --- /dev/null +++ b/internal/controllers/http_controllers/utm/route.go @@ -0,0 +1,13 @@ +package utm + +import "github.com/gofiber/fiber/v2" + +func (r *UTM) Register(router fiber.Router) { + router.Get("/:quizID", r.GetAllQuizUtms) + router.Post("/", r.CreateQuizUTM) + router.Delete("/:utmID", r.DeleteQuizUTM) +} + +func (r *UTM) Name() string { + return "utm" +} diff --git a/internal/controllers/http_controllers/utm/utm.go b/internal/controllers/http_controllers/utm/utm.go new file mode 100644 index 0000000..8b295fb --- /dev/null +++ b/internal/controllers/http_controllers/utm/utm.go @@ -0,0 +1,70 @@ +package utm + +import ( + "gitea.pena/SQuiz/common/dal" + "github.com/gofiber/fiber/v2" +) + +type Deps struct { + DAL *dal.DAL +} + +type UTM struct { + dal *dal.DAL +} + +func NewUTMController(deps Deps) *UTM { + return &UTM{ + dal: deps.DAL, + } +} + +func (r *UTM) CreateQuizUTM(ctx *fiber.Ctx) error { + var req struct { + QuizID int64 `json:"quiz_id"` + UTM string `json:"utm"` + } + + if err := ctx.BodyParser(&req); err != nil { + return ctx.Status(fiber.StatusBadRequest).SendString(err.Error()) + } + + if req.QuizID <= 0 || req.UTM == "" { + return ctx.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "quiz_id and utm are required"}) + } + + utm, err := r.dal.QuizRepo.CreateQuizUTM(ctx.Context(), req.QuizID, req.UTM) + if err != nil { + return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error()) + } + + return ctx.Status(fiber.StatusOK).JSON(utm) +} + +func (r *UTM) GetAllQuizUtms(ctx *fiber.Ctx) error { + quizID, err := ctx.ParamsInt("quizID") + if err != nil || quizID <= 0 { + return ctx.Status(fiber.StatusBadRequest).SendString(err.Error()) + } + + utms, err := r.dal.QuizRepo.GetAllQuizUtms(ctx.Context(), int64(quizID)) + if err != nil { + return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error()) + } + + return ctx.JSON(utms) +} + +func (r *UTM) DeleteQuizUTM(ctx *fiber.Ctx) error { + utmID, err := ctx.ParamsInt("utmID") + if err != nil || utmID <= 0 { + return ctx.Status(fiber.StatusBadRequest).SendString(err.Error()) + } + + err = r.dal.QuizRepo.DeleteQuizUTM(ctx.Context(), int64(utmID)) + if err != nil { + return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error()) + } + + return ctx.SendStatus(fiber.StatusOK) +} diff --git a/internal/initialize/controllers.go b/internal/initialize/controllers.go index 3e0a6c8..4b9ffdd 100644 --- a/internal/initialize/controllers.go +++ b/internal/initialize/controllers.go @@ -8,6 +8,7 @@ import ( "gitea.pena/SQuiz/core/internal/controllers/http_controllers/result" "gitea.pena/SQuiz/core/internal/controllers/http_controllers/statistic" "gitea.pena/SQuiz/core/internal/controllers/http_controllers/telegram" + "gitea.pena/SQuiz/core/internal/controllers/http_controllers/utm" "gitea.pena/SQuiz/core/internal/controllers/rpc_controllers" "github.com/go-redis/redis/v8" ) @@ -36,6 +37,7 @@ type HttpControllers struct { Result *result.Result Statistic *statistic.Statistic Telegram *telegram.Telegram + UTM *utm.UTM } func NewControllers(deps ControllerDeps) *Controller { @@ -70,6 +72,9 @@ func NewControllers(deps ControllerDeps) *Controller { DAL: deps.DALs.PgDAL, //TelegramClient: deps.Clients.TgClient, }), + UTM: utm.NewUTMController(utm.Deps{ + DAL: deps.DALs.PgDAL, + }), }, } }