hydration-test-plugin.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /* tslint:disable:no-non-null-assertion */
  2. import { Args, Query, Resolver } from '@nestjs/graphql';
  3. import {
  4. Asset,
  5. ChannelService,
  6. Ctx,
  7. EntityHydrator,
  8. ID,
  9. LanguageCode,
  10. OrderService,
  11. PluginCommonModule,
  12. Product,
  13. ProductService,
  14. ProductVariantService,
  15. RequestContext,
  16. TransactionalConnection,
  17. VendurePlugin,
  18. } from '@vendure/core';
  19. import gql from 'graphql-tag';
  20. @Resolver()
  21. export class TestAdminPluginResolver {
  22. constructor(
  23. private connection: TransactionalConnection,
  24. private orderService: OrderService,
  25. private channelService: ChannelService,
  26. private productVariantService: ProductVariantService,
  27. private productService: ProductService,
  28. private entityHydrator: EntityHydrator,
  29. ) {}
  30. @Query()
  31. async hydrateProduct(@Ctx() ctx: RequestContext, @Args() args: { id: ID }) {
  32. const product = await this.connection.getRepository(ctx, Product).findOne(args.id, {
  33. relations: ['facetValues'],
  34. });
  35. // tslint:disable-next-line:no-non-null-assertion
  36. await this.entityHydrator.hydrate(ctx, product!, {
  37. relations: [
  38. 'variants.options',
  39. 'variants.product',
  40. 'assets.product',
  41. 'facetValues.facet',
  42. 'featuredAsset',
  43. 'variants.stockMovements',
  44. ],
  45. applyProductVariantPrices: true,
  46. });
  47. return product;
  48. }
  49. // Test case for https://github.com/vendure-ecommerce/vendure/issues/1153
  50. @Query()
  51. async hydrateProductAsset(@Ctx() ctx: RequestContext, @Args() args: { id: ID }) {
  52. const product = await this.connection.getRepository(ctx, Product).findOne(args.id);
  53. // tslint:disable-next-line:no-non-null-assertion
  54. await this.entityHydrator.hydrate(ctx, product!, {
  55. relations: ['assets'],
  56. });
  57. return product;
  58. }
  59. // Test case for https://github.com/vendure-ecommerce/vendure/issues/1161
  60. @Query()
  61. async hydrateProductVariant(@Ctx() ctx: RequestContext, @Args() args: { id: ID }) {
  62. const [variant] = await this.productVariantService.findByIds(ctx, [args.id]);
  63. await this.entityHydrator.hydrate(ctx, variant, {
  64. relations: ['product.facetValues.facet'],
  65. });
  66. return variant;
  67. }
  68. // Test case for https://github.com/vendure-ecommerce/vendure/issues/1324
  69. @Query()
  70. async hydrateProductWithNoFacets(@Ctx() ctx: RequestContext) {
  71. const product = await this.productService.create(ctx, {
  72. enabled: true,
  73. translations: [
  74. {
  75. languageCode: LanguageCode.en,
  76. name: 'test',
  77. slug: 'test',
  78. description: 'test',
  79. },
  80. ],
  81. });
  82. await this.entityHydrator.hydrate(ctx, product, {
  83. relations: ['facetValues', 'facetValues.facet'],
  84. });
  85. return product;
  86. }
  87. // Test case for https://github.com/vendure-ecommerce/vendure/issues/1172
  88. @Query()
  89. async hydrateOrder(@Ctx() ctx: RequestContext, @Args() args: { id: ID }) {
  90. const order = await this.orderService.findOne(ctx, args.id);
  91. await this.entityHydrator.hydrate(ctx, order!, {
  92. relations: ['payments'],
  93. });
  94. return order;
  95. }
  96. // Test case for https://github.com/vendure-ecommerce/vendure/issues/1229
  97. @Query()
  98. async hydrateOrderReturnQuantities(@Ctx() ctx: RequestContext, @Args() args: { id: ID }) {
  99. const order = await this.orderService.findOne(ctx, args.id);
  100. await this.entityHydrator.hydrate(ctx, order!, {
  101. relations: [
  102. 'lines',
  103. 'lines.productVariant',
  104. 'lines.productVariant.product',
  105. 'lines.productVariant.product.assets',
  106. ],
  107. });
  108. return order?.lines.map(line => line.quantity);
  109. }
  110. // Test case for https://github.com/vendure-ecommerce/vendure/issues/1284
  111. @Query()
  112. async hydrateChannel(@Ctx() ctx: RequestContext, @Args() args: { id: ID }) {
  113. const channel = await this.channelService.findOne(ctx, args.id);
  114. await this.entityHydrator.hydrate(ctx, channel!, {
  115. relations: ['customFields.thumb'],
  116. });
  117. return channel;
  118. }
  119. }
  120. @VendurePlugin({
  121. imports: [PluginCommonModule],
  122. adminApiExtensions: {
  123. resolvers: [TestAdminPluginResolver],
  124. schema: gql`
  125. extend type Query {
  126. hydrateProduct(id: ID!): JSON
  127. hydrateProductWithNoFacets: JSON
  128. hydrateProductAsset(id: ID!): JSON
  129. hydrateProductVariant(id: ID!): JSON
  130. hydrateOrder(id: ID!): JSON
  131. hydrateOrderReturnQuantities(id: ID!): JSON
  132. hydrateChannel(id: ID!): JSON
  133. }
  134. `,
  135. },
  136. configuration: config => {
  137. config.customFields.Channel.push({ name: 'thumb', type: 'relation', entity: Asset, nullable: true });
  138. return config;
  139. },
  140. })
  141. export class HydrationTestPlugin {}