| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
- import {
- AddOptionGroupToProductVariables,
- ApplyFacetValuesToProductVariantsVariables,
- CreateProductVariables,
- GenerateProductVariantsVariables,
- GetProductListVariables,
- GetProductWithVariantsVariables,
- Permission,
- RemoveOptionGroupFromProductVariables,
- UpdateProductVariables,
- UpdateProductVariantsVariables,
- } from 'shared/generated-types';
- import { ID, PaginatedList } from 'shared/shared-types';
- import { DEFAULT_LANGUAGE_CODE } from '../../common/constants';
- import { Translated } from '../../common/types/locale-types';
- import { assertFound } from '../../common/utils';
- import { ProductVariant } from '../../entity/product-variant/product-variant.entity';
- import { Product } from '../../entity/product/product.entity';
- import { I18nError } from '../../i18n/i18n-error';
- import { FacetValueService } from '../../service/providers/facet-value.service';
- import { ProductVariantService } from '../../service/providers/product-variant.service';
- import { ProductService } from '../../service/providers/product.service';
- import { Allow } from '../common/auth-guard';
- import { Decode } from '../common/id-interceptor';
- import { RequestContext } from '../common/request-context';
- import { Ctx } from '../common/request-context.decorator';
- @Resolver('Product')
- export class ProductResolver {
- constructor(
- private productService: ProductService,
- private productVariantService: ProductVariantService,
- private facetValueService: FacetValueService,
- ) {}
- @Query()
- @Allow(Permission.ReadCatalog)
- async products(
- @Ctx() ctx: RequestContext,
- @Args() args: GetProductListVariables,
- ): Promise<PaginatedList<Translated<Product>>> {
- return this.productService.findAll(ctx, args.options || undefined);
- }
- @Query()
- @Allow(Permission.ReadCatalog)
- async product(
- @Ctx() ctx: RequestContext,
- @Args() args: GetProductWithVariantsVariables,
- ): Promise<Translated<Product> | undefined> {
- return this.productService.findOne(ctx, args.id);
- }
- @Mutation()
- @Allow(Permission.CreateCatalog)
- @Decode('assetIds', 'featuredAssetId')
- async createProduct(
- @Ctx() ctx: RequestContext,
- @Args() args: CreateProductVariables,
- ): Promise<Translated<Product>> {
- const { input } = args;
- return this.productService.create(ctx, input);
- }
- @Mutation()
- @Allow(Permission.UpdateCatalog)
- @Decode('assetIds', 'featuredAssetId')
- async updateProduct(
- @Ctx() ctx: RequestContext,
- @Args() args: UpdateProductVariables,
- ): Promise<Translated<Product>> {
- const { input } = args;
- return this.productService.update(ctx, input);
- }
- @Mutation()
- @Allow(Permission.UpdateCatalog)
- @Decode('productId', 'optionGroupId')
- async addOptionGroupToProduct(
- @Ctx() ctx: RequestContext,
- @Args() args: AddOptionGroupToProductVariables,
- ): Promise<Translated<Product>> {
- const { productId, optionGroupId } = args;
- return this.productService.addOptionGroupToProduct(ctx, productId, optionGroupId);
- }
- @Mutation()
- @Allow(Permission.UpdateCatalog)
- @Decode('productId', 'optionGroupId')
- async removeOptionGroupFromProduct(
- @Ctx() ctx: RequestContext,
- @Args() args: RemoveOptionGroupFromProductVariables,
- ): Promise<Translated<Product>> {
- const { productId, optionGroupId } = args;
- return this.productService.removeOptionGroupFromProduct(ctx, productId, optionGroupId);
- }
- @Mutation()
- @Allow(Permission.CreateCatalog)
- @Decode('productId')
- async generateVariantsForProduct(
- @Ctx() ctx: RequestContext,
- @Args() args: GenerateProductVariantsVariables,
- ): Promise<Translated<Product>> {
- const { productId, defaultPrice, defaultSku } = args;
- await this.productVariantService.generateVariantsForProduct(ctx, productId, defaultPrice, defaultSku);
- return assertFound(this.productService.findOne(ctx, productId));
- }
- @Mutation()
- @Allow(Permission.UpdateCatalog)
- async updateProductVariants(
- @Ctx() ctx: RequestContext,
- @Args() args: UpdateProductVariantsVariables,
- ): Promise<Array<Translated<ProductVariant>>> {
- const { input } = args;
- return Promise.all(input.map(variant => this.productVariantService.update(variant)));
- }
- @Mutation()
- @Allow(Permission.UpdateCatalog)
- @Decode('facetValueIds', 'productVariantIds')
- async applyFacetValuesToProductVariants(
- @Ctx() ctx: RequestContext,
- @Args() args: ApplyFacetValuesToProductVariantsVariables,
- ): Promise<Array<Translated<ProductVariant>>> {
- const { facetValueIds, productVariantIds } = args;
- const facetValues = await Promise.all(
- (facetValueIds as ID[]).map(async facetValueId => {
- const facetValue = await this.facetValueService.findOne(facetValueId, DEFAULT_LANGUAGE_CODE);
- if (!facetValue) {
- throw new I18nError('error.entity-with-id-not-found', {
- entityName: 'FacetValue',
- id: facetValueId,
- });
- }
- return facetValue;
- }),
- );
- return this.productVariantService.addFacetValues(productVariantIds, facetValues);
- }
- }
|