product.resolver.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
  2. import {
  3. AddOptionGroupToProductMutationArgs,
  4. CreateProductMutationArgs,
  5. DeleteProductMutationArgs,
  6. DeletionResponse,
  7. GenerateVariantsForProductMutationArgs,
  8. Permission,
  9. ProductQueryArgs,
  10. ProductsQueryArgs,
  11. RemoveOptionGroupFromProductMutationArgs,
  12. UpdateProductMutationArgs,
  13. UpdateProductVariantsMutationArgs,
  14. } from '../../../../../shared/generated-types';
  15. import { PaginatedList } from '../../../../../shared/shared-types';
  16. import { Translated } from '../../../common/types/locale-types';
  17. import { assertFound } from '../../../common/utils';
  18. import { ProductVariant } from '../../../entity/product-variant/product-variant.entity';
  19. import { Product } from '../../../entity/product/product.entity';
  20. import { FacetValueService } from '../../../service/services/facet-value.service';
  21. import { ProductVariantService } from '../../../service/services/product-variant.service';
  22. import { ProductService } from '../../../service/services/product.service';
  23. import { RequestContext } from '../../common/request-context';
  24. import { Allow } from '../../decorators/allow.decorator';
  25. import { Decode } from '../../decorators/decode.decorator';
  26. import { Ctx } from '../../decorators/request-context.decorator';
  27. @Resolver()
  28. export class ProductResolver {
  29. constructor(
  30. private productService: ProductService,
  31. private productVariantService: ProductVariantService,
  32. private facetValueService: FacetValueService,
  33. ) {}
  34. @Query()
  35. @Allow(Permission.ReadCatalog)
  36. async products(
  37. @Ctx() ctx: RequestContext,
  38. @Args() args: ProductsQueryArgs,
  39. ): Promise<PaginatedList<Translated<Product>>> {
  40. return this.productService.findAll(ctx, args.options || undefined);
  41. }
  42. @Query()
  43. @Allow(Permission.ReadCatalog)
  44. async product(
  45. @Ctx() ctx: RequestContext,
  46. @Args() args: ProductQueryArgs,
  47. ): Promise<Translated<Product> | undefined> {
  48. return this.productService.findOne(ctx, args.id);
  49. }
  50. @Mutation()
  51. @Allow(Permission.CreateCatalog)
  52. @Decode('assetIds', 'featuredAssetId', 'facetValueIds')
  53. async createProduct(
  54. @Ctx() ctx: RequestContext,
  55. @Args() args: CreateProductMutationArgs,
  56. ): Promise<Translated<Product>> {
  57. const { input } = args;
  58. return this.productService.create(ctx, input);
  59. }
  60. @Mutation()
  61. @Allow(Permission.UpdateCatalog)
  62. @Decode('assetIds', 'featuredAssetId', 'facetValueIds')
  63. async updateProduct(
  64. @Ctx() ctx: RequestContext,
  65. @Args() args: UpdateProductMutationArgs,
  66. ): Promise<Translated<Product>> {
  67. const { input } = args;
  68. return this.productService.update(ctx, input);
  69. }
  70. @Mutation()
  71. @Allow(Permission.DeleteCatalog)
  72. async deleteProduct(
  73. @Ctx() ctx: RequestContext,
  74. @Args() args: DeleteProductMutationArgs,
  75. ): Promise<DeletionResponse> {
  76. return this.productService.softDelete(ctx, args.id);
  77. }
  78. @Mutation()
  79. @Allow(Permission.UpdateCatalog)
  80. @Decode('productId', 'optionGroupId')
  81. async addOptionGroupToProduct(
  82. @Ctx() ctx: RequestContext,
  83. @Args() args: AddOptionGroupToProductMutationArgs,
  84. ): Promise<Translated<Product>> {
  85. const { productId, optionGroupId } = args;
  86. return this.productService.addOptionGroupToProduct(ctx, productId, optionGroupId);
  87. }
  88. @Mutation()
  89. @Allow(Permission.UpdateCatalog)
  90. @Decode('productId', 'optionGroupId')
  91. async removeOptionGroupFromProduct(
  92. @Ctx() ctx: RequestContext,
  93. @Args() args: RemoveOptionGroupFromProductMutationArgs,
  94. ): Promise<Translated<Product>> {
  95. const { productId, optionGroupId } = args;
  96. return this.productService.removeOptionGroupFromProduct(ctx, productId, optionGroupId);
  97. }
  98. @Mutation()
  99. @Allow(Permission.CreateCatalog)
  100. @Decode('productId', 'defaultTaxCategoryId')
  101. async generateVariantsForProduct(
  102. @Ctx() ctx: RequestContext,
  103. @Args() args: GenerateVariantsForProductMutationArgs,
  104. ): Promise<Translated<Product>> {
  105. const { productId, defaultTaxCategoryId, defaultPrice, defaultSku } = args;
  106. await this.productVariantService.generateVariantsForProduct(
  107. ctx,
  108. productId,
  109. defaultTaxCategoryId,
  110. defaultPrice,
  111. defaultSku,
  112. );
  113. return assertFound(this.productService.findOne(ctx, productId));
  114. }
  115. @Mutation()
  116. @Allow(Permission.UpdateCatalog)
  117. @Decode('taxCategoryId', 'facetValueIds', 'featuredAssetId', 'assetIds')
  118. async updateProductVariants(
  119. @Ctx() ctx: RequestContext,
  120. @Args() args: UpdateProductVariantsMutationArgs,
  121. ): Promise<Array<Translated<ProductVariant>>> {
  122. const { input } = args;
  123. return Promise.all(input.map(variant => this.productVariantService.update(ctx, variant)));
  124. }
  125. }