From 6bda9bb31f83a654ddbf50ffb0e255a56669c2d7 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Mon, 8 Dec 2025 15:39:26 +0330 Subject: [PATCH] rewview --- .../review/controllers/review.controller.ts | 19 ++++++++++++++++--- src/modules/review/dto/find-reviews.dto.ts | 6 ++++++ .../review/providers/review.service.ts | 13 +++++++++++-- .../review/repositories/review.repository.ts | 8 ++++++-- 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/modules/review/controllers/review.controller.ts b/src/modules/review/controllers/review.controller.ts index b2a1186..8f1adea 100644 --- a/src/modules/review/controllers/review.controller.ts +++ b/src/modules/review/controllers/review.controller.ts @@ -2,7 +2,7 @@ import { Controller, Get, Post, Body, Patch, Param, Delete, Query, UseGuards } f import { ReviewService } from '../providers/review.service'; import { CreateReviewDto } from '../dto/create-review.dto'; import { UpdateReviewDto } from '../dto/update-review.dto'; -import { FindReviewsDto } from '../dto/find-reviews.dto'; +import { FindReviewsDto, FindRestuarantReviewsDto } from '../dto/find-reviews.dto'; import { ApiTags, ApiOperation, @@ -35,11 +35,11 @@ export class ReviewController { } @Get('public/reviews/:foodId') - @ApiOperation({ summary: 'Get all reviews (public - only approved)' }) + @ApiOperation({ summary: 'Get all reviews of food by id(public - only approved)' }) @ApiOkResponse({ description: 'List of approved reviews' }) + @ApiParam({ name: 'foodId', required: true, type: String }) @ApiQuery({ name: 'page', required: false, type: Number }) @ApiQuery({ name: 'limit', required: false, type: Number }) - @ApiParam({ name: 'foodId', required: true, type: String }) @ApiQuery({ name: 'orderBy', required: false, type: String }) @ApiQuery({ name: 'order', required: false, enum: ['asc', 'desc'] }) findAll(@Query() dto: FindReviewsDto, @Param('foodId') foodId: string) { @@ -47,6 +47,19 @@ export class ReviewController { return this.reviewService.findAll({ ...dto, isApproved: true, foodId }); } + @Get('public/reviews/restuarant/:restuarantSlug') + @ApiOperation({ summary: 'Get all reviews of restuarant by slug(public - only approved)' }) + @ApiOkResponse({ description: 'List of approved reviews' }) + @ApiParam({ name: 'restuarantSlug', required: true, type: String }) + @ApiQuery({ name: 'page', required: false, type: Number }) + @ApiQuery({ name: 'limit', required: false, type: Number }) + @ApiQuery({ name: 'orderBy', required: false, type: String }) + @ApiQuery({ name: 'order', required: false, enum: ['asc', 'desc'] }) + findRestuarantAllReviews(@Query() dto: FindRestuarantReviewsDto) { + // Only show approved reviews for public endpoint + return this.reviewService.findRestuarantAllReviews({ ...dto, isApproved: true }); + } + // @Get('public/reviews/:id') // @ApiOperation({ summary: 'Get a review by id' }) // @ApiParam({ name: 'id', required: true }) diff --git a/src/modules/review/dto/find-reviews.dto.ts b/src/modules/review/dto/find-reviews.dto.ts index 4254097..202a3a0 100644 --- a/src/modules/review/dto/find-reviews.dto.ts +++ b/src/modules/review/dto/find-reviews.dto.ts @@ -47,3 +47,9 @@ export class FindReviewsDto { order?: 'asc' | 'desc'; } +export class FindRestuarantReviewsDto extends FindReviewsDto { + @IsOptional() + @IsString() + @ApiPropertyOptional({ description: 'Restaurant slug to filter comments' }) + restuarantSlug?: string; +} diff --git a/src/modules/review/providers/review.service.ts b/src/modules/review/providers/review.service.ts index 9866892..0f7aa4b 100644 --- a/src/modules/review/providers/review.service.ts +++ b/src/modules/review/providers/review.service.ts @@ -1,7 +1,7 @@ import { Injectable, NotFoundException, BadRequestException } from '@nestjs/common'; import { CreateReviewDto } from '../dto/create-review.dto'; import { UpdateReviewDto } from '../dto/update-review.dto'; -import { FindReviewsDto } from '../dto/find-reviews.dto'; +import { FindRestuarantReviewsDto, FindReviewsDto } from '../dto/find-reviews.dto'; import { ReviewRepository } from '../repositories/review.repository'; import { FoodRepository } from '../../foods/repositories/food.repository'; import { UserRepository } from '../../users/repositories/user.repository'; @@ -11,6 +11,7 @@ import { Review } from '../entities/review.entity'; import { FoodMessage, UserMessage, ReviewMessage } from 'src/common/enums/message.enum'; import { Order } from '../../orders/entities/order.entity'; import { OrderItem } from '../../orders/entities/order-item.entity'; +import { Restaurant } from 'src/modules/restaurants/entities/restaurant.entity'; @Injectable() export class ReviewService { @@ -88,6 +89,15 @@ export class ReviewService { return this.reviewRepository.findAllPaginated(dto); } + async findRestuarantAllReviews(dto: FindRestuarantReviewsDto) { + const { restuarantSlug, ...restDto } = dto; + const restaurant = await this.em.findOne(Restaurant, { slug: restuarantSlug }); + if (!restaurant) { + throw new NotFoundException('RestaurantMessage.NOT_FOUND'); + } + return this.reviewRepository.findAllPaginated({ ...restDto, restId: restaurant.id }); + } + async findById(id: string): Promise { const review = await this.reviewRepository.findOne({ id }, { populate: ['food', 'user', 'order'] }); if (!review) { @@ -167,4 +177,3 @@ export class ReviewService { } } } - diff --git a/src/modules/review/repositories/review.repository.ts b/src/modules/review/repositories/review.repository.ts index 2f247ae..73c5283 100644 --- a/src/modules/review/repositories/review.repository.ts +++ b/src/modules/review/repositories/review.repository.ts @@ -11,6 +11,7 @@ type FindReviewsOpts = { userId?: string; isApproved?: boolean; orderBy?: string; + restId?: string; order?: 'asc' | 'desc'; }; @@ -25,7 +26,7 @@ export class ReviewRepository extends EntityRepository { * Supports: foodId, userId, isApproved, ordering. */ async findAllPaginated(opts: FindReviewsOpts = {}): Promise> { - const { page = 1, limit = 10, foodId, userId, isApproved, orderBy = 'createdAt', order = 'desc' } = opts; + const { page = 1, limit = 10, foodId, restId, userId, isApproved, orderBy = 'createdAt', order = 'desc' } = opts; const offset = (page - 1) * limit; @@ -35,6 +36,10 @@ export class ReviewRepository extends EntityRepository { where.food = { id: foodId }; } + if (restId) { + where.food = { restaurant: { id: restId } }; + } + if (userId) { where.user = { id: userId }; } @@ -63,4 +68,3 @@ export class ReviewRepository extends EntityRepository { }; } } -