Merge pull request #56 from Danakcorp/mrtz

populate : shipmentItem and product
This commit is contained in:
morteza-mortezai
2025-11-06 18:48:34 +03:30
committed by GitHub
+93 -58
View File
@@ -19,40 +19,17 @@ export class CancelOrderRepo extends BaseRepository<ICancelOrder> {
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<ICancelOrder> {
},
},
},
{
$unset: ["user", "seller"],
},
{ $unset: ["user", "seller"] },
// cancelOrderItems (keep docs even if empty)
{
$lookup: {
from: "cancelorderitems",
@@ -75,9 +52,9 @@ export class CancelOrderRepo extends BaseRepository<ICancelOrder> {
as: "cancelOrderItems",
},
},
{
$unwind: "$cancelOrderItems",
},
{ $unwind: { path: "$cancelOrderItems", preserveNullAndEmptyArrays: true } },
// orderItem
{
$lookup: {
from: "orderitems",
@@ -86,17 +63,81 @@ export class CancelOrderRepo extends BaseRepository<ICancelOrder> {
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<ICancelOrder> {
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 || [],