core/internal/controllers/http_controllers/statistic/statistic.go

202 lines
5.6 KiB
Go
Raw Normal View History

2024-10-25 15:26:03 +00:00
package statistic
import (
2025-02-24 17:06:12 +00:00
"gitea.pena/SQuiz/common/dal"
2025-04-23 13:40:59 +00:00
"gitea.pena/SQuiz/common/middleware"
2025-02-24 17:06:12 +00:00
"gitea.pena/SQuiz/common/repository/statistics"
"github.com/gofiber/fiber/v2"
"strconv"
)
2024-10-25 15:26:03 +00:00
type Deps struct {
DAL *dal.DAL
ChDAL *dal.ClickHouseDAL
}
type Statistic struct {
dal *dal.DAL
chDAL *dal.ClickHouseDAL
}
func NewStatisticController(deps Deps) *Statistic {
return &Statistic{
dal: deps.DAL,
chDAL: deps.ChDAL,
}
}
type DeviceStatReq struct {
From uint64 // временные границы выбора статистики
To uint64
}
2024-10-25 15:26:03 +00:00
func (r *Statistic) GetDeviceStatistics(ctx *fiber.Ctx) error {
2025-04-23 13:40:59 +00:00
accountID, ok := middleware.GetAccountId(ctx)
if !ok {
return ctx.Status(fiber.StatusUnauthorized).SendString("account id is required")
}
quizIDStr := ctx.Params("quizID")
quizID, err := strconv.ParseInt(quizIDStr, 10, 64)
if err != nil {
return ctx.Status(fiber.StatusBadRequest).SendString("Invalid quiz ID format")
}
2025-04-23 13:40:59 +00:00
isOwner, err := r.dal.QuizRepo.CheckQuizOwner(ctx.Context(), accountID, uint64(quizID))
if err != nil {
return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error())
}
if !isOwner {
return ctx.Status(fiber.StatusUnauthorized).SendString("not the owner")
}
var req DeviceStatReq
if err := ctx.BodyParser(&req); err != nil {
return ctx.Status(fiber.StatusBadRequest).SendString("Invalid request data")
}
2024-10-25 15:26:03 +00:00
deviceStats, err := r.dal.StatisticsRepo.GetDeviceStatistics(ctx.Context(), statistics.DeviceStatReq{
QuizId: quizID,
From: req.From,
To: req.To,
})
if err != nil {
return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error())
}
return ctx.Status(fiber.StatusOK).JSON(deviceStats)
}
2024-03-15 17:44:37 +00:00
type GeneralStatsResp struct {
Open, Result, AvTime, Conversion map[uint64]uint64
}
2024-10-25 15:26:03 +00:00
func (r *Statistic) GetGeneralStatistics(ctx *fiber.Ctx) error {
2025-04-23 13:40:59 +00:00
acountId, ok := middleware.GetAccountId(ctx)
if !ok {
return ctx.Status(fiber.StatusUnauthorized).SendString("account id is required")
}
2024-03-15 17:44:37 +00:00
quizIDStr := ctx.Params("quizID")
2024-03-17 19:44:08 +00:00
quizID, err := strconv.ParseInt(quizIDStr, 10, 64)
2024-03-15 17:44:37 +00:00
if err != nil {
return ctx.Status(fiber.StatusBadRequest).SendString("Invalid quiz ID format")
}
2025-04-23 13:40:59 +00:00
isOwner, err := r.dal.QuizRepo.CheckQuizOwner(ctx.Context(), acountId, uint64(quizID))
if err != nil {
return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error())
}
if !isOwner {
return ctx.Status(fiber.StatusUnauthorized).SendString("not the owner")
}
2024-03-15 17:44:37 +00:00
var req DeviceStatReq
if err := ctx.BodyParser(&req); err != nil {
return ctx.Status(fiber.StatusBadRequest).SendString("Invalid request data")
}
2024-10-25 15:26:03 +00:00
generalStats, err := r.dal.StatisticsRepo.GetGeneralStatistics(ctx.Context(), statistics.DeviceStatReq{
2024-03-17 19:44:08 +00:00
QuizId: quizID,
2024-03-15 17:44:37 +00:00
From: req.From,
To: req.To,
})
if err != nil {
return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error())
}
return ctx.Status(fiber.StatusOK).JSON(generalStats)
}
2024-03-17 19:44:08 +00:00
2024-10-25 15:26:03 +00:00
func (r *Statistic) GetQuestionsStatistics(ctx *fiber.Ctx) error {
2025-04-23 13:40:59 +00:00
accountID, ok := middleware.GetAccountId(ctx)
if !ok {
return ctx.Status(fiber.StatusUnauthorized).SendString("account id is required")
}
2024-03-17 19:44:08 +00:00
quizIDStr := ctx.Params("quizID")
quizID, err := strconv.ParseInt(quizIDStr, 0, 64)
if err != nil {
return ctx.Status(fiber.StatusBadRequest).SendString("Invalid quiz ID format")
}
2025-04-23 13:40:59 +00:00
isOwner, err := r.dal.QuizRepo.CheckQuizOwner(ctx.Context(), accountID, uint64(quizID))
if err != nil {
return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error())
}
if !isOwner {
return ctx.Status(fiber.StatusUnauthorized).SendString("not the owner")
}
2024-03-17 19:44:08 +00:00
var req DeviceStatReq
if err := ctx.BodyParser(&req); err != nil {
2024-08-06 13:56:51 +00:00
return ctx.Status(fiber.StatusBadRequest).SendString("Invalid request data")
2024-03-17 19:44:08 +00:00
}
2024-10-25 15:26:03 +00:00
questionsStats, err := r.dal.StatisticsRepo.GetQuestionsStatistics(ctx.Context(), statistics.DeviceStatReq{
2024-03-17 19:44:08 +00:00
QuizId: quizID,
From: req.From,
To: req.To,
})
if err != nil {
return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error())
}
return ctx.Status(fiber.StatusOK).JSON(questionsStats)
}
2024-03-25 09:45:04 +00:00
type StatisticReq struct {
From, To uint64 // временные границы выбора статистики
}
2024-10-25 15:26:03 +00:00
func (r *Statistic) AllServiceStatistics(ctx *fiber.Ctx) error {
2024-03-25 09:45:04 +00:00
var req StatisticReq
if err := ctx.BodyParser(&req); err != nil {
2024-08-06 13:56:51 +00:00
return ctx.Status(fiber.StatusBadRequest).SendString("Invalid request data")
2024-03-25 09:45:04 +00:00
}
2024-10-25 15:26:03 +00:00
allSvcStats, err := r.dal.StatisticsRepo.AllServiceStatistics(ctx.Context(), req.From, req.To)
if err != nil {
return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error())
}
2024-03-25 09:45:04 +00:00
return ctx.Status(fiber.StatusOK).JSON(allSvcStats)
2024-03-25 09:45:04 +00:00
}
2024-10-25 15:26:03 +00:00
func (r *Statistic) GetPipelinesStatistics(ctx *fiber.Ctx) error {
2025-04-23 13:40:59 +00:00
accountID, ok := middleware.GetAccountId(ctx)
if !ok {
return ctx.Status(fiber.StatusUnauthorized).SendString("account id is required")
}
var req StatisticReq
if err := ctx.BodyParser(&req); err != nil {
2024-08-06 13:56:51 +00:00
return ctx.Status(fiber.StatusBadRequest).SendString("Invalid request data")
}
quizIDStr := ctx.Params("quizID")
quizID, err := strconv.ParseInt(quizIDStr, 10, 64)
if err != nil {
return ctx.Status(fiber.StatusBadRequest).SendString("Invalid quiz ID format")
}
2025-04-23 13:40:59 +00:00
isOwner, err := r.dal.QuizRepo.CheckQuizOwner(ctx.Context(), accountID, uint64(quizID))
if err != nil {
return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error())
}
if !isOwner {
return ctx.Status(fiber.StatusUnauthorized).SendString("not the owner")
}
2024-10-25 15:26:03 +00:00
result, err := r.chDAL.StatisticClickRepo.GetPipelinesStatistics(ctx.Context(), quizID, req.From, req.To)
if err != nil {
return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error())
}
return ctx.Status(fiber.StatusOK).JSON(result)
}