Merge pull request #45 from Danakcorp/mrtz

add: populate return orders
This commit is contained in:
morteza-mortezai
2025-10-31 21:36:12 +03:30
committed by GitHub
+41 -8
View File
@@ -36,9 +36,11 @@ export class ReturnOrderRepo extends BaseRepository<IReturnOrder> {
}, },
}, },
{ $unwind: { path: "$returnOrderItems", preserveNullAndEmptyArrays: true } }, { $unwind: { path: "$returnOrderItems", preserveNullAndEmptyArrays: true } },
// 3) lookup return reason
{ {
$lookup: { $lookup: {
from: "returnreasons", // collection name of ReturnReasonModel from: "returnreasons",
localField: "returnOrderItems.reason", localField: "returnOrderItems.reason",
foreignField: "_id", foreignField: "_id",
as: "returnOrderItems.reason", as: "returnOrderItems.reason",
@@ -61,9 +63,40 @@ export class ReturnOrderRepo extends BaseRepository<IReturnOrder> {
}, },
}, },
{ $unwind: { path: "$orderItem", preserveNullAndEmptyArrays: true } }, { $unwind: { path: "$orderItem", preserveNullAndEmptyArrays: true } },
{ $addFields: { "returnOrderItems.orderItem": "$orderItem" } },
// 5) lookup shop from the orderItem // 5) populate shipmentItem from orderItem.shipmentItems
{
$addFields: {
"returnOrderItems.shipmentItem": {
$first: {
$filter: {
input: "$orderItem.shipmentItems",
as: "si",
cond: { $eq: ["$$si._id", "$returnOrderItems.shipmentItem"] },
},
},
},
},
},
// 6) attach orderItem itself
{ $addFields: { "returnOrderItems.orderItem": "$orderItem" } },
// ✅ populate product inside shipmentItem
{
$lookup: {
from: "products", // name of your product collection
localField: "returnOrderItems.shipmentItem.product",
foreignField: "_id", // or "productId" if your product._id isnt numeric
as: "returnOrderItems.shipmentItem.product",
},
},
{
$unwind: {
path: "$returnOrderItems.shipmentItem.product",
preserveNullAndEmptyArrays: true,
},
},
// 7) lookup shop
{ {
$lookup: { $lookup: {
from: "shops", from: "shops",
@@ -75,7 +108,7 @@ export class ReturnOrderRepo extends BaseRepository<IReturnOrder> {
{ $unwind: { path: "$shop", preserveNullAndEmptyArrays: true } }, { $unwind: { path: "$shop", preserveNullAndEmptyArrays: true } },
{ $addFields: { shopName: "$shop.shopName" } }, { $addFields: { shopName: "$shop.shopName" } },
// 6) group back so each return order is a single document with array of items // 8) regroup all return items per return order
{ {
$group: { $group: {
_id: "$_id", _id: "$_id",
@@ -89,10 +122,10 @@ export class ReturnOrderRepo extends BaseRepository<IReturnOrder> {
}, },
}, },
// 7) sort (by createdAt) before pagination // 9) sort (latest first)
{ $sort: { createdAt: -1 } }, { $sort: { createdAt: -1 } },
// 8) facet for pagination + count // 10) facet for pagination
{ {
$facet: { $facet: {
data: [ data: [
@@ -114,6 +147,7 @@ export class ReturnOrderRepo extends BaseRepository<IReturnOrder> {
reason: 1, reason: 1,
imagesUrl: 1, imagesUrl: 1,
orderItem: 1, orderItem: 1,
shipmentItem: 1, // ✅ Include populated shipment item
}, },
}, },
}, },
@@ -122,7 +156,7 @@ export class ReturnOrderRepo extends BaseRepository<IReturnOrder> {
}, },
}, },
// // 9) flatten count field // 11) flatten count field
{ {
$addFields: { $addFields: {
totalCount: { $ifNull: [{ $arrayElemAt: ["$totalCount.count", 0] }, 0] }, totalCount: { $ifNull: [{ $arrayElemAt: ["$totalCount.count", 0] }, 0] },
@@ -131,7 +165,6 @@ export class ReturnOrderRepo extends BaseRepository<IReturnOrder> {
]); ]);
const result = docs[0] || { data: [], totalCount: 0 }; const result = docs[0] || { data: [], totalCount: 0 };
return { return {
count: result.totalCount || 0, count: result.totalCount || 0,
docs: result.data || [], docs: result.data || [],