| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- import { Args, Parent, ResolveField, Resolver } from '@nestjs/graphql';
- import { Api, ApiType, ListQueryBuilder, Product, TransactionalConnection } from '@vendure/core';
- import { ProductReview } from '../entities/product-review.entity';
- import { ProductReviewsArgs } from '../generated-shop-types';
- @Resolver('Product')
- export class ProductEntityResolver {
- constructor(private listQueryBuilder: ListQueryBuilder, private connection: TransactionalConnection) {}
- @ResolveField()
- reviews(@Api() apiType: ApiType, @Parent() product: Product, @Args() args: ProductReviewsArgs) {
- return this.listQueryBuilder
- .build(ProductReview, args.options || undefined, {
- where: {
- product: { id: product.id },
- ...(apiType === 'shop' ? { state: 'approved' } : {}),
- },
- relations: ['product', 'product.featuredAsset'],
- })
- .getManyAndCount()
- .then(([items, totalItems]) => ({
- items,
- totalItems,
- }));
- }
- @ResolveField()
- reviewsHistogram(@Parent() product: Product) {
- return this.connection.rawConnection
- .createQueryBuilder()
- .select('ROUND(`rating`)', 'bin')
- .addSelect('COUNT(*)', 'frequency')
- .from(ProductReview, 'review')
- .where('review.product = :productId', { productId: product.id })
- .andWhere('review.state = :state', { state: 'approved' })
- .groupBy('ROUND(`rating`)')
- .getRawMany();
- }
- }
|