diff --git a/apps/backend/src/lib/delete-orders.ts b/apps/backend/src/lib/delete-orders.ts new file mode 100644 index 0000000..57b6d34 --- /dev/null +++ b/apps/backend/src/lib/delete-orders.ts @@ -0,0 +1,45 @@ +import { db } from '../db/db_index'; +import { orders, orderItems, orderStatus, payments, refunds, couponUsage, complaints } from '../db/schema'; +import { eq, inArray } from 'drizzle-orm'; + +/** + * Delete orders and all their related records + * @param orderIds Array of order IDs to delete + * @returns Promise + * @throws Error if deletion fails + */ +export const deleteOrders = async (orderIds: number[]): Promise => { + if (orderIds.length === 0) { + return; + } + + try { + // Delete child records first (in correct order to avoid FK constraint errors) + + // 1. Delete coupon usage records + await db.delete(couponUsage).where(inArray(couponUsage.orderId, orderIds)); + + // 2. Delete complaints related to these orders + await db.delete(complaints).where(inArray(complaints.orderId, orderIds)); + + // 3. Delete refunds + await db.delete(refunds).where(inArray(refunds.orderId, orderIds)); + + // 4. Delete payments + await db.delete(payments).where(inArray(payments.orderId, orderIds)); + + // 5. Delete order status records + await db.delete(orderStatus).where(inArray(orderStatus.orderId, orderIds)); + + // 6. Delete order items + await db.delete(orderItems).where(inArray(orderItems.orderId, orderIds)); + + // 7. Finally delete the orders themselves + await db.delete(orders).where(inArray(orders.id, orderIds)); + + console.log(`Successfully deleted ${orderIds.length} orders and all related records`); + } catch (error) { + console.error(`Failed to delete orders ${orderIds.join(', ')}:`, error); + throw error; + } +}; diff --git a/apps/backend/src/lib/init.ts b/apps/backend/src/lib/init.ts index 69a8370..e665aa1 100755 --- a/apps/backend/src/lib/init.ts +++ b/apps/backend/src/lib/init.ts @@ -1,6 +1,7 @@ import './notif-job'; import { initializeAllStores } from '../stores/store-initializer'; import { startOrderHandler, publishOrder } from './post-order-handler'; +import { deleteOrders } from './delete-orders'; /** * Initialize all application services @@ -23,21 +24,7 @@ export const initFunc = async (): Promise => { // Start post order handler (Redis Pub/Sub subscriber) await startOrderHandler(); - // Wait a moment for subscription to be ready, then publish demo order - // setTimeout(async () => { - // console.log('Publishing demo order for testing...'); - // await publishOrder({ - // orders: [{ - // deliveryTime: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(), // Tomorrow - // orderPlaceTime: new Date().toISOString(), - // totalAmount: 550, - // orderItems: [ - // { productName: "Chicken Breast", quantity: 2 }, - // { productName: "Mutton Curry Cut", quantity: 1 }, - // ], - // }], - // }); - // }, 20000); + console.log('Application initialization completed successfully'); } catch (error) {