refactor order craetion
This commit is contained in:
@@ -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 };
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user