/
controller.go
89 lines (76 loc) · 2.32 KB
/
controller.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
package interfaces
import (
"context"
"net/url"
"flamingo.me/flamingo-commerce/v3/search/application"
"flamingo.me/flamingo-commerce/v3/search/domain"
"flamingo.me/flamingo-commerce/v3/search/utils"
"flamingo.me/flamingo/v3/framework/web"
)
type (
// ViewController demonstrates a search view controller
ViewController struct {
responder *web.Responder
searchService *application.SearchService
paginationInfoFactory *utils.PaginationInfoFactory
}
viewData struct {
SearchMeta domain.SearchMeta
SearchResult map[string]*application.SearchResult
PaginationInfo utils.PaginationInfo
}
)
// Inject dependencies
func (vc *ViewController) Inject(responder *web.Responder,
paginationInfoFactory *utils.PaginationInfoFactory,
searchService *application.SearchService,
) *ViewController {
vc.responder = responder
vc.paginationInfoFactory = paginationInfoFactory
vc.searchService = searchService
return vc
}
// Get Response for search
func (vc *ViewController) Get(c context.Context, r *web.Request) web.Result {
query, _ := r.Query1("q")
vd := viewData{
SearchMeta: domain.SearchMeta{
Query: query,
},
}
searchRequest := application.SearchRequest{
Query: query,
}
searchRequest.AddAdditionalFilters(domain.NewKeyValueFilters(r.QueryAll())...)
if typ, ok := r.Params["type"]; ok {
searchResult, err := vc.searchService.FindBy(c, typ, searchRequest)
if err != nil {
if re, ok := err.(*domain.RedirectError); ok {
u, _ := url.Parse(re.To)
return vc.responder.URLRedirect(u).Permanent()
}
return vc.responder.ServerError(err)
}
vd.SearchMeta = searchResult.SearchMeta
vd.SearchMeta.Query = query
vd.SearchResult = map[string]*application.SearchResult{typ: searchResult}
vd.PaginationInfo = vc.paginationInfoFactory.Build(
searchResult.SearchMeta.Page,
searchResult.SearchMeta.NumResults,
searchRequest.PageSize,
searchResult.SearchMeta.NumPages,
r.Request().URL,
)
return vc.responder.Render("search/"+typ, vd)
}
searchResult, err := vc.searchService.Find(c, searchRequest)
if err != nil {
if re, ok := err.(*domain.RedirectError); ok {
u, _ := url.Parse(re.To)
return vc.responder.URLRedirect(u).Permanent()
}
return vc.responder.ServerError(err)
}
vd.SearchResult = searchResult
return vc.responder.Render("search/search", vd)
}