Spaces:
Runtime error
Runtime error
| 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) | |
| } | |