From cb4a7c40b70f94862de6408ce0af503d84a684ac Mon Sep 17 00:00:00 2001 From: Niklas Fondberg Date: Wed, 1 Sep 2021 15:27:52 +0200 Subject: [PATCH] Add product blacklisting mutation (#18) --- src/datasources/product-api.ts | 29 +++++++++++++++++++++++++++++ src/index.ts | 2 +- src/resolvers/products-resolver.ts | 7 +++++++ src/schema.graphql | 12 ++++++++++++ src/types/product-types.ts | 10 ++++++++++ 5 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/datasources/product-api.ts b/src/datasources/product-api.ts index 265f83c..a4aa50b 100644 --- a/src/datasources/product-api.ts +++ b/src/datasources/product-api.ts @@ -12,6 +12,8 @@ import { Orientation, ProductsFilterInput, ProductInfoInput, + ProductBlacklistInput, + ProductBlacklistMarketInput, } from '../types/product-types'; import { Maybe } from '../types/types'; import { convertToPossibleType } from './utils'; @@ -200,4 +202,31 @@ export class ProductAPI extends BaseSQLDataSource { ); return Promise.all(promises); } + + async updateBlacklisting( + productId: number, + markets: Array, + ) { + const sql = /* sql */ ` + INSERT INTO product_blacklist (product_id, group_id, market_id, created_at, updated_at) + VALUES (?, ?, ?, now(), now()) + ON CONFLICT (product_id, group_id, market_id) + DO NOTHING`; + + const insertsPromises = []; + const deleteQuery = this.knex.raw( + /* sql */ ` + DELETE FROM product_blacklist WHERE product_id = ? + `, + [productId], + ); + insertsPromises.push(deleteQuery); + markets.forEach((market) => { + market.groupIds.forEach((groupId) => { + const query = this.knex.raw(sql, [productId, groupId, market.marketId]); + insertsPromises.push(query); + }); + }); + return Promise.all(insertsPromises); + } } diff --git a/src/index.ts b/src/index.ts index 2ac2995..3c6ef47 100644 --- a/src/index.ts +++ b/src/index.ts @@ -69,7 +69,7 @@ async function main() { resolvers, dataSources, context, - introspection: false, + introspection: true, }); await server.listen(); diff --git a/src/resolvers/products-resolver.ts b/src/resolvers/products-resolver.ts index e8e8eb7..858f4aa 100644 --- a/src/resolvers/products-resolver.ts +++ b/src/resolvers/products-resolver.ts @@ -87,4 +87,11 @@ export const productMutationTypeDefs = { ); return (dataSources.productApi).getProduct(productId); }, + async productBlacklisting(_, { productId, markets }, { dataSources }) { + await (dataSources.productApi).updateBlacklisting( + productId, + markets, + ); + return (dataSources.productApi).getProduct(productId); + }, }; diff --git a/src/schema.graphql b/src/schema.graphql index 499b4b6..9695430 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -382,6 +382,18 @@ input ProductInfoInput { visible: Boolean! } +input ProductBlacklistingInput { + """ + Only ones used are ProductGroup: PHOTO_WALLPAPER CANVAS WALLPAPER POSTER + """ + marketId: Int! + groupIds: [Int] +} + type Mutation { productInfo(productId: Int!, info: ProductInfoInput!): Product + productBlacklisting( + productId: Int! + markets: [ProductBlacklistingInput] + ): Product } diff --git a/src/types/product-types.ts b/src/types/product-types.ts index a62e4b5..4a61c6f 100644 --- a/src/types/product-types.ts +++ b/src/types/product-types.ts @@ -15,6 +15,16 @@ export interface ProductInfoInput { visible: boolean; } +export interface ProductBlacklistMarketInput { + marketId: number; + groupIds: Array; +} +export interface ProductBlacklistInput { + productId: number; + markets: Array; +} + +// query types export interface ProductsFilterInput { pagination: PaginationInput; filter?: ProductsFilter;