Explorar o código

feat(server): Create addOptionGroupToProduct mutation

Michael Bromley %!s(int64=7) %!d(string=hai) anos
pai
achega
6b938e8820

+ 2 - 0
server/src/api/product/product.api.graphql

@@ -8,6 +8,8 @@ type Mutation {
     createProduct(input: CreateProductInput): Product!
     "Update an existing Product"
     updateProduct(input: UpdateProductInput): Product!
+    "Add an OptionGroup to a Product"
+    addOptionGroupToProduct(productId: ID!, optionGroupId: ID!): Product!
 }
 
 type ProductList implements PaginatedList {

+ 7 - 0
server/src/api/product/product.resolver.ts

@@ -47,4 +47,11 @@ export class ProductResolver {
         const product = await this.productService.update(this.idCodecService.decode(input));
         return this.idCodecService.decode(product);
     }
+
+    @Mutation()
+    async addOptionGroupToProduct(_, args): Promise<Product | undefined> {
+        const { productId, optionGroupId } = args;
+        const product = await this.productService.addOptionGroupToProduct(productId, optionGroupId);
+        return this.idCodecService.decode(product);
+    }
 }

+ 1 - 1
server/src/i18n/i18n-error.ts

@@ -11,7 +11,7 @@
  * ```
  */
 export class I18nError extends Error {
-    constructor(public message: string, public variables: { [key: string]: string } = {}) {
+    constructor(public message: string, public variables: { [key: string]: string | number } = {}) {
         super(message);
     }
 }

+ 24 - 0
server/src/service/product.service.ts

@@ -7,6 +7,7 @@ import { ProductOptionGroup } from '../entity/product-option-group/product-optio
 import { ProductTranslation } from '../entity/product/product-translation.entity';
 import { CreateProductDto, UpdateProductDto } from '../entity/product/product.dto';
 import { Product } from '../entity/product/product.entity';
+import { I18nError } from '../i18n/i18n-error';
 import { LanguageCode } from '../locale/language-code';
 import { translateDeep } from '../locale/translate-entity';
 import { TranslationUpdaterService } from '../locale/translation-updater.service';
@@ -86,4 +87,27 @@ export class ProductService {
 
         return this.findOne(updateProductDto.id, DEFAULT_LANGUAGE_CODE);
     }
+
+    async addOptionGroupToProduct(productId: ID, optionGroupId: ID): Promise<Product | undefined> {
+        const product = await this.connection
+            .getRepository(Product)
+            .findOne(productId, { relations: ['optionGroups'] });
+        if (!product) {
+            throw new I18nError(`error.product-with-id-not-found`, { productId });
+        }
+        const optionGroup = await this.connection.getRepository(ProductOptionGroup).findOne(optionGroupId);
+        if (!optionGroup) {
+            throw new I18nError(`error.option-group-with-id-not-found`, { optionGroupId });
+        }
+
+        if (Array.isArray(product.optionGroups)) {
+            product.optionGroups.push(optionGroup);
+        } else {
+            product.optionGroups = [optionGroup];
+        }
+
+        await this.connection.manager.save(product);
+
+        return this.findOne(productId, DEFAULT_LANGUAGE_CODE);
+    }
 }