update food entity
This commit is contained in:
@@ -12,7 +12,6 @@ import { Order } from '../../orders/entities/order.entity';
|
||||
import { OrderStatus } from '../../orders/interface/order.interface';
|
||||
import { Cart } from '../interfaces/cart.interface';
|
||||
import { GeographicUtils } from '../utils/geographic.utils';
|
||||
import { MealType } from '../../foods/interface/food.interface';
|
||||
import { CartMessage } from 'src/common/enums/message.enum';
|
||||
import { WalletTransactionRepository } from 'src/modules/users/repositories/wallet-transaction.repository';
|
||||
|
||||
@@ -284,139 +283,5 @@ export class CartValidationService {
|
||||
return new Map(foods.map(f => [f.id, f]));
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert all foods in cart have pickupServe true when delivery method is courier
|
||||
*/
|
||||
async assertAllFoodsHavePickupServeForCourier(cart: Cart, deliveryMethod: DeliveryMethodEnum): Promise<void> {
|
||||
if (deliveryMethod !== DeliveryMethodEnum.DeliveryCourier) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (cart.items.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const foodIds = cart.items.map(item => item.foodId);
|
||||
const foods = await this.em.find(Food, { id: { $in: foodIds } });
|
||||
|
||||
const foodsWithoutPickupServe = foods.filter(food => !food.pickupServe);
|
||||
|
||||
if (foodsWithoutPickupServe.length > 0) {
|
||||
const foodTitles = foodsWithoutPickupServe.map(f => f.title || f.id).join(', ');
|
||||
throw new BadRequestException(
|
||||
CartMessage.FOODS_MUST_HAVE_PICKUP_SERVE_FOR_COURIER.replace('[foodTitles]', foodTitles),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get current Iran time context (weekday and meal type)
|
||||
*/
|
||||
private getCurrentIranTimeContext(): { iranWeekDay: number; mealType: MealType | null } {
|
||||
const nowInIran = new Date(new Date().toLocaleString('en-US', { timeZone: 'Asia/Tehran' }));
|
||||
const weekDay = nowInIran.getDay(); // 0 = Sunday, 6 = Saturday
|
||||
const currentHour = nowInIran.getHours();
|
||||
|
||||
// Convert to Iran weekday: Saturday=0, Sunday=1, ..., Friday=6
|
||||
// JavaScript: Sunday=0, Monday=1, ..., Saturday=6
|
||||
// Iran week: Saturday=0, Sunday=1, ..., Friday=6
|
||||
const iranWeekDay = (weekDay + 1) % 7;
|
||||
|
||||
const mealType = this.getMealTypeByHour(currentHour);
|
||||
|
||||
return { iranWeekDay, mealType };
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine meal type based on current hour in Iran timezone.
|
||||
* @param hour - Current hour (0-23)
|
||||
* @returns Meal type or null if outside meal hours
|
||||
*/
|
||||
private getMealTypeByHour(hour: number): MealType | null {
|
||||
const MEAL_TIME_RANGES = {
|
||||
BREAKFAST: { start: 6, end: 11 },
|
||||
LUNCH: { start: 11, end: 15 },
|
||||
SNACK: { start: 15, end: 19 },
|
||||
DINNER: { start: 19, end: 24 },
|
||||
} as const;
|
||||
|
||||
if (hour >= MEAL_TIME_RANGES.BREAKFAST.start && hour < MEAL_TIME_RANGES.BREAKFAST.end) {
|
||||
return MealType.BREAKFAST;
|
||||
}
|
||||
if (hour >= MEAL_TIME_RANGES.LUNCH.start && hour < MEAL_TIME_RANGES.LUNCH.end) {
|
||||
return MealType.LUNCH;
|
||||
}
|
||||
if (hour >= MEAL_TIME_RANGES.SNACK.start && hour < MEAL_TIME_RANGES.SNACK.end) {
|
||||
return MealType.SNACK;
|
||||
}
|
||||
if (hour >= MEAL_TIME_RANGES.DINNER.start && hour < MEAL_TIME_RANGES.DINNER.end) {
|
||||
return MealType.DINNER;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert meal type compatibility - if food has mealTypes, current meal time must be in that array
|
||||
*/
|
||||
assertMealTypeCompatibility(food: Food): void {
|
||||
// If food has no meal type restrictions, allow it
|
||||
if (!food.mealTypes || food.mealTypes.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { mealType } = this.getCurrentIranTimeContext();
|
||||
|
||||
// If current time is outside meal hours, throw error
|
||||
if (mealType === null) {
|
||||
const foodTitle = food.title || food.id;
|
||||
throw new BadRequestException(
|
||||
CartMessage.FOOD_ONLY_AVAILABLE_DURING_MEAL_TIMES.replace('[foodTitle]', foodTitle),
|
||||
);
|
||||
}
|
||||
|
||||
// Check if current meal type is in food's allowed meal types
|
||||
if (!food.mealTypes.includes(mealType)) {
|
||||
const foodTitle = food.title || food.id;
|
||||
const mealTypeMap: Record<MealType, string> = {
|
||||
[MealType.BREAKFAST]: 'صبحانه',
|
||||
[MealType.LUNCH]: 'ناهار',
|
||||
[MealType.SNACK]: 'عصرانه',
|
||||
[MealType.DINNER]: 'شام',
|
||||
};
|
||||
const allowedMealTypes = food.mealTypes.map(mt => mealTypeMap[mt]).join(', ');
|
||||
const currentMealType = mealType ? mealTypeMap[mealType] : mealType;
|
||||
throw new BadRequestException(
|
||||
CartMessage.FOOD_ONLY_AVAILABLE_FOR_MEAL_TYPES.replace('[foodTitle]', foodTitle)
|
||||
.replace('[allowedMealTypes]', allowedMealTypes)
|
||||
.replace('[mealType]', currentMealType),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert weekday compatibility - current weekday must be in food's weekDays array
|
||||
*/
|
||||
assertWeekdayCompatibility(food: Food): void {
|
||||
// If food has no weekday restrictions (empty array or all days), allow it
|
||||
if (!food.weekDays || food.weekDays.length === 0 || food.weekDays.length === 7) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { iranWeekDay } = this.getCurrentIranTimeContext();
|
||||
|
||||
// Check if current weekday is in food's allowed weekdays
|
||||
if (!food.weekDays.includes(iranWeekDay)) {
|
||||
const dayNames = ['شنبه', 'یکشنبه', 'دوشنبه', 'سهشنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه'];
|
||||
const currentDayName = dayNames[iranWeekDay];
|
||||
const allowedDays = food.weekDays.map(day => dayNames[day]).join(', ');
|
||||
const foodTitle = food.title || food.id;
|
||||
throw new BadRequestException(
|
||||
CartMessage.FOOD_ONLY_AVAILABLE_ON_DAYS.replace('[foodTitle]', foodTitle)
|
||||
.replace('[allowedDays]', allowedDays)
|
||||
.replace('[currentDay]', currentDayName),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user