diff --git a/api/openapi.yaml b/api/openapi.yaml index 949257d..6fb1e23 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -1971,6 +1971,13 @@ paths: schema: type: string default: invalid quiz id + '402': + description: Payment required need gigachat privilege + content: + 'application/json': + schema: + type: string + default: payment required '500': description: Internal server error content: diff --git a/go.mod b/go.mod index 5e74cbb..be7ea4d 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( gitea.pena/PenaSide/common v0.0.0-20250421103113-7e4b3ae9e1e0 gitea.pena/PenaSide/hlog v0.0.0-20241125221102-a54c29c002a9 gitea.pena/PenaSide/trashlog v0.0.0-20250224122049-ddb4d72e9d07 - gitea.pena/SQuiz/common v0.0.0-20250531072420-f9ec7a513967 + gitea.pena/SQuiz/common v0.0.0-20250605135518-be6361f19f4c github.com/caarlos0/env/v8 v8.0.0 github.com/go-redis/redis/v8 v8.11.5 github.com/gofiber/fiber/v2 v2.52.6 diff --git a/go.sum b/go.sum index 48c1e83..1fd7e8a 100644 --- a/go.sum +++ b/go.sum @@ -11,6 +11,8 @@ gitea.pena/SQuiz/common v0.0.0-20250514124515-870e52266ca5 h1:C+iCsGMSUJonOTNNk8 gitea.pena/SQuiz/common v0.0.0-20250514124515-870e52266ca5/go.mod h1:zCrUwDh0APpztKk6NUqTZv+zhjVbWpGBJiJ5z9dAH0U= gitea.pena/SQuiz/common v0.0.0-20250531072420-f9ec7a513967 h1:pS6MAVGSp/84d8TpX8g+xlcKAgkf3ordEWFtpN9Evu0= gitea.pena/SQuiz/common v0.0.0-20250531072420-f9ec7a513967/go.mod h1:zCrUwDh0APpztKk6NUqTZv+zhjVbWpGBJiJ5z9dAH0U= +gitea.pena/SQuiz/common v0.0.0-20250605135518-be6361f19f4c h1:yCpGpEmugxNiIO0nNjhyDi8zmxjd1qHZqEXY5NmINrA= +gitea.pena/SQuiz/common v0.0.0-20250605135518-be6361f19f4c/go.mod h1:zCrUwDh0APpztKk6NUqTZv+zhjVbWpGBJiJ5z9dAH0U= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/ClickHouse/clickhouse-go v1.5.4 h1:cKjXeYLNWVJIx2J1K6H2CqyRmfwVJVY1OV1coaaFcI0= github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= diff --git a/internal/controllers/http_controllers/quiz/quiz.go b/internal/controllers/http_controllers/quiz/quiz.go index 15a880f..adeb491 100644 --- a/internal/controllers/http_controllers/quiz/quiz.go +++ b/internal/controllers/http_controllers/quiz/quiz.go @@ -548,7 +548,21 @@ func (r *Quiz) TemplateCopy(ctx *fiber.Ctx) error { return ctx.Status(fiber.StatusOK).JSON(fiber.Map{"id": qizID}) } -func (s *Quiz) CreateQuizAuditory(ctx *fiber.Ctx) error { +func (r *Quiz) CreateQuizAuditory(ctx *fiber.Ctx) error { + accountID, ok := middleware.GetAccountId(ctx) + if !ok { + return ctx.Status(fiber.StatusUnauthorized).SendString("account id is required") + } + + account, err := r.dal.AccountRepo.GetAccountByID(ctx.Context(), accountID) + if err != nil { + return ctx.Status(fiber.StatusInternalServerError).SendString("can`t get account by account id") + } + + if _, ok := account.Privileges["quizGigaChat"]; !ok { + return ctx.Status(fiber.StatusPaymentRequired).SendString("payment required") + } + var req struct { Sex bool `json:"sex"` // false - female, true - male Age string `json:"age"` @@ -568,7 +582,7 @@ func (s *Quiz) CreateQuizAuditory(ctx *fiber.Ctx) error { return ctx.Status(fiber.StatusBadRequest).SendString("Invalid request missing required fields") } - result, err := s.dal.QuizRepo.CreateQuizAudience(ctx.Context(), quiz.DepsCreateQuizAudience{ + result, err := r.dal.QuizRepo.CreateQuizAudience(ctx.Context(), quiz.DepsCreateQuizAudience{ QuizID: quizID, Age: req.Age, Sex: req.Sex, @@ -578,7 +592,7 @@ func (s *Quiz) CreateQuizAuditory(ctx *fiber.Ctx) error { return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error()) } - err = s.producerGigaChat.ToGigaChatNotify(ctx.Context(), brokers.MessageGigaChat{ + err = r.producerGigaChat.ToGigaChatNotify(ctx.Context(), brokers.MessageGigaChat{ ID: result, QuizID: quizID, Age: req.Age, @@ -591,7 +605,7 @@ func (s *Quiz) CreateQuizAuditory(ctx *fiber.Ctx) error { return ctx.Status(fiber.StatusOK).JSON(fiber.Map{"ID": result}) } -func (s *Quiz) GetQuizAuditory(ctx *fiber.Ctx) error { +func (r *Quiz) GetQuizAuditory(ctx *fiber.Ctx) error { quizIDStr := ctx.Params("quizID") quizID, err := strconv.ParseInt(quizIDStr, 10, 64) if err != nil || quizID == 0 { @@ -603,7 +617,7 @@ func (s *Quiz) GetQuizAuditory(ctx *fiber.Ctx) error { return ctx.Status(fiber.StatusUnauthorized).SendString("account id is required") } - isOwner, err := s.dal.QuizRepo.CheckQuizOwner(ctx.Context(), accountID, uint64(quizID)) + isOwner, err := r.dal.QuizRepo.CheckQuizOwner(ctx.Context(), accountID, uint64(quizID)) if err != nil { return ctx.Status(fiber.StatusInternalServerError).SendString("failed to check ownership: " + err.Error()) } @@ -612,7 +626,7 @@ func (s *Quiz) GetQuizAuditory(ctx *fiber.Ctx) error { return ctx.Status(fiber.StatusForbidden).SendString("you are not the owner") } - result, err := s.dal.QuizRepo.GetQuizAudience(ctx.Context(), quizID) + result, err := r.dal.QuizRepo.GetQuizAudience(ctx.Context(), quizID) if err != nil { return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error()) } @@ -620,7 +634,7 @@ func (s *Quiz) GetQuizAuditory(ctx *fiber.Ctx) error { return ctx.Status(fiber.StatusOK).JSON(result) } -func (s *Quiz) DeleteQuizAuditory(ctx *fiber.Ctx) error { +func (r *Quiz) DeleteQuizAuditory(ctx *fiber.Ctx) error { quizIDStr := ctx.Params("quizID") quizID, err := strconv.ParseInt(quizIDStr, 10, 64) if err != nil || quizID == 0 { @@ -638,7 +652,7 @@ func (s *Quiz) DeleteQuizAuditory(ctx *fiber.Ctx) error { return ctx.Status(fiber.StatusUnauthorized).SendString("account id is required") } - isOwner, err := s.dal.QuizRepo.CheckIsOwnerAudience(ctx.Context(), quizID, audienceID, accountID) + isOwner, err := r.dal.QuizRepo.CheckIsOwnerAudience(ctx.Context(), quizID, audienceID, accountID) if err != nil { return ctx.Status(fiber.StatusInternalServerError).SendString("failed to check ownership: " + err.Error()) } @@ -646,7 +660,7 @@ func (s *Quiz) DeleteQuizAuditory(ctx *fiber.Ctx) error { return ctx.Status(fiber.StatusForbidden).SendString("you are not the owner of this quiz audience") } - err = s.dal.QuizRepo.DeleteQuizAudience(ctx.Context(), quizID, audienceID) + err = r.dal.QuizRepo.DeleteQuizAudience(ctx.Context(), quizID, audienceID) if err != nil { return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error()) }