diff --git a/go.mod b/go.mod index 999b98e..e1ad2f4 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-20250610192732-9f01faa53ea9 + gitea.pena/SQuiz/common v0.0.0-20250623113343-ff0c51da2cdd 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 baebcc4..383a6c4 100644 --- a/go.sum +++ b/go.sum @@ -21,6 +21,14 @@ gitea.pena/SQuiz/common v0.0.0-20250610100937-ce7096a3dd37 h1:JD5YDqRrwvZ8AmxEZn gitea.pena/SQuiz/common v0.0.0-20250610100937-ce7096a3dd37/go.mod h1:zCrUwDh0APpztKk6NUqTZv+zhjVbWpGBJiJ5z9dAH0U= gitea.pena/SQuiz/common v0.0.0-20250610192732-9f01faa53ea9 h1:y97VEguCy1Qf/hl/XT9IfX3EgwLgAkn2+1sBDuxjo7Q= gitea.pena/SQuiz/common v0.0.0-20250610192732-9f01faa53ea9/go.mod h1:zCrUwDh0APpztKk6NUqTZv+zhjVbWpGBJiJ5z9dAH0U= +gitea.pena/SQuiz/common v0.0.0-20250623105537-44c1751d76bd h1:aogENVFcZvUZknTBqZFeeInm6GaD9oOV6G9aJHFxNdY= +gitea.pena/SQuiz/common v0.0.0-20250623105537-44c1751d76bd/go.mod h1:zCrUwDh0APpztKk6NUqTZv+zhjVbWpGBJiJ5z9dAH0U= +gitea.pena/SQuiz/common v0.0.0-20250623110501-fe76dc7ca7d2 h1:JC2FKA0YB9H0viiQ/BtUj7fhSMG5/ESE62tptRiQyTk= +gitea.pena/SQuiz/common v0.0.0-20250623110501-fe76dc7ca7d2/go.mod h1:zCrUwDh0APpztKk6NUqTZv+zhjVbWpGBJiJ5z9dAH0U= +gitea.pena/SQuiz/common v0.0.0-20250623111717-25f65a58f177 h1:rbk9hqLwHOsLRCLQk/jEs+4V9M7QqWeD4oQ5d8oRQpw= +gitea.pena/SQuiz/common v0.0.0-20250623111717-25f65a58f177/go.mod h1:zCrUwDh0APpztKk6NUqTZv+zhjVbWpGBJiJ5z9dAH0U= +gitea.pena/SQuiz/common v0.0.0-20250623113343-ff0c51da2cdd h1:eguuUyg5f8LbMSU0tcxaxHUul2nczjTzhnlmd+qPueM= +gitea.pena/SQuiz/common v0.0.0-20250623113343-ff0c51da2cdd/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 87ad34f..2e56885 100644 --- a/internal/controllers/http_controllers/quiz/quiz.go +++ b/internal/controllers/http_controllers/quiz/quiz.go @@ -583,21 +583,79 @@ func (r *Quiz) CreateQuizAuditory(ctx *fiber.Ctx) error { return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error()) } + const privKey = "quizGigaChat" + usage, err := r.dal.QuizRepo.GetQuizPrivilegeUsage(ctx.Context(), quizID, privKey) + if err != nil { + return ctx.Status(fiber.StatusInternalServerError).SendString("can't get usage: " + err.Error()) + } + + // 1 случай - вырублен GigaChat if !quizAud.GigaChat { - if _, ok := account.Privileges["quizGigaChat"]; !ok { + if _, ok := account.Privileges[privKey]; !ok { return ctx.Status(fiber.StatusPaymentRequired).SendString("payment required") } - err = r.dal.QuizRepo.UpdateGigaChatQuizFlag(ctx.Context(), quizID, accountID) - if err != nil { - return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error()) + // если уже был - обнуляем count - 0 + if usage != nil { + err = r.dal.QuizRepo.ResetQuizPrivilegeUsageCount(ctx.Context(), quizID, privKey) + if err != nil { + return ctx.Status(fiber.StatusInternalServerError).SendString("failed to reset usage: " + err.Error()) + } + } else { + // если нет то создаем count - 0 + usage, err = r.dal.QuizRepo.InsertQuizPrivilegeUsage(ctx.Context(), quizID, privKey) + if err != nil { + return ctx.Status(fiber.StatusInternalServerError).SendString("failed to insert usage: " + err.Error()) + } } - idPrivilege := account.Privileges["quizGigaChat"].ID - newAmount := account.Privileges["quizGigaChat"].Amount - 1 + // врубаем флаг гигачата + err = r.dal.QuizRepo.UpdateGigaChatQuizFlag(ctx.Context(), quizID, accountID, true) + if err != nil { + return ctx.Status(fiber.StatusInternalServerError).SendString("failed to enable GigaChat: " + err.Error()) + } + idPrivilege := account.Privileges[privKey].ID + newAmount := account.Privileges[privKey].Amount - 1 err = r.dal.AccountRepo.UpdatePrivilegeAmount(ctx.Context(), idPrivilege, newAmount) if err != nil { - return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error()) + return ctx.Status(fiber.StatusInternalServerError).SendString("failed to update privilege amount: " + err.Error()) + } + } + + // 2 случай - врублен GigaChat но количество использований больше допустимого + if quizAud.GigaChat && usage != nil && usage.UsedCount >= model.QuizGigaChatPrivilegeLimitUsage { + // проверяем есть ли привилегия, если есть то повторяем шаг из 1 случая + if _, ok := account.Privileges[privKey]; !ok { + return ctx.Status(fiber.StatusPaymentRequired).SendString("payment required") + } + + err = r.dal.QuizRepo.ResetQuizPrivilegeUsageCount(ctx.Context(), quizID, privKey) + if err != nil { + return ctx.Status(fiber.StatusInternalServerError).SendString("failed to reset usage: " + err.Error()) + } + + idPrivilege := account.Privileges[privKey].ID + newAmount := account.Privileges[privKey].Amount - 1 + err = r.dal.AccountRepo.UpdatePrivilegeAmount(ctx.Context(), idPrivilege, newAmount) + if err != nil { + return ctx.Status(fiber.StatusInternalServerError).SendString("failed to update privilege: " + err.Error()) + } + } + + // посредственный случай который скорее на стейдже произойдет gigachat = true а usage = nil, росто нужно создать usage + if quizAud.GigaChat && usage == nil { + // уже была списана привилегия просто создаем usage + usage, err = r.dal.QuizRepo.InsertQuizPrivilegeUsage(ctx.Context(), quizID, privKey) + if err != nil { + return ctx.Status(fiber.StatusInternalServerError).SendString("failed to insert usage: " + err.Error()) + } + } + + // 3 случай - когда у нас usage!=nil и usage.UsedCount < model.QuizGigaChatPrivilegeLimitUsage и прошли 1 и 2 случай + if usage != nil && usage.UsedCount < model.QuizGigaChatPrivilegeLimitUsage { + err = r.dal.QuizRepo.IncrementQuizPrivilegeUsage(ctx.Context(), quizID, privKey) + if err != nil { + return ctx.Status(fiber.StatusInternalServerError).SendString("failed to increment usage: " + err.Error()) } }