/
searchService.go
130 lines (114 loc) · 4.53 KB
/
searchService.go
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package application
import (
"context"
"net/url"
"flamingo.me/flamingo-commerce/v3/product/domain"
"flamingo.me/flamingo-commerce/v3/search/application"
searchdomain "flamingo.me/flamingo-commerce/v3/search/domain"
"flamingo.me/flamingo-commerce/v3/search/utils"
"flamingo.me/flamingo/v3/framework/flamingo"
"flamingo.me/flamingo/v3/framework/web"
)
type (
// ProductSearchService - Application service that offers a more explicit way to search for product results - on top of the domain.ProductSearchService
ProductSearchService struct {
SearchService domain.SearchService `inject:""`
PaginationInfoFactory *utils.PaginationInfoFactory `inject:""`
DefaultPageSize float64 `inject:"config:commerce.product.pagination.defaultPageSize,optional"`
Logger flamingo.Logger `inject:""`
}
// SearchResult - much like the corresponding struct in search package, just that instead "Hits" we have a list of matching Products
SearchResult struct {
Suggestions []searchdomain.Suggestion
Products []domain.BasicProduct
SearchMeta searchdomain.SearchMeta
Facets searchdomain.FacetCollection
PaginationInfo utils.PaginationInfo
}
)
// Find return SearchResult with matched products - based on given input
func (s *ProductSearchService) Find(ctx context.Context, searchRequest *application.SearchRequest) (*SearchResult, error) {
var currentURL *url.URL
request := web.RequestFromContext(ctx)
if request == nil {
currentURL = nil
} else {
currentURL = request.Request().URL
}
if searchRequest == nil {
searchRequest = &application.SearchRequest{}
}
// pageSize can either be set in the request, or we use the configured default or if nothing set we rely on the ProductSearchService later
pageSize := searchRequest.PageSize
if pageSize == 0 {
pageSize = int(s.DefaultPageSize)
}
result, err := s.SearchService.Search(ctx, application.BuildFilters(*searchRequest, pageSize)...)
if err != nil {
return nil, err
}
if searchRequest.PaginationConfig == nil {
searchRequest.PaginationConfig = s.PaginationInfoFactory.DefaultConfig
}
if pageSize != 0 {
if err := result.SearchMeta.ValidatePageSize(pageSize); err != nil {
s.Logger.WithContext(ctx).WithField("category", "application.ProductSearchService").Warn("The Searchservice seems to ignore pageSize Filter")
}
}
paginationInfo := utils.BuildWith(utils.CurrentResultInfos{
LastPage: result.SearchMeta.NumPages,
TotalHits: result.SearchMeta.NumResults,
PageSize: searchRequest.PageSize,
ActivePage: result.SearchMeta.Page,
}, *searchRequest.PaginationConfig, currentURL)
return &SearchResult{
SearchMeta: result.SearchMeta,
Facets: result.Facets,
Suggestions: result.Suggestion,
Products: result.Hits,
PaginationInfo: paginationInfo,
}, nil
}
// FindBy return SearchResult with matched products filtered by the given attribute - based on given input
func (s *ProductSearchService) FindBy(ctx context.Context, attributeCode string, values []string, searchRequest *application.SearchRequest) (*SearchResult, error) {
var currentURL *url.URL
request := web.RequestFromContext(ctx)
if request == nil {
currentURL = nil
} else {
currentURL = request.Request().URL
}
if searchRequest == nil {
searchRequest = &application.SearchRequest{}
}
// pageSize can either be set in the request, or we use the configured default or if nothing set we rely on the ProductSearchService later
pageSize := searchRequest.PageSize
if pageSize == 0 {
pageSize = int(s.DefaultPageSize)
}
result, err := s.SearchService.SearchBy(ctx, attributeCode, values, application.BuildFilters(*searchRequest, pageSize)...)
if err != nil {
return nil, err
}
if searchRequest.PaginationConfig == nil {
searchRequest.PaginationConfig = s.PaginationInfoFactory.DefaultConfig
}
if pageSize != 0 {
if err := result.SearchMeta.ValidatePageSize(pageSize); err != nil {
s.Logger.WithContext(ctx).WithField("category", "application.ProductSearchService").Warn("The Searchservice seems to ignore pageSize Filter")
}
}
paginationInfo := utils.BuildWith(utils.CurrentResultInfos{
LastPage: result.SearchMeta.NumPages,
TotalHits: result.SearchMeta.NumResults,
PageSize: searchRequest.PageSize,
ActivePage: result.SearchMeta.Page,
}, *searchRequest.PaginationConfig, currentURL)
return &SearchResult{
SearchMeta: result.SearchMeta,
Facets: result.Facets,
Suggestions: result.Suggestion,
Products: result.Hits,
PaginationInfo: paginationInfo,
}, nil
}