DanzApp-BE-Test / controllers /favorite_controller.go
lifedebugger's picture
Deploy files from GitHub repository
4727a74
package controllers
import (
"strconv"
"abdanhafidz.com/go-boilerplate/services"
"github.com/gin-gonic/gin"
)
type FavoriteController interface {
ToggleClassFavorite(ctx *gin.Context)
ToggleEventFavorite(ctx *gin.Context)
GetFavoriteClasses(ctx *gin.Context)
GetFavoriteEvents(ctx *gin.Context)
}
type favoriteController struct {
favoriteService services.FavoriteService
}
func NewFavoriteController(favoriteService services.FavoriteService) FavoriteController {
return &favoriteController{favoriteService: favoriteService}
}
// ToggleClassFavorite godoc
// @Summary Toggle Class Favorite
// @Description Adds the class to favorites if not already favorited, removes it if already favorited.
// @Tags Classes
// @Produce json
// @Param class_id path string true "Class ID"
// @Success 200 {object} map[string]interface{}
// @Failure 400 {object} dto.ErrorResponse
// @Failure 401 {object} dto.ErrorResponse
// @Security BearerAuth
// @Router /api/v1/classes/{class_id}/favorite [put]
func (c *favoriteController) ToggleClassFavorite(ctx *gin.Context) {
classID := ctx.Param("class_id")
userID := ParseUserId(ctx)
if userID == "" {
return
}
favorited, err := c.favoriteService.ToggleClassFavorite(ctx.Request.Context(), userID, classID)
if err != nil {
ResponseJSON(ctx, "", "", err)
return
}
ctx.JSON(200, gin.H{"favorited": favorited})
}
// ToggleEventFavorite godoc
// @Summary Toggle Event Favorite
// @Description Adds the event to favorites if not already favorited, removes it if already favorited.
// @Tags Events
// @Produce json
// @Param event_id path string true "Event ID"
// @Success 200 {object} map[string]interface{}
// @Failure 400 {object} dto.ErrorResponse
// @Failure 401 {object} dto.ErrorResponse
// @Security BearerAuth
// @Router /api/v1/events/{event_id}/favorite [put]
func (c *favoriteController) ToggleEventFavorite(ctx *gin.Context) {
eventID := ctx.Param("event_id")
userID := ParseUserId(ctx)
if userID == "" {
return
}
favorited, err := c.favoriteService.ToggleEventFavorite(ctx.Request.Context(), userID, eventID)
if err != nil {
ResponseJSON(ctx, "", "", err)
return
}
ctx.JSON(200, gin.H{"favorited": favorited})
}
// GetFavoriteClasses godoc
// @Summary Get favorite classes
// @Description Returns a paginated list of classes favorited by the authenticated user. Response structure matches /api/v1/classes/search.
// @Tags Classes
// @Produce json
// @Param page query int false "Page (default: 1)"
// @Param limit query int false "Limit (default: 10)"
// @Success 200 {object} dto.SearchClassesResponse
// @Failure 401 {object} dto.ErrorResponse
// @Security BearerAuth
// @Router /api/v1/classes/favorites [get]
func (c *favoriteController) GetFavoriteClasses(ctx *gin.Context) {
userID := ParseUserId(ctx)
if userID == "" {
return
}
page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1"))
limit, _ := strconv.Atoi(ctx.DefaultQuery("limit", "10"))
res, err := c.favoriteService.GetFavoriteClasses(ctx.Request.Context(), userID, page, limit)
ResponseJSON(ctx, "", res, err)
}
// GetFavoriteEvents godoc
// @Summary Get favorite events
// @Description Returns a paginated list of events favorited by the authenticated user. Response structure matches /api/v1/events.
// @Tags Events
// @Produce json
// @Param page query int false "Page (default: 1)"
// @Param limit query int false "Limit (default: 10)"
// @Success 200 {object} dto.EventListResponse
// @Failure 401 {object} dto.ErrorResponse
// @Security BearerAuth
// @Router /api/v1/events/favorites [get]
func (c *favoriteController) GetFavoriteEvents(ctx *gin.Context) {
userID := ParseUserId(ctx)
if userID == "" {
return
}
page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1"))
limit, _ := strconv.Atoi(ctx.DefaultQuery("limit", "10"))
res, err := c.favoriteService.GetFavoriteEvents(ctx.Request.Context(), userID, page, limit)
ResponseJSON(ctx, "", res, err)
}