supplier-stock-admin.resolver.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import fs from 'fs';
  2. import path from 'path';
  3. import { Args, Query, Mutation, Resolver } from '@nestjs/graphql';
  4. import type { PaginatedList } from '@vendure/core';
  5. import {
  6. Logger,
  7. Ctx,
  8. RelationPaths,
  9. Relations,
  10. RequestContext,
  11. TransactionalConnection,
  12. Importer,
  13. Populator,
  14. ChannelService,
  15. ProductService,
  16. } from '@vendure/core';
  17. import { LOGGER_CTX } from '../../../constants';
  18. import { SupplierStockInTransit } from '../../../entities/supplier-stock-in-transit.entity';
  19. import { SupplierStock } from '../../../entities/supplier-stock.entity';
  20. import { QuerySupplierStocksArgs } from '../../../generated-admin-types';
  21. import { initialData } from '../../schema/admin-api/initial-data';
  22. import { SupplierStockService } from '../../services/supplier-stock.service';
  23. @Resolver()
  24. export class SupplierStockAdminResolver {
  25. constructor(
  26. private readonly supplierStockService: SupplierStockService,
  27. private readonly connection: TransactionalConnection,
  28. private readonly populator: Populator,
  29. private readonly channelService: ChannelService,
  30. private readonly productService: ProductService,
  31. private readonly importer: Importer
  32. ) {}
  33. @Query()
  34. async supplierStocks(
  35. @Ctx() ctx: RequestContext,
  36. @Args() args: QuerySupplierStocksArgs,
  37. @Relations({
  38. entity: SupplierStock,
  39. omit: ['productVariant'],
  40. })
  41. relations: RelationPaths<SupplierStock>
  42. ): Promise<PaginatedList<SupplierStock>> {
  43. return this.supplierStockService.findAll(ctx, args.options, relations);
  44. }
  45. private async initVendureData(@Ctx() ctx: RequestContext) {
  46. const channel = await this.channelService.getDefaultChannel();
  47. await this.populator.populateInitialData(initialData, channel);
  48. const assetsDir = path.join(__dirname, '../../../../mock-data');
  49. const productsCsvPath = path.join(assetsDir, '/data-sources/products.csv');
  50. const productData = await fs.readFileSync(productsCsvPath, 'utf-8');
  51. const importResult = await this.importer
  52. .parseAndImport(productData, ctx, true)
  53. .toPromise();
  54. if (importResult.errors && importResult.errors.length) {
  55. const errorFile = path.join(process.cwd(), 'vendure-import-error.log');
  56. Logger.error(
  57. `${importResult.errors.length} errors encountered when importing product data. See: ${errorFile}`,
  58. LOGGER_CTX
  59. );
  60. }
  61. Logger.info(`Imported ${importResult.imported} products`, LOGGER_CTX);
  62. await this.populator.populateCollections(initialData, channel);
  63. }
  64. @Mutation()
  65. async initializeDemo(@Ctx() ctx: RequestContext) {
  66. const { totalItems } = await this.productService.findAll(ctx, {});
  67. if (totalItems === 0) {
  68. await this.initVendureData(ctx);
  69. }
  70. const supplierStock = await this.connection
  71. .getRepository(ctx, SupplierStock)
  72. .save({
  73. comment: 'stock comment',
  74. enabled: true,
  75. link: 'stock link',
  76. inTransitsStock: 10,
  77. stockArea: 'stock area',
  78. productId: 1,
  79. productVariantId: 1,
  80. });
  81. await this.connection.getRepository(ctx, SupplierStockInTransit).save({
  82. channelName: 'channel name',
  83. channelOrderNo: 'channel order number',
  84. quantity: 5,
  85. supplierStockId: supplierStock.id,
  86. });
  87. return true;
  88. }
  89. }