flamingo.me/flamingo-commerce/v3@v3.11.0/product/interfaces/graphql/dto.go (about) 1 package graphql 2 3 import ( 4 "sort" 5 6 "flamingo.me/flamingo/v3/framework/flamingo" 7 8 "flamingo.me/flamingo-commerce/v3/product/application" 9 graphqlProductDto "flamingo.me/flamingo-commerce/v3/product/interfaces/graphql/product/dto" 10 searchdomain "flamingo.me/flamingo-commerce/v3/search/domain" 11 "flamingo.me/flamingo-commerce/v3/search/interfaces/graphql/searchdto" 12 "flamingo.me/flamingo-commerce/v3/search/utils" 13 ) 14 15 // WrapSearchResult wraps the search result into the graphql dto 16 func WrapSearchResult(res *application.SearchResult) *SearchResultDTO { 17 return &SearchResultDTO{ 18 result: res, 19 } 20 } 21 22 // SearchResultDTO search result dto for graphql 23 type SearchResultDTO struct { 24 result *application.SearchResult 25 logger flamingo.Logger 26 } 27 28 // Inject dependencies 29 func (obj *SearchResultDTO) Inject(logger flamingo.Logger) { 30 obj.logger = logger 31 } 32 33 // Suggestions get suggestions 34 func (obj *SearchResultDTO) Suggestions() []searchdomain.Suggestion { 35 return obj.result.Suggestions 36 } 37 38 func (obj *SearchResultDTO) Actions() []searchdomain.Action { 39 return obj.result.Actions 40 } 41 42 // Products get products 43 func (obj *SearchResultDTO) Products() []graphqlProductDto.Product { 44 products := make([]graphqlProductDto.Product, 0, len(obj.result.Products)) 45 for _, p := range obj.result.Products { 46 products = append(products, graphqlProductDto.NewGraphqlProductDto(p, nil, nil)) 47 } 48 49 return products 50 } 51 52 // SearchMeta get search meta 53 func (obj *SearchResultDTO) SearchMeta() searchdomain.SearchMeta { 54 return obj.result.SearchMeta 55 } 56 57 // PaginationInfo get pagination info 58 func (obj *SearchResultDTO) PaginationInfo() utils.PaginationInfo { 59 return obj.result.PaginationInfo 60 } 61 62 // Facets get facets 63 func (obj *SearchResultDTO) Facets() []searchdto.CommerceSearchFacet { 64 var res = []searchdto.CommerceSearchFacet{} 65 66 for _, facet := range obj.result.Facets { 67 mappedFacet := mapFacet(facet, obj.logger) 68 if mappedFacet != nil { 69 res = append(res, mappedFacet) 70 } 71 } 72 73 sort.Slice(res, func(i, j int) bool { 74 return res[i].Position() < res[j].Position() 75 }) 76 77 return res 78 } 79 80 // Promotion returns possible promotion data 81 func (obj *SearchResultDTO) Promotion() *searchdto.PromotionDTO { 82 if len(obj.result.Promotions) > 0 { 83 return searchdto.WrapPromotion(&obj.result.Promotions[0]) 84 } 85 86 return nil 87 } 88 89 func mapFacet(facet searchdomain.Facet, logger flamingo.Logger) searchdto.CommerceSearchFacet { 90 switch searchdomain.FacetType(facet.Type) { 91 case searchdomain.ListFacet: 92 return searchdto.WrapListFacet(facet) 93 94 case searchdomain.TreeFacet: 95 return searchdto.WrapTreeFacet(facet) 96 97 case searchdomain.RangeFacet: 98 return searchdto.WrapRangeFacet(facet) 99 100 default: 101 logger.Warn("Trying to map unknown facet type: ", facet.Type) 102 return nil 103 } 104 } 105 106 // HasSelectedFacet check if there are any selected facets 107 func (obj *SearchResultDTO) HasSelectedFacet() bool { 108 return len(obj.result.SearchMeta.SelectedFacets) > 0 109 }