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) }