File size: 2,774 Bytes
d8cdd09
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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)
}