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