package controllers import ( "abdanhafidz.com/go-boilerplate/models/dto" "abdanhafidz.com/go-boilerplate/services" "github.com/gin-gonic/gin" ) type SearchController interface { SearchClasses(ctx *gin.Context) GetFiltersMetadata(ctx *gin.Context) } type searchController struct { searchService services.SearchService } func NewSearchController(searchService services.SearchService) SearchController { return &searchController{searchService: searchService} } // SearchClasses godoc // @Summary Search for Classes // @Description Search classes with filters and sorting options // @Tags Classes // @Accept json // @Produce json // @Param q query string false "Search query" // @Param location_name query string false "Location name" // @Param latitude query number false "User latitude" // @Param longitude query number false "User longitude" // @Param sort_by query string false "Sort by (nearest|popular|rating|newest)" default(nearest) // @Param page query integer false "Page number" default(1) // @Param limit query integer false "Items per page" default(10) // @Param view_type query string false "View type" default(class) // @Param category query string false "Category" default(all) // @Param dance_type query string false "Dance type" // @Success 200 {object} dto.SearchClassesResponse // @Failure 400 {object} dto.ErrorResponse // @Failure 401 {object} dto.ErrorResponse // @Security BearerAuth // @Router /api/v1/classes/search [get] func (c *searchController) SearchClasses(ctx *gin.Context) { userID := ParseUserId(ctx) var params dto.SearchClassesParams if err := ctx.ShouldBindQuery(¶ms); err != nil { ResponseJSON(ctx, "", dto.SearchClassesResponse{}, err) return } res, err := c.searchService.SearchClasses(ctx.Request.Context(), params, userID) ResponseJSON(ctx, "", res, err) } // GetFiltersMetadata godoc // @Summary Get Class Filters Metadata // @Description Returns available filter options for class search // @Tags Classes // @Accept json // @Produce json // @Success 200 {object} dto.FiltersMetadataResponse // @Failure 400 {object} dto.ErrorResponse // @Failure 401 {object} dto.ErrorResponse // @Security BearerAuth // @Router /api/v1/classes/filters [get] func (c *searchController) GetFiltersMetadata(ctx *gin.Context) { res, err := c.searchService.GetFiltersMetadata(ctx.Request.Context()) ResponseJSON(ctx, "", res, err) }