Cart Service
CartService is found in Poq.Shopify.Services namespace. Cart service uses only Shopify Storefront API to store data and can be used for both feedless and feed implementation of BFC. It requires two dependencies to be used in your backend. All required dependencies should be registered using IoC:
services.AddScoped<IShopifyCartClient, ShopifyCartClient>();services.AddScoped<ICartResponseModifier, CartResponseModifier>();services.AddScoped<ICartService, CartService>();Explanation of services
IShopifyCartClientis available as part of Poq Shopify nuget package. No further action is required than properly registering the service.ICartServicewith implementationCartServiceCart Services stores user cart information by using Shopify Storefront Api. Service functionality and product items mapping can be modified by providing custom implementation of
ICartResponseModifier.ICartResponseModifierwith implementationCartResponseModifieris responsible of mappingShopifyCartobject received from Shopify API toCartWithProductsResponseobject.
Here in an example of overriding default handling in ICartResponseModifier.
services.AddScoped<ICartResponseModifier, MyCartResponseModifier>();
public class MyCartResponseModifier : ICartResponseModifier{ public async Task<PoqResponse<CartWithProductsResponse>> CreateCartWithProductsResponse(ShopifyCart shopifyCart, string appIdentifier, string currency) { if (shopifyCart == null || shopifyCart?.Lines?.Count <= 0) { return new PoqResponse<CartWithProductsResponse>(new HttpResponseMessage(HttpStatusCode.OK), new CartWithProductsResponse(shopifyCart.Id, new Price(shopifyCart.EstimatedCost.TotalAmount.Amount ?? 0)) { CustomData = MapAttributesToCustomData(shopifyCart.Attributes) }); }
var cartProducts = new List<CartItemWithProductResponse>(); foreach (var item in shopifyCart.Lines!) { var cartLineItem = item.CartLineItem!;
var shopifyVariant = cartLineItem?.Merchandise; cartProducts.Add(new CartItemWithProductResponse() { Product = new CartProductResponse() {
}, Id = cartLineItem?.Id ?? string.Empty, ListingId = GetEntityId(shopifyVariant?.Product?.Id), ProductId = GetEntityId(shopifyVariant?.Product?.Id), VariantId = GetEntityId(shopifyVariant?.Id), VariantName = shopifyVariant?.SelectedOptions? .FirstOrDefault(x => string.Equals(x.Name, "size", StringComparison.OrdinalIgnoreCase))?.Value ?? "One Size", Brand = shopifyVariant?.Product.Vendor, Color = shopifyVariant?.SelectedOptions? .FirstOrDefault(x => string.Equals(x.Name, "colour", StringComparison.OrdinalIgnoreCase) || string.Equals(x.Name, "color", StringComparison.OrdinalIgnoreCase))?.Value, IsInStock = shopifyVariant?.AvailableForSale ?? false, ThumbnailUrl = shopifyVariant?.Image?.Url ?? string.Empty, Quantity = cartLineItem?.Quantity ?? 0, Title = shopifyVariant?.Product?.Title ?? string.Empty, CustomData = MapAttributesToCustomData(cartLineItem?.Attributes), Price = new Price(shopifyVariant?.Price.Amount ?? 0), Total = new Price((shopifyVariant?.Price.Amount ?? 0) * (cartLineItem?.Quantity ?? 0)) }); }
return new PoqResponse<CartWithProductsResponse>(new HttpResponseMessage(HttpStatusCode.OK), new CartWithProductsResponse(shopifyCart.Id, new Price(shopifyCart.EstimatedCost.TotalAmount.Amount ?? 0)) { CartItems = cartProducts, CustomData = MapAttributesToCustomData(shopifyCart.Attributes) }); }
...}Methods
GetCartAsyncGet cart data by using underlying Shopify integration.UpdateCartAsyncUpdates underlying cart.AddToCartAsyncAdds item to underlying cart.
All methods use Poq Contract classes for their interface and can handle incoming request data. Be cautious to error messages returned. Similarly to Shopify storefront graphql API Poq Shopify SDK returns successful status codes with error messages inside.