From 09cff1724d589e46af42b6630275fefe0df3f52a Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Wed, 29 Oct 2025 16:46:44 +0330 Subject: [PATCH] add: return orders --- src/modules/return/return.repository.ts | 141 +++++++++--------------- 1 file changed, 52 insertions(+), 89 deletions(-) diff --git a/src/modules/return/return.repository.ts b/src/modules/return/return.repository.ts index d96fd1c..01f0647 100644 --- a/src/modules/return/return.repository.ts +++ b/src/modules/return/return.repository.ts @@ -14,7 +14,8 @@ export class ReturnOrderRepo extends BaseRepository { } async getAllReturnsForAdmin(skip: number, limit: number) { - const docs = await this.model.aggregate([ + const [result] = await this.model.aggregate([ + // --- 1. Lookup order --- { $lookup: { from: "orders", @@ -23,9 +24,9 @@ export class ReturnOrderRepo extends BaseRepository { as: "order", }, }, - { - $unwind: "$order", - }, + { $unwind: { path: "$order", preserveNullAndEmptyArrays: true } }, + + // --- 2. Lookup return order items --- { $lookup: { from: "returnorderitems", @@ -34,117 +35,79 @@ export class ReturnOrderRepo extends BaseRepository { as: "returnOrderItems", }, }, - { - $unwind: "$returnOrderItems", - }, + { $unwind: { path: "$returnOrderItems", preserveNullAndEmptyArrays: true } }, + + // --- 3. Lookup order items --- { $lookup: { from: "orderitems", localField: "returnOrderItems.orderItem", foreignField: "_id", - as: "returnOrderItems.orderItem", - }, - }, - { - $unwind: "$returnOrderItems.orderItem", - }, - { - $lookup: { - from: "products", - localField: "returnOrderItems.orderItem.shipmentItems.product", - foreignField: "_id", - as: "product", - }, - }, - { - $unwind: "$product", - }, - { - $addFields: { - product: "$product", + as: "orderItem", }, }, + { $unwind: { path: "$orderItem", preserveNullAndEmptyArrays: true } }, + { $addFields: { "returnOrderItems.orderItem": "$orderItem" } }, + + // --- 4. Lookup shop --- { $lookup: { from: "shops", - localField: "returnOrderItems.orderItem.shop", + localField: "orderItem.shop", foreignField: "_id", as: "shop", }, }, - { - $unwind: "$shop", - }, - { - $addFields: { - shopName: "$shop.shopName", - }, - }, - { - $lookup: { - from: "sellers", - localField: "shop.owner", - foreignField: "_id", - as: "seller", - }, - }, - { - $unwind: "$seller", - }, - { - $addFields: { - seller: "$seller.fullName", - }, - }, - { - $project: { - _id: 1, - order: 1, - status: 1, - total_price: 1, - shopName: 1, - seller: 1, - product: { - _id: 1, - title_fa: 1, - imagesUrl: 1, - }, - createdAt: 1, - updatedAt: 1, - returnOrderItems: { - _id: 1, - quantity: 1, - comment: 1, - reason: 1, - imagesUrl: 1, - orderItem: { - _id: 1, - totalSellingPrice: 1, - }, - }, - }, - }, + { $unwind: { path: "$shop", preserveNullAndEmptyArrays: true } }, + { $addFields: { shopName: "$shop.shopName" } }, + + // --- 5. Sort before pagination --- + { $sort: { createdAt: -1 } }, + + // --- 6. Facet for pagination + count --- { $facet: { - data: [{ $skip: skip }, { $limit: limit }], + data: [ + { $skip: skip }, + { $limit: limit }, + { + $project: { + _id: 1, + order: 1, + status: 1, + total_price: 1, + shopName: 1, + createdAt: 1, + updatedAt: 1, + returnOrderItems: { + _id: 1, + quantity: 1, + comment: 1, + reason: 1, + imagesUrl: 1, + orderItem: { + _id: 1, + totalSellingPrice: 1, + }, + }, + }, + }, + ], totalCount: [{ $count: "count" }], }, }, + + // --- 7. Flatten count field --- { $addFields: { - totalCount: { $arrayElemAt: ["$totalCount.count", 0] }, - }, - }, - { - $sort: { - createdAt: -1, + totalCount: { $ifNull: [{ $arrayElemAt: ["$totalCount.count", 0] }, 0] }, }, }, ]); return { - count: (docs?.[0]?.totalCount as number) || 0, - docs: docs?.[0]?.data || [], + count: result?.totalCount || 0, + docs: result?.data || [], }; }