elasticsearch-resolver.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { Args, Mutation, Parent, Query, ResolveField, Resolver } from '@nestjs/graphql';
  2. import {
  3. Job as GraphQLJob,
  4. Permission,
  5. QuerySearchArgs,
  6. SearchInput,
  7. SearchResponse,
  8. } from '@vendure/common/lib/generated-types';
  9. import { Omit } from '@vendure/common/lib/omit';
  10. import { Allow, Ctx, FacetValue, RequestContext, SearchResolver } from '@vendure/core';
  11. import { ElasticsearchService } from './elasticsearch.service';
  12. import { ElasticSearchInput, SearchPriceData } from './types';
  13. @Resolver('SearchResponse')
  14. export class ShopElasticSearchResolver implements Omit<SearchResolver, 'reindex'> {
  15. constructor(private elasticsearchService: ElasticsearchService) {}
  16. @Query()
  17. @Allow(Permission.Public)
  18. async search(
  19. @Ctx() ctx: RequestContext,
  20. @Args() args: QuerySearchArgs,
  21. ): Promise<Omit<SearchResponse, 'facetValues'>> {
  22. const result = await this.elasticsearchService.search(ctx, args.input, true);
  23. // ensure the facetValues property resolver has access to the input args
  24. (result as any).input = args.input;
  25. return result;
  26. }
  27. @ResolveField()
  28. async facetValues(
  29. @Ctx() ctx: RequestContext,
  30. @Parent() parent: { input: ElasticSearchInput },
  31. ): Promise<Array<{ facetValue: FacetValue; count: number }>> {
  32. const facetValues = await this.elasticsearchService.facetValues(ctx, parent.input, true);
  33. return facetValues.filter((i) => !i.facetValue.facet.isPrivate);
  34. }
  35. @ResolveField()
  36. async prices(
  37. @Ctx() ctx: RequestContext,
  38. @Parent() parent: { input: ElasticSearchInput },
  39. ): Promise<SearchPriceData> {
  40. return this.elasticsearchService.priceRange(ctx, parent.input);
  41. }
  42. }
  43. @Resolver('SearchResponse')
  44. export class AdminElasticSearchResolver implements SearchResolver {
  45. constructor(private elasticsearchService: ElasticsearchService) {}
  46. @Query()
  47. @Allow(Permission.ReadCatalog)
  48. async search(
  49. @Ctx() ctx: RequestContext,
  50. @Args() args: QuerySearchArgs,
  51. ): Promise<Omit<SearchResponse, 'facetValues'>> {
  52. const result = await this.elasticsearchService.search(ctx, args.input, false);
  53. // ensure the facetValues property resolver has access to the input args
  54. (result as any).input = args.input;
  55. return result;
  56. }
  57. @ResolveField()
  58. async facetValues(
  59. @Ctx() ctx: RequestContext,
  60. @Parent() parent: { input: SearchInput },
  61. ): Promise<Array<{ facetValue: FacetValue; count: number }>> {
  62. return this.elasticsearchService.facetValues(ctx, parent.input, false);
  63. }
  64. @Mutation()
  65. @Allow(Permission.UpdateCatalog)
  66. async reindex(@Ctx() ctx: RequestContext): Promise<GraphQLJob> {
  67. return (this.elasticsearchService.reindex(ctx, false) as unknown) as GraphQLJob;
  68. }
  69. }