|
|
|
package content
|
|
|
|
|
|
|
|
import (
|
|
|
|
"html"
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
|
|
|
"github.com/go-sonic/sonic/consts"
|
|
|
|
"github.com/go-sonic/sonic/handler/binding"
|
|
|
|
"github.com/go-sonic/sonic/model/dto"
|
|
|
|
"github.com/go-sonic/sonic/model/param"
|
|
|
|
"github.com/go-sonic/sonic/model/property"
|
|
|
|
"github.com/go-sonic/sonic/service"
|
|
|
|
"github.com/go-sonic/sonic/service/assembler"
|
|
|
|
"github.com/go-sonic/sonic/template"
|
|
|
|
"github.com/go-sonic/sonic/util"
|
|
|
|
"github.com/go-sonic/sonic/util/xerr"
|
|
|
|
)
|
|
|
|
|
|
|
|
type SearchHandler struct {
|
|
|
|
PostAssembler assembler.PostAssembler
|
|
|
|
PostService service.PostService
|
|
|
|
OptionService service.OptionService
|
|
|
|
ThemeService service.ThemeService
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewSearchHandler(
|
|
|
|
postAssembler assembler.PostAssembler,
|
|
|
|
postService service.PostService,
|
|
|
|
optionService service.OptionService,
|
|
|
|
themeService service.ThemeService,
|
|
|
|
) *SearchHandler {
|
|
|
|
return &SearchHandler{
|
|
|
|
PostAssembler: postAssembler,
|
|
|
|
PostService: postService,
|
|
|
|
OptionService: optionService,
|
|
|
|
ThemeService: themeService,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *SearchHandler) Search(ctx *gin.Context, model template.Model) (string, error) {
|
|
|
|
return s.search(ctx, 0, model)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *SearchHandler) PageSearch(ctx *gin.Context, model template.Model) (string, error) {
|
|
|
|
page, err := util.ParamInt32(ctx, "page")
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
return s.search(ctx, int(page)-1, model)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *SearchHandler) search(ctx *gin.Context, pageNum int, model template.Model) (string, error) {
|
|
|
|
keyword, err := util.MustGetQueryString(ctx, "keyword")
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
sort := param.Sort{}
|
|
|
|
err = ctx.ShouldBindWith(&sort, binding.CustomFormBinding)
|
|
|
|
if err != nil {
|
|
|
|
return "", xerr.WithStatus(err, xerr.StatusBadRequest).WithMsg("Parameter error")
|
|
|
|
}
|
|
|
|
if len(sort.Fields) == 0 {
|
|
|
|
sort = s.OptionService.GetPostSort(ctx)
|
|
|
|
}
|
|
|
|
defaultPageSize := s.OptionService.GetIndexPageSize(ctx)
|
|
|
|
page := param.Page{
|
|
|
|
PageNum: pageNum,
|
|
|
|
PageSize: defaultPageSize,
|
|
|
|
}
|
|
|
|
postQuery := param.PostQuery{
|
|
|
|
Page: page,
|
|
|
|
Sort: &sort,
|
|
|
|
Keyword: &keyword,
|
|
|
|
Statuses: []*consts.PostStatus{consts.PostStatusPublished.Ptr()},
|
|
|
|
}
|
|
|
|
posts, total, err := s.PostService.Page(ctx, postQuery)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
postVOs, err := s.PostAssembler.ConvertToListVO(ctx, posts)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
model["is_search"] = true
|
|
|
|
model["keyword"] = html.EscapeString(keyword)
|
|
|
|
model["posts"] = dto.NewPage(postVOs, total, page)
|
|
|
|
model["meta_keywords"] = s.OptionService.GetOrByDefault(ctx, property.SeoKeywords)
|
|
|
|
model["meta_description"] = s.OptionService.GetOrByDefault(ctx, property.SeoDescription)
|
|
|
|
return s.ThemeService.Render(ctx, "search")
|
|
|
|
}
|