diff --git a/internal/controller/search_controller.go b/internal/controller/search_controller.go index 5e2e4ae6..5b658351 100644 --- a/internal/controller/search_controller.go +++ b/internal/controller/search_controller.go @@ -3,12 +3,9 @@ package controller import ( "github.com/answerdev/answer/internal/base/handler" "github.com/answerdev/answer/internal/base/middleware" - "github.com/answerdev/answer/internal/base/reason" "github.com/answerdev/answer/internal/schema" "github.com/answerdev/answer/internal/service" - "github.com/answerdev/answer/pkg/converter" "github.com/gin-gonic/gin" - "github.com/segmentfault/pacman/errors" ) // SearchController tag controller @@ -32,39 +29,12 @@ func NewSearchController(searchService *service.SearchService) *SearchController // @Success 200 {object} handler.RespBody{data=schema.SearchListResp} // @Router /answer/api/v1/search [get] func (sc *SearchController) Search(ctx *gin.Context) { - var ( - q, - order, - page, - size string - ok bool - dto schema.SearchDTO - ) - q, ok = ctx.GetQuery("q") - if len(q) == 0 || !ok { - handler.HandleResponse(ctx, errors.BadRequest(reason.RequestFormatError), q) + dto := schema.SearchDTO{} + + if handler.BindAndCheck(ctx, &dto) { return } - page, ok = ctx.GetQuery("page") - if !ok { - page = "1" - } - size, ok = ctx.GetQuery("size") - if !ok { - size = "30" - } - order, ok = ctx.GetQuery("order") - if !ok || (order != "newest" && order != "active" && order != "score" && order != "relevance") { - order = "newest" - } - - dto = schema.SearchDTO{ - Query: q, - Page: converter.StringToInt(page), - Size: converter.StringToInt(size), - UserID: middleware.GetLoginUserIDFromContext(ctx), - Order: order, - } + dto.UserID = middleware.GetLoginUserIDFromContext(ctx) resp, total, extra, err := sc.searchService.Search(ctx, &dto) diff --git a/internal/schema/search_schema.go b/internal/schema/search_schema.go index 9fdd5728..5cf8c577 100644 --- a/internal/schema/search_schema.go +++ b/internal/schema/search_schema.go @@ -1,13 +1,11 @@ package schema type SearchDTO struct { - // Query the query string - Query string - // UserID current login user ID - UserID string - Page int - Size int - Order string + UserID string // UserID current login user ID + Query string `validate:"required,gte=1,lte=60" json:"q" form:"q"` // Query the query string + Page int `validate:"omitempty,min=1" form:"page,default=1" json:"page"` //Query number of pages + Size int `validate:"omitempty,min=1,max=50" form:"size,default=30" json:"size"` //Search page size + Order string `validate:"required,oneof=newest active score relevance" form:"order,default=relevance" json:"order" enums:"newest,active,score,relevance"` } type SearchObject struct {