DanzApp-BE-Test / controllers /search_controller.go
lifedebugger's picture
Deploy files from GitHub repository
d8cdd09
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(&params); 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)
}