From 68e7414e324eff6726e9e13b3f25dbcbb3a34936 Mon Sep 17 00:00:00 2001 From: Niklas Fondberg Date: Wed, 27 Oct 2021 13:15:16 +0200 Subject: [PATCH] Break out ref and copyright to own responses (#79) --- src/datasources/product-api.ts | 51 ++++++++++++++++-------------- src/resolvers/products-resolver.ts | 4 +-- src/schema.graphql | 7 ++++ src/types/product-types.ts | 10 ++++++ 4 files changed, 46 insertions(+), 26 deletions(-) diff --git a/src/datasources/product-api.ts b/src/datasources/product-api.ts index e72b33a..113abd4 100644 --- a/src/datasources/product-api.ts +++ b/src/datasources/product-api.ts @@ -18,6 +18,7 @@ import { ProductSizeTypes, ProductProportionsInput, Batch, + Copyright, } from '../types/product-types'; import { Maybe } from '../types/types'; import { @@ -240,34 +241,36 @@ export class ProductAPI extends BaseSQLDataSource { } async searchByBatch(name: string): Promise> { - const query = sql.searchByFieldValue(36); // batch - - const batchRes = await this.knex - .raw(query, name) - .then((data) => data.rows.map((row) => this.createProductFromRow(row))); - - const batches = {}; - batchRes.forEach((p) => { - if (!batches[p.fields.batch]) { - batches[p.fields.batch] = []; - } - batches[p.fields.batch].push(p); - }); - - return Object.keys(batches).map((key) => { - return { - name: key, - products: batches[key], - }; - }); + return this.searchByFieldValue(name, 36, 'batch'); } + async searchByCopyright(name: string): Promise> { + return this.searchByFieldValue(name, 25, 'copyright'); + } + async searchByFieldValue( + name: string, + fieldNo: number, + fieldKey: string, + ): Promise> { + const query = sql.searchByFieldValue(fieldNo); - async searchByCopyright(name: string): Promise> { - const query = sql.searchByFieldValue(25); // copyright - - return this.knex + const rows = await this.knex .raw(query, name) .then((data) => data.rows.map((row) => this.createProductFromRow(row))); + + const result = {}; + rows.forEach((p) => { + if (!result[p.fields[fieldKey]]) { + result[p.fields[fieldKey]] = []; + } + result[p.fields[fieldKey]].push(p); + }); + + return Object.keys(result).map((key) => { + return { + name: key, + products: result[key], + } as unknown as T; + }); } async searchByReferences(name: string): Promise> { diff --git a/src/resolvers/products-resolver.ts b/src/resolvers/products-resolver.ts index c1e1154..c995005 100644 --- a/src/resolvers/products-resolver.ts +++ b/src/resolvers/products-resolver.ts @@ -84,8 +84,6 @@ async function getProductsSearchResult( const prods = Promise.all([ prodApi.searchByName(q), prodApi.searchByArtNo(q), - prodApi.searchByCopyright(q), - prodApi.searchByReferences(q), ]).then((d) => d.flat()); return { @@ -95,6 +93,8 @@ async function getProductsSearchResult( keywords: keywApi.searchKeywords(q), categories: catApi.searchCategories(q), designers: designerApi.searchDesigners(q), + copyrights: prodApi.searchByCopyright(q), + references: prodApi.searchByReferences(q), }; } diff --git a/src/schema.graphql b/src/schema.graphql index 49d4069..3ae1a32 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -103,6 +103,8 @@ type ProductsSearchResult { keywords: [Keyword] categories: [Category] designers: [Designer] + copyrights: [Copyright] + references: [Product] } input InteriorsFilterInput { @@ -277,6 +279,11 @@ type Batch { products: [Product] } +type Copyright { + name: String! + products: [Product] +} + type Product { id: ID! stockid: Int diff --git a/src/types/product-types.ts b/src/types/product-types.ts index a440ce8..866a50d 100644 --- a/src/types/product-types.ts +++ b/src/types/product-types.ts @@ -55,6 +55,8 @@ export interface ProductsSearchResult { keywords: Promise>; categories: Promise>; designers: Promise>; + copyrights: Promise>; + references: Promise>; } export interface ProductListResult { pagination: PaginationResult; @@ -128,6 +130,11 @@ export interface Batch { products: Promise>; } +export interface Copyright { + name: string; + products: Promise>; +} + export interface Product { id: number; stockid: number; @@ -136,6 +143,9 @@ export interface Product { browsable: boolean; inserted: Date; updated?: Date; + ref1: string; + ref2: string; + ref3: string; orientation?: Orientation; printProducts: [PrintProduct]; blacklisting: [ProductBlacklist];