Browse Source

Implement update on ProductOptionGroup

Michael Bromley 7 years ago
parent
commit
7d84d07879

+ 2 - 2
modules/core/api/product-option/product-option.api.graphql

@@ -6,6 +6,6 @@ type Query {
 type Mutation {
     "Create a new ProductOptionGroup"
     createProductOptionGroup(input: CreateProductOptionGroupInput): ProductOptionGroup
-    #"Update an existing ProductOptionGroup"
-    #updateProductOptionGroup(input: UpdateProductOptionGroupInput): Product
+    "Update an existing ProductOptionGroup"
+    updateProductOptionGroup(input: UpdateProductOptionGroupInput): ProductOptionGroup
 }

+ 6 - 0
modules/core/api/product-option/product-option.resolver.ts

@@ -36,4 +36,10 @@ export class ProductOptionResolver {
 
         return group;
     }
+
+    @Mutation()
+    async updateProductOptionGroup(_, args): Promise<ProductOptionGroup> {
+        const { input } = args;
+        return this.productOptionGroupService.update(args.input);
+    }
 }

+ 5 - 0
modules/core/entity/product-option-group/product-option-group.dto.ts

@@ -6,3 +6,8 @@ export interface CreateProductOptionGroupDto extends TranslatedInput<ProductOpti
     code: string;
     options?: CreateProductOptionDto[];
 }
+
+export interface UpdateProductOptionGroupDto extends TranslatedInput<ProductOptionGroup> {
+    id: number;
+    code: string;
+}

+ 6 - 0
modules/core/entity/product-option-group/product-option-group.graphql

@@ -24,3 +24,9 @@ input CreateProductOptionGroupInput {
     translations: [ProductOptionGroupTranslationInput]!
     options: [CreateProductOptionInput]
 }
+
+input UpdateProductOptionGroupInput {
+    id: Int!
+    code: String!
+    translations: [ProductOptionGroupTranslationInput]!
+}

+ 27 - 2
modules/core/service/product-option-group.service.ts

@@ -3,14 +3,21 @@ import { InjectConnection } from '@nestjs/typeorm';
 import { Connection } from 'typeorm';
 import { DEFAULT_LANGUAGE_CODE } from '../common/constants';
 import { ProductOptionGroupTranslation } from '../entity/product-option-group/product-option-group-translation.entity';
-import { CreateProductOptionGroupDto } from '../entity/product-option-group/product-option-group.dto';
+import {
+    CreateProductOptionGroupDto,
+    UpdateProductOptionGroupDto,
+} from '../entity/product-option-group/product-option-group.dto';
 import { ProductOptionGroup } from '../entity/product-option-group/product-option-group.entity';
 import { LanguageCode } from '../locale/language-code';
 import { translateDeep } from '../locale/translate-entity';
+import { TranslationUpdaterService } from '../locale/translation-updater.service';
 
 @Injectable()
 export class ProductOptionGroupService {
-    constructor(@InjectConnection() private connection: Connection) {}
+    constructor(
+        @InjectConnection() private connection: Connection,
+        private translationUpdaterService: TranslationUpdaterService,
+    ) {}
 
     findAll(lang: LanguageCode): Promise<ProductOptionGroup[]> {
         return this.connection.manager
@@ -43,4 +50,22 @@ export class ProductOptionGroupService {
 
         return this.findOne(createdGroup.id, DEFAULT_LANGUAGE_CODE) as Promise<ProductOptionGroup>;
     }
+
+    async update(updateProductOptionGroupDto: UpdateProductOptionGroupDto): Promise<ProductOptionGroup> {
+        const existingTranslations = await this.connection.getRepository(ProductOptionGroupTranslation).find({
+            where: { base: updateProductOptionGroupDto.id },
+            relations: ['base'],
+        });
+
+        const translationUpdater = this.translationUpdaterService.create(ProductOptionGroupTranslation);
+        const diff = translationUpdater.diff(existingTranslations, updateProductOptionGroupDto.translations);
+
+        const productOptionGroup = await translationUpdater.applyDiff(
+            new ProductOptionGroup(updateProductOptionGroupDto),
+            diff,
+        );
+        await this.connection.manager.save(productOptionGroup);
+
+        return this.findOne(productOptionGroup.id, DEFAULT_LANGUAGE_CODE) as Promise<ProductOptionGroup>;
+    }
 }