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 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) | |
| } | |