product-entity.resolver.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import { Args, Parent, ResolveField, Resolver } from '@nestjs/graphql';
  2. import { Api, ApiType, ListQueryBuilder, Product, TransactionalConnection } from '@vendure/core';
  3. import { ProductReview } from '../entities/product-review.entity';
  4. import { ProductReviewsArgs } from '../generated-shop-types';
  5. @Resolver('Product')
  6. export class ProductEntityResolver {
  7. constructor(private listQueryBuilder: ListQueryBuilder, private connection: TransactionalConnection) {}
  8. @ResolveField()
  9. reviews(@Api() apiType: ApiType, @Parent() product: Product, @Args() args: ProductReviewsArgs) {
  10. return this.listQueryBuilder
  11. .build(ProductReview, args.options || undefined, {
  12. where: {
  13. product: { id: product.id },
  14. ...(apiType === 'shop' ? { state: 'approved' } : {}),
  15. },
  16. relations: ['product', 'product.featuredAsset'],
  17. })
  18. .getManyAndCount()
  19. .then(([items, totalItems]) => ({
  20. items,
  21. totalItems,
  22. }));
  23. }
  24. @ResolveField()
  25. reviewsHistogram(@Parent() product: Product) {
  26. return this.connection.rawConnection
  27. .createQueryBuilder()
  28. .select('ROUND(`rating`)', 'bin')
  29. .addSelect('COUNT(*)', 'frequency')
  30. .from(ProductReview, 'review')
  31. .where('review.product = :productId', { productId: product.id })
  32. .andWhere('review.state = :state', { state: 'approved' })
  33. .groupBy('ROUND(`rating`)')
  34. .getRawMany();
  35. }
  36. }