diff --git a/src/datasources/product-api.ts b/src/datasources/product-api.ts index 5762a74..31e6933 100644 --- a/src/datasources/product-api.ts +++ b/src/datasources/product-api.ts @@ -15,9 +15,10 @@ import { ProductBlacklistMarketInput, ProductMaterials, ProductSizeTypes, + ProductProportionsInput, } from '../types/product-types'; import { Maybe } from '../types/types'; -import { nullOrNumber } from './utils'; +import { booleanStringField, nullOrNumber } from './utils'; const MINUTE = 60; @@ -107,7 +108,9 @@ export class ProductAPI extends BaseSQLDataSource { fields['wallpaperResolution'] = nullOrNumber( fields['wallpaperResolution'] ?? null, ); - fields['proportionsWarning?'] = fields['proportionsWarning?'] ?? ''; + fields['proportionsWarning'] = booleanStringField( + fields['proportionsWarning'] ?? null, + ); fields['imageResolution'] = nullOrNumber(fields['imageResolution'] ?? null); return fields; } @@ -432,4 +435,40 @@ export class ProductAPI extends BaseSQLDataSource { return Promise.all(insertMaterials); } } + + async setProportionsWarning( + productId: number, + proportions: ProductProportionsInput, + ): Promise[]> { + const promises = []; + promises.push( + this.updateProductField( + productId, + 'proportions_warning', + proportions.proportionsWarning ? '1' : '0', + ), + this.updateProductField( + productId, + 'margin_width_max', + proportions.marginWidthMax.toString(), + ), + this.updateProductField( + productId, + 'margin_width_min', + proportions.marginWidthMin.toString(), + ), + this.updateProductField( + productId, + 'margin_height_max', + proportions.marginHeightMax.toString(), + ), + this.updateProductField( + productId, + 'margin_height_min', + proportions.marginHeightMin.toString(), + ), + ); + + return Promise.all(promises); + } } diff --git a/src/datasources/utils.ts b/src/datasources/utils.ts index 373aa4c..87c21fd 100644 --- a/src/datasources/utils.ts +++ b/src/datasources/utils.ts @@ -25,3 +25,10 @@ export function convertToPossibleType(n: InputType) { export function nullOrNumber(n: InputType) { return n === null || '' === n ? null : Number(n); } + +export function booleanStringField(v: string | null) { + if (v === null || v === '0') { + return false; + } + return true; +} diff --git a/src/resolvers/products-resolver.ts b/src/resolvers/products-resolver.ts index cea9831..5f7e744 100644 --- a/src/resolvers/products-resolver.ts +++ b/src/resolvers/products-resolver.ts @@ -129,6 +129,17 @@ export const productMutationTypeDefs = { ); return (dataSources.productApi).getProduct(productId); }, + async productProportionsWarning( + _, + { productId, proportions }, + { dataSources }, + ) { + await (dataSources.productApi).setProportionsWarning( + productId, + proportions, + ); + return (dataSources.productApi).getProduct(productId); + }, async addOwnInteriorToPrintProduct( _, { printId, uploadedS3Key }, diff --git a/src/schema.graphql b/src/schema.graphql index c69f9eb..556fe1c 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -270,8 +270,6 @@ type Product { Will be single values return in later release """ type: [ProductType] - # Below are for debug and will be removed soon - fields_json: JSON } type ProductFields { @@ -283,7 +281,7 @@ type ProductFields { canvasResolution: Int wallpaperResolution: Int copyright: String! - proportionsWarning: String + proportionsWarning: Boolean! marginWidthMax: Int marginWidthMin: Int marginHeightMax: Int @@ -419,6 +417,14 @@ input ProductBlacklistingInput { groupIds: [Int] } +input ProductProportionsInput { + proportionsWarning: Boolean + marginWidthMax: Int! + marginWidthMin: Int! + marginHeightMax: Int! + marginHeightMin: Int! +} + type IdNumberResult { id: Int! } @@ -436,6 +442,10 @@ type Mutation { ): Product productGroup(productId: Int!, groupIds: [Int]): Product productKeywords(productId: Int!, keywordIds: [Int]): Product + productProportionsWarning( + productId: Int! + proportions: ProductProportionsInput! + ): Product addOwnInteriorToPrintProduct( printId: Int! uploadedS3Key: String! diff --git a/src/types/product-types.ts b/src/types/product-types.ts index 03ea689..495512e 100644 --- a/src/types/product-types.ts +++ b/src/types/product-types.ts @@ -27,6 +27,14 @@ export interface ProductBlacklistInput { markets: Array; } +export interface ProductProportionsInput { + proportionsWarning: boolean; + marginWidthMax: number; + marginWidthMin: number; + marginHeightMax: number; + marginHeightMin: number; +} + // query types export interface ProductsFilterInput { pagination: PaginationInput; @@ -117,7 +125,6 @@ export interface Product { blacklisting: [ProductBlacklist]; type: [ProductType]; fields: ProductFields; - fields_json: JSON; // remove later } // TODO: test stock products to see what props can be mandatory @@ -130,7 +137,7 @@ export interface ProductFields { canvasResolution?: number; wallpaperResolution?: number; copyright?: string; - proportionsWarning?: string; + proportionsWarning?: boolean; marginWidthMax?: number; marginWidthMin?: number; marginHeightMax?: number;