1
0

hydration-test-plugin.ts 4.3 KB

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