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  }