222 lines
6.7 KiB
Go
222 lines
6.7 KiB
Go
package handlers
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"time"
|
|
|
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/domain"
|
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/web_server/response"
|
|
"github.com/gofiber/fiber/v2"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// GetAllLeagues godoc
|
|
// @Summary Gets all leagues
|
|
// @Description Gets all leagues
|
|
// @Tags leagues
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Success 200 {array} domain.League
|
|
// @Failure 400 {object} response.APIResponse
|
|
// @Failure 500 {object} response.APIResponse
|
|
// @Router /api/v1/leagues [get]
|
|
func (h *Handler) GetAllLeagues(c *fiber.Ctx) error {
|
|
page := c.QueryInt("page", 1)
|
|
pageSize := c.QueryInt("page_size", 10)
|
|
|
|
limit := domain.ValidInt64{
|
|
Value: int64(pageSize),
|
|
Valid: pageSize == 0,
|
|
}
|
|
offset := domain.ValidInt64{
|
|
Value: int64(page - 1),
|
|
Valid: true,
|
|
}
|
|
|
|
countryCodeQuery := c.Query("cc")
|
|
countryCode := domain.ValidString{
|
|
Value: countryCodeQuery,
|
|
Valid: countryCodeQuery != "",
|
|
}
|
|
isActiveQuery := c.QueryBool("is_active", false)
|
|
isActiveFilter := c.QueryBool("is_active_filter", false)
|
|
isActive := domain.ValidBool{
|
|
Value: isActiveQuery,
|
|
Valid: isActiveFilter,
|
|
}
|
|
|
|
sportIDQuery := c.Query("sport_id")
|
|
var sportID domain.ValidInt32
|
|
if sportIDQuery != "" {
|
|
sportIDint, err := strconv.Atoi(sportIDQuery)
|
|
if err != nil {
|
|
h.mongoLoggerSvc.Info("invalid sport id",
|
|
zap.String("sport_id", sportIDQuery),
|
|
zap.Int("status_code", fiber.StatusBadRequest),
|
|
zap.Error(err),
|
|
zap.Time("timestamp", time.Now()),
|
|
)
|
|
return fiber.NewError(fiber.StatusBadRequest, "invalid sport id")
|
|
}
|
|
sportID = domain.ValidInt32{
|
|
Value: int32(sportIDint),
|
|
Valid: true,
|
|
}
|
|
}
|
|
|
|
leagues, err := h.leagueSvc.GetAllLeagues(c.Context(), domain.LeagueFilter{
|
|
CountryCode: countryCode,
|
|
IsActive: isActive,
|
|
SportID: sportID,
|
|
Limit: limit,
|
|
Offset: offset,
|
|
})
|
|
|
|
if err != nil {
|
|
fmt.Printf("Error fetching league %v \n", err)
|
|
h.mongoLoggerSvc.Error("Failed to get all leagues",
|
|
zap.Int("status_code", fiber.StatusInternalServerError),
|
|
zap.Error(err),
|
|
zap.Time("timestamp", time.Now()),
|
|
)
|
|
return fiber.NewError(fiber.StatusInternalServerError, "Failed to get leagues:"+err.Error())
|
|
}
|
|
return response.WriteJSON(c, fiber.StatusOK, "All leagues retrieved", leagues, nil)
|
|
}
|
|
|
|
type SetLeagueActiveReq struct {
|
|
IsActive bool `json:"is_active"`
|
|
}
|
|
|
|
// SetLeagueActive godoc
|
|
// @Summary Set the league to active
|
|
// @Description Set the league to active
|
|
// @Tags leagues
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path int true "League ID"
|
|
// @Param active body SetLeagueActiveReq true "League Active Request"
|
|
// @Success 200 {object} response.APIResponse
|
|
// @Failure 400 {object} response.APIResponse
|
|
// @Failure 500 {object} response.APIResponse
|
|
// @Router /api/v1/leagues/{id}/set-active [put]
|
|
func (h *Handler) SetLeagueActive(c *fiber.Ctx) error {
|
|
leagueIdStr := c.Params("id")
|
|
if leagueIdStr == "" {
|
|
return fiber.NewError(fiber.StatusBadRequest, "Missing league id")
|
|
}
|
|
leagueId, err := strconv.Atoi(leagueIdStr)
|
|
if err != nil {
|
|
return fiber.NewError(fiber.StatusBadRequest, "invalid league id")
|
|
}
|
|
|
|
var req SetLeagueActiveReq
|
|
if err := c.BodyParser(&req); err != nil {
|
|
h.logger.Error("SetLeagueReq failed", "error", err)
|
|
h.mongoLoggerSvc.Error("SetLeagueReq failed to parse request body",
|
|
zap.Any("request", req),
|
|
zap.Int("status_code", fiber.StatusInternalServerError),
|
|
zap.Error(err),
|
|
zap.Time("timestamp", time.Now()),
|
|
)
|
|
return fiber.NewError(fiber.StatusBadRequest, "Failed to parse request:"+err.Error())
|
|
}
|
|
|
|
valErrs, ok := h.validator.Validate(c, req)
|
|
if !ok {
|
|
var errMsg string
|
|
for field, msg := range valErrs {
|
|
errMsg += fmt.Sprintf("%s: %s; ", field, msg)
|
|
}
|
|
h.mongoLoggerSvc.Info("Failed to validate SetLeagueActiveReq",
|
|
zap.Any("request", req),
|
|
zap.Int("status_code", fiber.StatusBadRequest),
|
|
zap.Error(err),
|
|
zap.Time("timestamp", time.Now()),
|
|
)
|
|
return fiber.NewError(fiber.StatusBadRequest, errMsg)
|
|
}
|
|
|
|
if err := h.leagueSvc.SetLeagueActive(c.Context(), int64(leagueId), req.IsActive); err != nil {
|
|
h.mongoLoggerSvc.Error("Failed to update league active",
|
|
zap.Int64("userID", int64(leagueId)),
|
|
zap.Bool("is_active", req.IsActive),
|
|
zap.Int("status_code", fiber.StatusInternalServerError),
|
|
zap.Error(err),
|
|
zap.Time("timestamp", time.Now()),
|
|
)
|
|
return fiber.NewError(fiber.StatusInternalServerError, "Failed to update league:"+err.Error())
|
|
}
|
|
|
|
return response.WriteJSON(c, fiber.StatusOK, "League updated successfully", nil, nil)
|
|
}
|
|
|
|
type SetLeagueAsFeatured struct {
|
|
IsFeatured bool `json:"is_featured" example:"true"`
|
|
}
|
|
|
|
// SetLeagueFeatured godoc
|
|
// @Summary Set the league to featured/un-featured
|
|
// @Description Set the league to featured/un-featured
|
|
// @Tags leagues
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path int true "League ID"
|
|
// @Param active body SetLeagueAsFeatured true "League Featured Request"
|
|
// @Success 200 {object} response.APIResponse
|
|
// @Failure 400 {object} response.APIResponse
|
|
// @Failure 500 {object} response.APIResponse
|
|
// @Router /api/v1/leagues/{id}/featured [put]
|
|
func (h *Handler) SetLeagueFeatured(c *fiber.Ctx) error {
|
|
leagueIdStr := c.Params("id")
|
|
if leagueIdStr == "" {
|
|
return fiber.NewError(fiber.StatusBadRequest, "Missing league id")
|
|
}
|
|
leagueId, err := strconv.Atoi(leagueIdStr)
|
|
if err != nil {
|
|
return fiber.NewError(fiber.StatusBadRequest, "invalid league id")
|
|
}
|
|
|
|
var req SetLeagueAsFeatured
|
|
if err := c.BodyParser(&req); err != nil {
|
|
h.logger.Error("SetLeagueFeaturedReq failed", "error", err)
|
|
h.mongoLoggerSvc.Info("SetLeagueFeaturedReq failed to parse request body",
|
|
zap.Int("status_code", fiber.StatusBadRequest),
|
|
zap.Error(err),
|
|
zap.Time("timestamp", time.Now()),
|
|
)
|
|
return fiber.NewError(fiber.StatusBadRequest, "Failed to parse request body:"+err.Error())
|
|
}
|
|
|
|
valErrs, ok := h.validator.Validate(c, req)
|
|
if !ok {
|
|
var errMsg string
|
|
for field, msg := range valErrs {
|
|
errMsg += fmt.Sprintf("%s: %s; ", field, msg)
|
|
}
|
|
h.mongoLoggerSvc.Info("Failed to validate SetLeagueFeaturedReq",
|
|
zap.Any("request", req),
|
|
zap.Int("status_code", fiber.StatusBadRequest),
|
|
zap.Error(err),
|
|
zap.Time("timestamp", time.Now()),
|
|
)
|
|
return fiber.NewError(fiber.StatusBadRequest, errMsg)
|
|
|
|
}
|
|
err = h.leagueSvc.UpdateLeague(c.Context(), domain.UpdateLeague{
|
|
ID: int64(leagueId),
|
|
})
|
|
if err != nil {
|
|
h.mongoLoggerSvc.Error("Failed to update league",
|
|
zap.Int64("leagueID", int64(leagueId)),
|
|
zap.Int("status_code", fiber.StatusInternalServerError),
|
|
zap.Error(err),
|
|
zap.Time("timestamp", time.Now()),
|
|
)
|
|
return fiber.NewError(fiber.StatusInternalServerError, "Failed to update league:"+err.Error())
|
|
}
|
|
|
|
return response.WriteJSON(c, fiber.StatusOK, "League updated successfully", nil, nil)
|
|
}
|