1
0

collection.resolver.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
  2. import {
  3. ConfigurableOperationDefinition,
  4. DeletionResponse,
  5. MutationCreateCollectionArgs,
  6. MutationDeleteCollectionArgs,
  7. MutationMoveCollectionArgs,
  8. MutationUpdateCollectionArgs,
  9. Permission,
  10. QueryCollectionArgs,
  11. QueryCollectionsArgs,
  12. QueryPreviewCollectionVariantsArgs,
  13. } from '@vendure/common/lib/generated-types';
  14. import { PaginatedList } from '@vendure/common/lib/shared-types';
  15. import { UserInputError } from '../../../common/error/errors';
  16. import { Translated } from '../../../common/types/locale-types';
  17. import { CollectionFilter } from '../../../config/catalog/collection-filter';
  18. import { Collection } from '../../../entity/collection/collection.entity';
  19. import { CollectionService } from '../../../service/services/collection.service';
  20. import { FacetValueService } from '../../../service/services/facet-value.service';
  21. import { ConfigurableOperationCodec } from '../../common/configurable-operation-codec';
  22. import { RequestContext } from '../../common/request-context';
  23. import { Allow } from '../../decorators/allow.decorator';
  24. import { RelationPaths, Relations } from '../../decorators/relations.decorator';
  25. import { Ctx } from '../../decorators/request-context.decorator';
  26. import { Transaction } from '../../decorators/transaction.decorator';
  27. @Resolver()
  28. export class CollectionResolver {
  29. constructor(
  30. private collectionService: CollectionService,
  31. private facetValueService: FacetValueService,
  32. private configurableOperationCodec: ConfigurableOperationCodec,
  33. ) {}
  34. @Query()
  35. @Allow(Permission.ReadCatalog, Permission.ReadCollection)
  36. async collectionFilters(
  37. @Ctx() ctx: RequestContext,
  38. @Args() args: QueryCollectionsArgs,
  39. ): Promise<ConfigurableOperationDefinition[]> {
  40. return this.collectionService.getAvailableFilters(ctx);
  41. }
  42. @Query()
  43. @Allow(Permission.ReadCatalog, Permission.ReadCollection)
  44. async collections(
  45. @Ctx() ctx: RequestContext,
  46. @Args() args: QueryCollectionsArgs,
  47. @Relations({
  48. entity: Collection,
  49. omit: ['productVariants', 'assets', 'parent.productVariants', 'children.productVariants'],
  50. })
  51. relations: RelationPaths<Collection>,
  52. ): Promise<PaginatedList<Translated<Collection>>> {
  53. return this.collectionService.findAll(ctx, args.options || undefined, relations);
  54. }
  55. @Query()
  56. @Allow(Permission.ReadCatalog, Permission.ReadCollection)
  57. async collection(
  58. @Ctx() ctx: RequestContext,
  59. @Args() args: QueryCollectionArgs,
  60. @Relations({
  61. entity: Collection,
  62. omit: ['productVariants', 'assets', 'parent.productVariants', 'children.productVariants'],
  63. })
  64. relations: RelationPaths<Collection>,
  65. ): Promise<Translated<Collection> | undefined> {
  66. let collection: Translated<Collection> | undefined;
  67. if (args.id) {
  68. collection = await this.collectionService.findOne(ctx, args.id, relations);
  69. if (args.slug && collection && collection.slug !== args.slug) {
  70. throw new UserInputError(`error.collection-id-slug-mismatch`);
  71. }
  72. } else if (args.slug) {
  73. collection = await this.collectionService.findOneBySlug(ctx, args.slug, relations);
  74. } else {
  75. throw new UserInputError(`error.collection-id-or-slug-must-be-provided`);
  76. }
  77. return collection;
  78. }
  79. @Query()
  80. @Allow(Permission.ReadCatalog, Permission.ReadCollection)
  81. previewCollectionVariants(@Ctx() ctx: RequestContext, @Args() args: QueryPreviewCollectionVariantsArgs) {
  82. this.configurableOperationCodec.decodeConfigurableOperationIds(CollectionFilter, args.input.filters);
  83. return this.collectionService.previewCollectionVariants(ctx, args.input, args.options || undefined);
  84. }
  85. @Transaction()
  86. @Mutation()
  87. @Allow(Permission.CreateCatalog, Permission.CreateCollection)
  88. async createCollection(
  89. @Ctx() ctx: RequestContext,
  90. @Args() args: MutationCreateCollectionArgs,
  91. ): Promise<Translated<Collection>> {
  92. const { input } = args;
  93. this.configurableOperationCodec.decodeConfigurableOperationIds(CollectionFilter, input.filters);
  94. return this.collectionService.create(ctx, input);
  95. }
  96. @Transaction()
  97. @Mutation()
  98. @Allow(Permission.UpdateCatalog, Permission.UpdateCollection)
  99. async updateCollection(
  100. @Ctx() ctx: RequestContext,
  101. @Args() args: MutationUpdateCollectionArgs,
  102. ): Promise<Translated<Collection>> {
  103. const { input } = args;
  104. this.configurableOperationCodec.decodeConfigurableOperationIds(CollectionFilter, input.filters || []);
  105. return this.collectionService.update(ctx, input);
  106. }
  107. @Transaction()
  108. @Mutation()
  109. @Allow(Permission.UpdateCatalog, Permission.UpdateCollection)
  110. async moveCollection(
  111. @Ctx() ctx: RequestContext,
  112. @Args() args: MutationMoveCollectionArgs,
  113. ): Promise<Translated<Collection>> {
  114. const { input } = args;
  115. return this.collectionService.move(ctx, input);
  116. }
  117. @Transaction()
  118. @Mutation()
  119. @Allow(Permission.DeleteCatalog, Permission.DeleteCollection)
  120. async deleteCollection(
  121. @Ctx() ctx: RequestContext,
  122. @Args() args: MutationDeleteCollectionArgs,
  123. ): Promise<DeletionResponse> {
  124. return this.collectionService.delete(ctx, args.id);
  125. }
  126. }