package controllers import ( "abdanhafidz.com/go-boilerplate/models/dto" "abdanhafidz.com/go-boilerplate/services" "github.com/gin-gonic/gin" ) type HomeController interface { GetHomeData(ctx *gin.Context) GetSchedules(ctx *gin.Context) GetEventCategories(ctx *gin.Context) GetClassCategories(ctx *gin.Context) } type homeController struct { homeService services.HomeService } func NewHomeController(homeService services.HomeService) HomeController { return &homeController{homeService: homeService} } // GetHomeData godoc // @Summary Get Home Page Data // @Description Return all sections needed by the home page in one aggregated response. // @Tags Home Dashboard // @Accept json // @Produce json // @Param date query string false "Selected date for schedule card section (YYYY-MM-DD)" // @Param latitude query number false "User latitude" // @Param longitude query number false "User longitude" // @Param city query string false "User city" // @Success 200 {object} dto.HomeResponseWrapper // @Failure 400 {object} dto.ErrorResponse // @Security BearerAuth // @Router /api/v1/home [get] func (c *homeController) GetHomeData(ctx *gin.Context) { userId := ParseUserId(ctx) rawParams := map[string]string{ "date": ctx.Query("date"), "latitude": ctx.Query("latitude"), "longitude": ctx.Query("longitude"), "city": ctx.Query("city"), } // Validate request parameters params, err := dto.ValidateHomeParams(rawParams) if err != nil { ResponseJSON(ctx, "", dto.HomeResponse{}, err) return } res, err := c.homeService.GetHomeData(ctx.Request.Context(), userId, params) ResponseJSON(ctx, "", res, err) } // GetSchedules godoc // @Summary Get Schedule List // @Description Get a list of class or event schedules based on date range, city, filters, etc. // @Tags Home Dashboard // @Accept json // @Produce json // @Param date query string false "Exact date (YYYY-MM-DD)" // @Param start_date query string false "Start date range (YYYY-MM-DD)" // @Param end_date query string false "End date range (YYYY-MM-DD)" // @Param city query string false "Filter by city" // @Param level query string false "Filter by class level (e.g., beginner)" // @Param category query string false "Filter by class category (e.g., salsa)" // @Param page query int false "Page number (default: 1)" // @Param limit query int false "Items per page (default: 10, max: 100)" // @Success 200 {object} dto.ScheduleListResponseWrapper // @Failure 400 {object} dto.ErrorResponse // @Security BearerAuth // @Router /api/v1/schedules [get] func (c *homeController) GetSchedules(ctx *gin.Context) { userId := ParseUserId(ctx) rawParams := map[string]string{ "date": ctx.Query("date"), "start_date": ctx.Query("start_date"), "end_date": ctx.Query("end_date"), "city": ctx.Query("city"), "level": ctx.Query("level"), "category": ctx.Query("category"), "page": ctx.Query("page"), "limit": ctx.Query("limit"), } // Validate request parameters params, err := dto.ValidateScheduleParams(rawParams) if err != nil { ResponseJSON(ctx, "", dto.ScheduleListResponse{}, err) return } res, err := c.homeService.GetSchedules(ctx.Request.Context(), userId, params) ResponseJSON(ctx, "", res, err) } // GetEventCategories godoc // @Summary Get Event Categories // @Description Get master list of event categories // @Tags Master Data // @Accept json // @Produce json // @Success 200 {object} dto.CategoryResponseWrapper // @Failure 400 {object} dto.ErrorResponse // @Router /api/v1/event-categories [get] func (c *homeController) GetEventCategories(ctx *gin.Context) { res, err := c.homeService.GetEventCategories(ctx.Request.Context()) ResponseJSON(ctx, "", res, err) } // GetClassCategories godoc // @Summary Get Class Categories // @Description Get master list of class categories // @Tags Master Data // @Accept json // @Produce json // @Success 200 {object} dto.CategoryResponseWrapper // @Failure 400 {object} dto.ErrorResponse // @Router /api/v1/class-categories [get] func (c *homeController) GetClassCategories(ctx *gin.Context) { res, err := c.homeService.GetClassCategories(ctx.Request.Context()) ResponseJSON(ctx, "", res, err) }