diff --git a/src/modules/cancel/cancel.repository.ts b/src/modules/cancel/cancel.repository.ts index 656e5cf..230d8e3 100644 --- a/src/modules/cancel/cancel.repository.ts +++ b/src/modules/cancel/cancel.repository.ts @@ -19,40 +19,17 @@ export class CancelOrderRepo extends BaseRepository { const skip = (page - 1) * limit; const docs = await this.model.aggregate([ - { - $lookup: { - from: "orders", - localField: "order", - foreignField: "_id", - as: "order", - }, - }, - { - $lookup: { - from: "sellers", - localField: "canceller", - foreignField: "_id", - as: "seller", - }, - }, - { - $addFields: { - seller: { $ifNull: ["$seller", []] }, - }, - }, - { - $lookup: { - from: "users", - localField: "canceller", - foreignField: "_id", - as: "user", - }, - }, - { - $addFields: { - user: { $ifNull: ["$user", []] }, - }, - }, + // orders + { $lookup: { from: "orders", localField: "order", foreignField: "_id", as: "order" } }, + { $unwind: { path: "$order", preserveNullAndEmptyArrays: true } }, + + // seller and user lookups + { $lookup: { from: "sellers", localField: "canceller", foreignField: "_id", as: "seller" } }, + { $addFields: { seller: { $ifNull: ["$seller", []] } } }, + + { $lookup: { from: "users", localField: "canceller", foreignField: "_id", as: "user" } }, + { $addFields: { user: { $ifNull: ["$user", []] } } }, + { $addFields: { cancellerDetails: { @@ -64,9 +41,9 @@ export class CancelOrderRepo extends BaseRepository { }, }, }, - { - $unset: ["user", "seller"], - }, + { $unset: ["user", "seller"] }, + + // cancelOrderItems (keep docs even if empty) { $lookup: { from: "cancelorderitems", @@ -75,9 +52,9 @@ export class CancelOrderRepo extends BaseRepository { as: "cancelOrderItems", }, }, - { - $unwind: "$cancelOrderItems", - }, + { $unwind: { path: "$cancelOrderItems", preserveNullAndEmptyArrays: true } }, + + // orderItem { $lookup: { from: "orderitems", @@ -86,17 +63,81 @@ export class CancelOrderRepo extends BaseRepository { as: "cancelOrderItems.orderItem", }, }, - { - $unwind: "$cancelOrderItems.orderItem", - }, + { $unwind: { path: "$cancelOrderItems.orderItem", preserveNullAndEmptyArrays: true } }, + + // products (shipmentItems.product) — keep nulls { $lookup: { from: "products", localField: "cancelOrderItems.orderItem.shipmentItems.product", foreignField: "_id", - as: "cancelOrderItems.orderItem.shipmentItems.product", + as: "productDocs", }, }, + { + $addFields: { + "cancelOrderItems.orderItem.shipmentItems": { + $map: { + input: "$cancelOrderItems.orderItem.shipmentItems", + as: "si", + in: { + $mergeObjects: [ + "$$si", + { + product: { + $arrayElemAt: [ + { + $filter: { + input: "$productDocs", + as: "p", + cond: { + $eq: ["$$p._id", "$$si.product"], + }, + }, + }, + 0, + ], + }, + }, + ], + }, + }, + }, + }, + }, + { $unset: "productDocs" }, + + // cancel reason -> lookup into temp field, then inject into nested path + { + $lookup: { + from: "cancelreasons", + localField: "cancelOrderItems.reason", + foreignField: "_id", + as: "reasonDoc", + }, + }, + { $unwind: { path: "$reasonDoc", preserveNullAndEmptyArrays: true } }, + { + $addFields: { + "cancelOrderItems.reason": "$reasonDoc", + }, + }, + { $unset: ["reasonDoc"] }, + + { + $addFields: { + "cancelOrderItems.shipmentItem": { + $first: { + $filter: { + input: "$cancelOrderItems.orderItem.shipmentItems", + as: "si", + cond: { $eq: ["$$si._id", "$cancelOrderItems.shipmentItem"] }, + }, + }, + }, + }, + }, + { $lookup: { from: "shops", @@ -105,28 +146,22 @@ export class CancelOrderRepo extends BaseRepository { as: "cancelOrderItems.orderItem.shipmentItems.product.shop", }, }, - { - $unwind: "$cancelOrderItems.orderItem.shipmentItems.product.shop", - }, + { $unwind: { path: "$cancelOrderItems.orderItem.shipmentItems.product.shop", preserveNullAndEmptyArrays: true } }, + + // sort BEFORE facet / pagination + { $sort: { createdAt: -1 } }, + + // facet for pagination + count { $facet: { data: [{ $skip: skip }, { $limit: limit }], totalCount: [{ $count: "count" }], }, }, - { - $addFields: { - totalCount: { $arrayElemAt: ["$totalCount.count", 0] }, - }, - }, - { - $sort: { - createdAt: -1, - }, - }, + + { $addFields: { totalCount: { $arrayElemAt: ["$totalCount.count", 0] } } }, ]); - console.dir(docs[0], { depth: null }); return { count: (docs[0]?.totalCount as number) || 0, docs: docs[0]?.data || [],