Răsfoiți Sursa

Implement list / item queries for ProductOption / Groups

Michael Bromley 7 ani în urmă
părinte
comite
52565d5bb1

+ 4 - 0
modules/core/api/product-option/product-option.api.graphql

@@ -0,0 +1,4 @@
+type Query {
+    productOptionGroups(languageCode: LanguageCode): [ProductOptionGroup]
+    productOptionGroup(id: Int!, languageCode: LanguageCode): ProductOptionGroup
+}

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

@@ -0,0 +1,21 @@
+import { Mutation, Query, Resolver } from '@nestjs/graphql';
+import { ProductOptionGroup } from '../../entity/product-option-group/product-option-group.entity';
+import { Product } from '../../entity/product/product.entity';
+import { ProductOptionService } from '../../service/product-option.service';
+import { ProductVariantService } from '../../service/product-variant.service';
+import { ProductService } from '../../service/product.service';
+
+@Resolver('Product')
+export class ProductOptionResolver {
+    constructor(private productOptionService: ProductOptionService) {}
+
+    @Query('productOptionGroups')
+    productOptionGroups(obj, args): Promise<ProductOptionGroup[]> {
+        return this.productOptionService.findAll(args.languageCode);
+    }
+
+    @Query('productOptionGroup')
+    productOptionGroup(obj, args): Promise<ProductOptionGroup | undefined> {
+        return this.productOptionService.findOne(args.id, args.languageCode);
+    }
+}

+ 1 - 1
modules/core/entity/product-option-group/product-option-group.entity.ts

@@ -19,6 +19,6 @@ export class ProductOptionGroup implements Translatable {
     @OneToMany(type => ProductOptionGroupTranslation, translation => translation.base, { eager: true })
     translations: Translation<ProductOptionGroup>[];
 
-    @OneToMany(type => ProductOption, product => product)
+    @OneToMany(type => ProductOption, option => option.group)
     options: ProductOption[];
 }

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

@@ -2,4 +2,12 @@ type ProductOptionGroup {
     id: Int
     code: String
     name: String
+    options: [ProductOption]
+    translations: [ProductOptionGroupTranslation]
 }
+
+type ProductOptionGroupTranslation {
+    id: Int!
+    languageCode: LanguageCode!
+    name: String!
+}

+ 1 - 1
modules/core/entity/product-option/product-option.entity.ts

@@ -26,6 +26,6 @@ export class ProductOption implements Translatable {
     @OneToMany(type => ProductOptionTranslation, translation => translation.base, { eager: true })
     translations: Translation<ProductOption>[];
 
-    @ManyToOne(type => ProductOptionGroup)
+    @ManyToOne(type => ProductOptionGroup, group => group.options)
     group: ProductOptionGroup;
 }

+ 7 - 0
modules/core/entity/product-option/product-option.graphql

@@ -2,4 +2,11 @@ type ProductOption {
     id: Int
     code: String
     name: String
+    translations: [ProductOptionTranslation]
+}
+
+type ProductOptionTranslation {
+    id: Int!
+    languageCode: LanguageCode!
+    name: String!
 }

+ 7 - 0
modules/core/entity/product-variant/product-variant.graphql

@@ -5,6 +5,13 @@ type ProductVariant {
     image: String
     price: Int
     options: [ProductOption]
+    translations: [ProductVariantTranslation]
+}
+
+type ProductVariantTranslation {
+    id: Int!
+    languageCode: LanguageCode!
+    name: String!
 }
 
 input CreateProductVariantTranslation {

+ 1 - 1
modules/core/entity/product/product.entity.ts

@@ -36,7 +36,7 @@ export class Product implements Translatable {
 
     @UpdateDateColumn() updatedAt: string;
 
-    @OneToMany(type => ProductTranslation, translation => translation.base)
+    @OneToMany(type => ProductTranslation, translation => translation.base, { eager: true })
     translations: Translation<Product>[];
 
     @OneToMany(type => ProductVariant, variant => variant.product)

+ 27 - 0
modules/core/service/product-option.service.ts

@@ -0,0 +1,27 @@
+import { Injectable } from '@nestjs/common';
+import { InjectConnection } from '@nestjs/typeorm';
+import { Connection } from 'typeorm';
+import { ProductOptionGroup } from '../entity/product-option-group/product-option-group.entity';
+import { LanguageCode } from '../locale/language-code';
+import { translateDeep } from '../locale/translate-entity';
+
+@Injectable()
+export class ProductOptionService {
+    constructor(@InjectConnection() private connection: Connection) {}
+
+    findAll(lang: LanguageCode): Promise<ProductOptionGroup[]> {
+        return this.connection.manager
+            .find(ProductOptionGroup, {
+                relations: ['options'],
+            })
+            .then(groups => groups.map(group => translateDeep(group, lang, ['options'])));
+    }
+
+    findOne(id: number, lang: LanguageCode): Promise<ProductOptionGroup | undefined> {
+        return this.connection.manager
+            .findOne(ProductOptionGroup, id, {
+                relations: ['options'],
+            })
+            .then(group => group && translateDeep(group, lang, ['options']));
+    }
+}