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  }