From 8417eef69c56615f0a5ce1f444b3f6599da74219 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Tue, 16 Dec 2025 14:47:15 +0330 Subject: [PATCH] update food --- src/modules/foods/dto/create-food.dto.ts | 22 ++++++++++++++++++- src/modules/foods/providers/food.service.ts | 13 +++++------ .../providers/food-rating-cron.service.ts | 6 ++--- .../review/providers/review.service.ts | 6 ++--- src/seeders/data/foods.data.ts | 9 ++++++++ src/seeders/foods.seeder.ts | 19 +++++++--------- 6 files changed, 49 insertions(+), 26 deletions(-) diff --git a/src/modules/foods/dto/create-food.dto.ts b/src/modules/foods/dto/create-food.dto.ts index 1518b92..d8d0c52 100644 --- a/src/modules/foods/dto/create-food.dto.ts +++ b/src/modules/foods/dto/create-food.dto.ts @@ -1,6 +1,7 @@ -import { IsBoolean, IsOptional, IsString, IsNumber, IsArray, IsNotEmpty } from 'class-validator'; +import { IsBoolean, IsOptional, IsString, IsNumber, IsArray, IsNotEmpty, IsEnum } from 'class-validator'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Type } from 'class-transformer'; +import { MealType } from '../interface/food.interface'; export class CreateFoodDto { @IsNotEmpty() @@ -54,6 +55,19 @@ export class CreateFoodDto { @ApiPropertyOptional({ type: [String] }) content?: string[]; + @IsOptional() + @IsArray() + @IsNumber({}, { each: true }) + @Type(() => Number) + @ApiPropertyOptional({ type: [Number] }) + weekDays?: number[]; + + @IsOptional() + @IsArray() + @IsEnum(MealType, { each: true }) + @ApiPropertyOptional({ enum: MealType, isArray: true }) + mealTypes?: MealType[]; + @IsOptional() @IsNumber() @Type(() => Number) @@ -138,6 +152,12 @@ export class CreateFoodDto { @ApiPropertyOptional({ example: 0 }) discount?: number; + @IsOptional() + @IsNumber() + @Type(() => Number) + @ApiPropertyOptional({ example: 0 }) + score?: number; + @IsOptional() @IsBoolean() @ApiPropertyOptional({ example: false }) diff --git a/src/modules/foods/providers/food.service.ts b/src/modules/foods/providers/food.service.ts index 31f4c47..95fa7af 100644 --- a/src/modules/foods/providers/food.service.ts +++ b/src/modules/foods/providers/food.service.ts @@ -21,7 +21,7 @@ export class FoodService { private readonly restRepository: RestRepository, private readonly em: EntityManager, private readonly cacheService: CacheService, - ) {} + ) { } async create(restId: string, createFoodDto: CreateFoodDto): Promise { const { categoryId, ...rest } = createFoodDto; @@ -36,13 +36,6 @@ export class FoodService { // prepare data with defaults for required fields so repository.create typing is satisfied const data: RequiredEntityData = { - // boolean/day flags - sat: rest.sat ?? false, - sun: rest.sun ?? false, - mon: rest.mon ?? false, - breakfast: rest.breakfast ?? false, - noon: rest.noon ?? false, - dinner: rest.dinner ?? false, desc: rest.desc, isActive: rest.isActive ?? true, inPlaceServe: rest.inPlaceServe ?? false, @@ -56,6 +49,10 @@ export class FoodService { price: rest.price ?? 0, prepareTime: rest.prepareTime ?? 0, images: rest.images ?? undefined, + // new fields + weekDays: rest.weekDays ?? [0, 1, 2, 3, 4, 5, 6], + mealTypes: rest.mealTypes ?? [], + score: rest.score ?? null, restaurant: restaurant, category: category, }; diff --git a/src/modules/review/providers/food-rating-cron.service.ts b/src/modules/review/providers/food-rating-cron.service.ts index 63324c2..2053326 100644 --- a/src/modules/review/providers/food-rating-cron.service.ts +++ b/src/modules/review/providers/food-rating-cron.service.ts @@ -13,7 +13,7 @@ export class FoodRatingCronService { private readonly em: EntityManager, private readonly foodRepository: FoodRepository, private readonly reviewRepository: ReviewRepository, - ) {} + ) { } /** * Cron job that runs at midnight every day (00:00:00 UTC) @@ -55,8 +55,8 @@ export class FoodRatingCronService { averageRating = sum / reviews.length; } - // Update food rate - food.rate = parseFloat(averageRating.toFixed(2)); + // Update food score + food.score = parseFloat(averageRating.toFixed(2)); this.em.persist(food); updatedCount++; diff --git a/src/modules/review/providers/review.service.ts b/src/modules/review/providers/review.service.ts index f20e2d6..cff7811 100644 --- a/src/modules/review/providers/review.service.ts +++ b/src/modules/review/providers/review.service.ts @@ -21,7 +21,7 @@ export class ReviewService { private readonly foodRepository: FoodRepository, private readonly userRepository: UserRepository, private readonly em: EntityManager, - ) {} + ) { } async create(userId: string, createReviewDto: CreateReviewDto): Promise { const { foodId, orderId, rating, comment, positivePoints, negativePoints } = createReviewDto; @@ -176,7 +176,7 @@ export class ReviewService { if (reviews.length === 0) { const food = await this.foodRepository.findOne({ id: foodId }); if (food) { - food.rate = 0; + food.score = 0; await this.em.persistAndFlush(food); } return; @@ -186,7 +186,7 @@ export class ReviewService { const food = await this.foodRepository.findOne({ id: foodId }); if (food) { - food.rate = parseFloat(averageRating.toFixed(2)); + food.score = parseFloat(averageRating.toFixed(2)); await this.em.persistAndFlush(food); } } diff --git a/src/seeders/data/foods.data.ts b/src/seeders/data/foods.data.ts index 47de792..42ed947 100644 --- a/src/seeders/data/foods.data.ts +++ b/src/seeders/data/foods.data.ts @@ -1,3 +1,5 @@ +import { MealType } from '../../modules/foods/interface/food.interface'; + export interface FoodData { title: string; desc: string; @@ -9,6 +11,13 @@ export interface FoodData { stockDefault: number; images: string[]; content?: string[]; + weekDays?: number[]; + mealTypes?: MealType[]; + discount?: number; + score?: number; + inPlaceServe?: boolean; + pickupServe?: boolean; + isSpecialOffer?: boolean; } export const foodsData: FoodData[] = [ diff --git a/src/seeders/foods.seeder.ts b/src/seeders/foods.seeder.ts index 9bdb268..2b01d12 100644 --- a/src/seeders/foods.seeder.ts +++ b/src/seeders/foods.seeder.ts @@ -30,18 +30,15 @@ export class FoodsSeeder { restaurant, category, isActive: foodData.isActive, - sat: false, - sun: false, - mon: false, - breakfast: false, - noon: false, - dinner: false, - discount: 0, - rate: 0, - inPlaceServe: false, - pickupServe: false, + // new fields on Food entity + weekDays: foodData.weekDays ?? [0, 1, 2, 3, 4, 5, 6], + mealTypes: foodData.mealTypes ?? [], + discount: foodData.discount ?? 0, + score: foodData.score ?? 0, + inPlaceServe: foodData.inPlaceServe ?? false, + pickupServe: foodData.pickupServe ?? false, images: foodData.images, - isSpecialOffer: false, + isSpecialOffer: foodData.isSpecialOffer ?? false, }); em.persist(food);