diff --git a/package-lock.json b/package-lock.json index 7905672..a9590cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "pg": "^8.7.1", "pg-hstore": "^2.3.4", "prettier": "^2.3.2", + "slug": "^5.1.0", "stringcase": "^4.3.1", "ts-node": "^10.2.1", "typescript": "^4.4.2", @@ -11616,6 +11617,11 @@ "node": ">=8" } }, + "node_modules/slug": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slug/-/slug-5.1.0.tgz", + "integrity": "sha512-IS39jKR6m+puU8zWgH6ruwx1sfzFNJ6Ai5PKIlUqd0X8C3ca7PB49Cvm0uayqgEt1jgaojO2wWEsQJngnh7fDA==" + }, "node_modules/snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -22648,6 +22654,11 @@ } } }, + "slug": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slug/-/slug-5.1.0.tgz", + "integrity": "sha512-IS39jKR6m+puU8zWgH6ruwx1sfzFNJ6Ai5PKIlUqd0X8C3ca7PB49Cvm0uayqgEt1jgaojO2wWEsQJngnh7fDA==" + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", diff --git a/package.json b/package.json index 1cb1c29..121efd9 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "pg": "^8.7.1", "pg-hstore": "^2.3.4", "prettier": "^2.3.2", + "slug": "^5.1.0", "stringcase": "^4.3.1", "ts-node": "^10.2.1", "typescript": "^4.4.2", diff --git a/src/datasources/product-api.ts b/src/datasources/product-api.ts index 4025c92..2138e3d 100644 --- a/src/datasources/product-api.ts +++ b/src/datasources/product-api.ts @@ -1,5 +1,6 @@ import { BaseSQLDataSource } from './BaseSQLDataSource'; import { camelcase } from 'stringcase'; +import slug from 'slug'; import * as sql from './sql'; import { Product, @@ -220,6 +221,23 @@ export class ProductAPI extends BaseSQLDataSource { ); } + async addProduct(name: string, batch: string): Promise { + const path = batch ? batch + ' ' + name : name; + const idres = await this.knex + .table('product-products') + .insert({ + path: slug(path), + browsable: 0, + visible: 0, + }) + .returning('productid'); + const id = idres[0]; + this.updateProductField(id, 'artNo', `e${id}`); + await this.updateProductField(id, 'name', name); + await this.updateProductField(id, 'batch', batch); + return id; + } + async updateProductInfo( productId: number, info: ProductInfoInput, diff --git a/src/resolvers/products-resolver.ts b/src/resolvers/products-resolver.ts index 38fa08b..a979654 100644 --- a/src/resolvers/products-resolver.ts +++ b/src/resolvers/products-resolver.ts @@ -84,6 +84,13 @@ export const productQueryTypeDefs = { /////////////////// // Mutations below export const productMutationTypeDefs = { + async addProduct(_, { name, batch }, { dataSources }) { + const id = await (dataSources.productApi).addProduct( + name, + batch, + ); + return (dataSources.productApi).getProduct(id); + }, async productInfo(_, { productId, info }, { dataSources }) { await (dataSources.productApi).updateProductInfo( productId, diff --git a/src/schema.graphql b/src/schema.graphql index 75ea055..5788a7c 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -431,6 +431,7 @@ type IdNumberResult { } type Mutation { + addProduct(name: String!, batch: String): Product productInfo(productId: Int!, info: ProductInfoInput!): Product productFocusPoint( productId: Int!