DanzApp-BE-Test / controllers /home_controller.go
lifedebugger's picture
Deploy files from GitHub repository
0ce191c
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)
}