refactor order craetion

This commit is contained in:
2025-12-17 15:36:04 +03:30
parent 26220dbb8b
commit bfb7441a0c
7 changed files with 180 additions and 78 deletions
+28 -27
View File
@@ -16,7 +16,7 @@ import { Delivery } from '../../delivery/entities/delivery.entity';
import { OrderRepository } from '../repositories/order.repository';
import { FindOrdersDto } from '../dto/find-orders.dto';
import { PaginatedResult } from 'src/common/interfaces/pagination.interface';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { Payment } from 'src/modules/payments/entities/payment.entity';
type OrderItemData = { food: Food; quantity: number; unitPrice: number; discount: number };
@@ -52,34 +52,21 @@ export class OrdersService {
private readonly em: EntityManager,
private readonly cartService: CartService,
private readonly orderRepository: OrderRepository,
// NOTE: kept for future payment integration
private readonly _paymentsService: PaymentsService,
// NOTE: kept for future event emission
private readonly _eventEmitter2: EventEmitter2,
private readonly paymentsService: PaymentsService,
) { }
async checkout(userId: string, restaurantId: string) {
const cart = await this.cartService.findOneOrFail(userId, restaurantId);
const validated = await this.validateCartForOrder(userId, restaurantId, cart);
const { order } = await this.createOrder(userId, restaurantId, cart);
await this.cartService.clearCart(userId, restaurantId);
this.logger.debug(`Order ${order.id} created for user ${userId} (restaurant ${restaurantId})`);
return { order };
}
async createOrder(userId: string, restaurantId: string, cart: Cart) {
const validationResult = await this.validateCartForOrder(userId, restaurantId, cart);
return this.em.transactional(async em => {
const order = await this.em.transactional(async em => {
const order = em.create(Order, {
user: validationResult.user,
restaurant: validationResult.restaurant,
deliveryMethod: validationResult.delivery,
userAddress: validationResult.userAddress,
carAddress: validationResult.carAddress,
paymentMethod: validationResult.paymentMethod,
user: validated.user,
restaurant: validated.restaurant,
deliveryMethod: validated.delivery,
userAddress: validated.userAddress,
carAddress: validated.carAddress,
paymentMethod: validated.paymentMethod,
couponDiscount: cart.couponDiscount || 0,
itemsDiscount: cart.itemsDiscount || 0,
totalDiscount: cart.totalDiscount || 0,
@@ -96,7 +83,7 @@ export class OrdersService {
em.persist(order);
for (const itemData of validationResult.orderItemsData) {
for (const itemData of validated.orderItemsData) {
const { food, quantity, unitPrice, discount } = itemData;
this.assertFoodHasSufficientStock(food, quantity);
@@ -113,13 +100,27 @@ export class OrdersService {
});
em.persist(orderItem);
em.persist(food);
}
const payment = em.create(Payment, {
order,
amount: order.total,
status: PaymentStatusEnum.Pending,
method: order.paymentMethod.method,
gateway: order.paymentMethod.gateway ?? null,
});
em.persist(payment);
await em.flush();
return { order };
this.logger.debug(`Order ${order.id} created for user ${userId} (restaurant ${restaurantId})`);
return order;
});
await this.cartService.clearCart(userId, restaurantId);
const { paymentUrl } = await this.paymentsService.payOrder(order.id);
return { paymentUrl };
}
/**