import { ProductAPI } from '../datasources/product-api'; import { Product, ProductListResult, ProductsFilterInput, } from '../types/product-types'; import { CategoryAPI } from '../datasources/category-api'; import { Category } from '../types/category-types'; import { KeywordAPI } from '../datasources/keyword-api'; import { Keyword } from '../types/keyword-types'; import { MarketLocaleAPI } from '../datasources/market-locale-api'; import { InteriorAPI } from '../datasources/interior-api'; import { InteriorsLambdaAPI } from '../datasources/interiors-lambda-api'; const ProductBlacklist = { async market(parent, _args, { dataSources }) { return (dataSources.marketLocaleApi).getMarketById( parent.marketId, ); }, }; const Product = { // (parent, args, ctx, info) async categories({ id }, _args, { dataSources }): Promise> { return (dataSources.categoryApi).getProductCategories(id); }, async designer({ designerId }, _args, { dataSources }) { if (!designerId) { return null; } return dataSources.designerApi.getDesignerById(designerId); }, async keywords({ id }, _args, { dataSources }): Promise> { return (dataSources.keywordApi).getProductKeywords(id); }, async related({ id }, _args, { dataSources }) { return (dataSources.productApi).getRelatedProducts(id); }, }; const PrintProduct = { async interiors({ id }, _args, { dataSources }) { return (dataSources.interiorApi).getPrintProductInteriors(id); }, }; async function getProductsResult( _, input: ProductsFilterInput, { dataSources }, ): Promise { const total = (dataSources.productApi).getProductsTotal(input); const items = (dataSources.productApi).getProducts(input); return { pagination: { limit: input.pagination.limit, offset: 0, // TODO: this will be implemented later if the client app needs it total: total, }, items: items, }; } async function getProduct(_, { id }, { dataSources }): Promise { return (dataSources.productApi).getProduct(id); } export const productTypeDefs = { ProductBlacklist, Product, PrintProduct, }; export const productQueryTypeDefs = { products: getProductsResult, product: getProduct, }; /////////////////// // Mutations below export const productMutationTypeDefs = { async productInfo(_, { productId, info }, { dataSources }) { await (dataSources.productApi).updateProductInfo( productId, info, ); return (dataSources.productApi).getProduct(productId); }, async productFocusPoint( _, { productId, focusXpoint2, focusYpoint2 }, { dataSources }, ) { await (dataSources.productApi).updateFocusPoint( productId, focusXpoint2, focusYpoint2, ); return (dataSources.productApi).getProduct(productId); }, async productBlacklisting(_, { productId, markets }, { dataSources }) { await (dataSources.productApi).updateBlacklisting( productId, markets, ); return (dataSources.productApi).getProduct(productId); }, async productGroup(_, { productId, groupIds }, { dataSources }) { await (dataSources.productApi).updateGroups( productId, groupIds, ); const product = await (dataSources.productApi).getProduct( productId, ); await (( dataSources.interiorsLambdaApi )).generateNewInteriors(product); return product; }, async productKeywords(_, { productId, keywordIds }, { dataSources }) { await (dataSources.keywordApi).setProductKeywords( productId, keywordIds, ); return (dataSources.productApi).getProduct(productId); }, async productWallpaperType( _, { productId, wallpaperTypes }, { dataSources }, ) { await (dataSources.productApi).setWallpaperTypes( productId, wallpaperTypes, ); return (dataSources.productApi).getProduct(productId); }, };