flamingo.me/flamingo-commerce/v3@v3.11.0/product/interfaces/graphql/resolver.go (about) 1 package graphql 2 3 import ( 4 "context" 5 6 priceDomain "flamingo.me/flamingo-commerce/v3/price/domain" 7 productApplication "flamingo.me/flamingo-commerce/v3/product/application" 8 "flamingo.me/flamingo-commerce/v3/product/domain" 9 productDto "flamingo.me/flamingo-commerce/v3/product/interfaces/graphql/product/dto" 10 "flamingo.me/flamingo-commerce/v3/search/application" 11 searchDomain "flamingo.me/flamingo-commerce/v3/search/domain" 12 "flamingo.me/flamingo-commerce/v3/search/interfaces/graphql/searchdto" 13 ) 14 15 // CommerceProductQueryResolver resolves graphql product queries 16 type CommerceProductQueryResolver struct { 17 productService domain.ProductService 18 searchService *productApplication.ProductSearchService 19 } 20 21 // Inject dependencies 22 func (r *CommerceProductQueryResolver) Inject( 23 productService domain.ProductService, 24 searchService *productApplication.ProductSearchService, 25 ) *CommerceProductQueryResolver { 26 r.productService = productService 27 r.searchService = searchService 28 return r 29 } 30 31 // CommerceProduct returns a product with the given marketplaceCode from productService 32 func (r *CommerceProductQueryResolver) CommerceProduct(ctx context.Context, 33 marketplaceCode string, 34 variantMarketPlaceCode *string, 35 bundleConfiguration []*productDto.ChoiceConfiguration) (productDto.Product, error) { 36 product, err := r.productService.Get(ctx, marketplaceCode) 37 38 if err != nil { 39 return nil, err 40 } 41 42 domainBundleConfiguration := mapToDomain(bundleConfiguration) 43 44 return productDto.NewGraphqlProductDto(product, variantMarketPlaceCode, domainBundleConfiguration), nil 45 } 46 47 // CommerceProductSearch returns a search result of products based on the given search request 48 func (r *CommerceProductQueryResolver) CommerceProductSearch(ctx context.Context, request searchdto.CommerceSearchRequest) (*SearchResultDTO, error) { 49 var filters []searchDomain.Filter 50 for _, filter := range request.KeyValueFilters { 51 filters = append(filters, searchDomain.NewKeyValueFilter(filter.K, filter.V)) 52 } 53 54 result, err := r.searchService.Find(ctx, &application.SearchRequest{ 55 AdditionalFilter: filters, 56 PageSize: request.PageSize, 57 Page: request.Page, 58 SortBy: request.SortBy, 59 Query: request.Query, 60 PaginationConfig: nil, 61 }) 62 63 if err != nil { 64 return nil, err 65 } 66 67 return WrapSearchResult(result), nil 68 } 69 70 // ActiveBase resolves to price 71 func (r *CommerceProductQueryResolver) ActiveBase(_ context.Context, priceInfo *domain.PriceInfo) (*priceDomain.Price, error) { 72 result := priceDomain.NewFromBigFloat(priceInfo.ActiveBase, priceInfo.Default.Currency()) 73 return &result, nil 74 } 75 76 func mapToDomain(dtoChoices []*productDto.ChoiceConfiguration) domain.BundleConfiguration { 77 domainConfiguration := make(domain.BundleConfiguration) 78 79 for _, choice := range dtoChoices { 80 if choice == nil { 81 continue 82 } 83 84 variantMarketplaceCode := "" 85 86 if choice.VariantMarketplaceCode != nil { 87 variantMarketplaceCode = *choice.VariantMarketplaceCode 88 } 89 90 domainConfiguration[domain.Identifier(choice.Identifier)] = domain.ChoiceConfiguration{ 91 MarketplaceCode: choice.MarketplaceCode, 92 VariantMarketplaceCode: variantMarketplaceCode, 93 Qty: choice.Qty, 94 } 95 } 96 97 return domainConfiguration 98 }