From cafee96f280149edcb5bda893ac1eff56bf84ba8 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Fri, 31 Oct 2025 10:50:19 +0330 Subject: [PATCH] populate : return list reason --- src/modules/return/DTO/return.dto.ts | 14 +++++-- src/modules/return/return.repository.ts | 55 ++++++++++++++++++------- 2 files changed, 51 insertions(+), 18 deletions(-) diff --git a/src/modules/return/DTO/return.dto.ts b/src/modules/return/DTO/return.dto.ts index ad7274f..86a7c66 100644 --- a/src/modules/return/DTO/return.dto.ts +++ b/src/modules/return/DTO/return.dto.ts @@ -64,12 +64,18 @@ export class ReturnOrderDTO { @Expose() total_price: number; - @Expose() - @Transform(({ value }) => new Date(value).toISOString()) + @Transform(({ value }) => { + if (!value) return null; + const date = new Date(value); + return isNaN(date.getTime()) ? null : date.toISOString(); + }) createdAt: string; - @Expose() - @Transform(({ value }) => new Date(value).toISOString()) + @Transform(({ value }) => { + if (!value) return null; + const date = new Date(value); + return isNaN(date.getTime()) ? null : date.toISOString(); + }) updatedAt: string; @Expose() diff --git a/src/modules/return/return.repository.ts b/src/modules/return/return.repository.ts index 01f0647..26ddd77 100644 --- a/src/modules/return/return.repository.ts +++ b/src/modules/return/return.repository.ts @@ -14,8 +14,8 @@ export class ReturnOrderRepo extends BaseRepository { } async getAllReturnsForAdmin(skip: number, limit: number) { - const [result] = await this.model.aggregate([ - // --- 1. Lookup order --- + const docs = await this.model.aggregate([ + // 1) lookup order { $lookup: { from: "orders", @@ -26,7 +26,7 @@ export class ReturnOrderRepo extends BaseRepository { }, { $unwind: { path: "$order", preserveNullAndEmptyArrays: true } }, - // --- 2. Lookup return order items --- + // 2) lookup return order items { $lookup: { from: "returnorderitems", @@ -36,8 +36,22 @@ export class ReturnOrderRepo extends BaseRepository { }, }, { $unwind: { path: "$returnOrderItems", preserveNullAndEmptyArrays: true } }, + { + $lookup: { + from: "returnreasons", // collection name of ReturnReasonModel + localField: "returnOrderItems.reason", + foreignField: "_id", + as: "returnOrderItems.reason", + }, + }, + { + $unwind: { + path: "$returnOrderItems.reason", + preserveNullAndEmptyArrays: true, + }, + }, - // --- 3. Lookup order items --- + // 4) lookup orderItem (the original order item) { $lookup: { from: "orderitems", @@ -49,7 +63,7 @@ export class ReturnOrderRepo extends BaseRepository { { $unwind: { path: "$orderItem", preserveNullAndEmptyArrays: true } }, { $addFields: { "returnOrderItems.orderItem": "$orderItem" } }, - // --- 4. Lookup shop --- + // 5) lookup shop from the orderItem { $lookup: { from: "shops", @@ -61,10 +75,24 @@ export class ReturnOrderRepo extends BaseRepository { { $unwind: { path: "$shop", preserveNullAndEmptyArrays: true } }, { $addFields: { shopName: "$shop.shopName" } }, - // --- 5. Sort before pagination --- + // 6) group back so each return order is a single document with array of items + { + $group: { + _id: "$_id", + order: { $first: "$order" }, + status: { $first: "$status" }, + total_price: { $first: "$total_price" }, + shopName: { $first: "$shopName" }, + createdAt: { $first: "$createdAt" }, + updatedAt: { $first: "$updatedAt" }, + returnOrderItems: { $push: "$returnOrderItems" }, + }, + }, + + // 7) sort (by createdAt) before pagination { $sort: { createdAt: -1 } }, - // --- 6. Facet for pagination + count --- + // 8) facet for pagination + count { $facet: { data: [ @@ -85,10 +113,7 @@ export class ReturnOrderRepo extends BaseRepository { comment: 1, reason: 1, imagesUrl: 1, - orderItem: { - _id: 1, - totalSellingPrice: 1, - }, + orderItem: 1, }, }, }, @@ -97,7 +122,7 @@ export class ReturnOrderRepo extends BaseRepository { }, }, - // --- 7. Flatten count field --- + // // 9) flatten count field { $addFields: { totalCount: { $ifNull: [{ $arrayElemAt: ["$totalCount.count", 0] }, 0] }, @@ -105,9 +130,11 @@ export class ReturnOrderRepo extends BaseRepository { }, ]); + const result = docs[0] || { data: [], totalCount: 0 }; + return { - count: result?.totalCount || 0, - docs: result?.data || [], + count: result.totalCount || 0, + docs: result.data || [], }; }