From 47ec12169d8b3b946a13827dc49c3d5da287d374 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Sat, 1 Nov 2025 11:15:23 +0330 Subject: [PATCH] add : return order detail --- .../admin/controllers/order.controller.ts | 10 ++ src/modules/return/return.repository.ts | 118 ++++++++++++++++++ src/modules/return/return.service.ts | 6 + 3 files changed, 134 insertions(+) diff --git a/src/modules/admin/controllers/order.controller.ts b/src/modules/admin/controllers/order.controller.ts index 1696746..0cec324 100644 --- a/src/modules/admin/controllers/order.controller.ts +++ b/src/modules/admin/controllers/order.controller.ts @@ -43,6 +43,16 @@ export class AdminOrderController extends BaseController { return this.response({ pager, returnsOrders: data.returnsOrders }); } + @ApiOperation("get detail of order that returned ==> login as admin") + @ApiResponse("successful", HttpStatus.Ok) + @ApiParam("returnOrderId", "id of return order", true) + @ApiAuth() + @httpGet("/returns/:returnOrderId", Guard.authAdmin(), ValidationMiddleware.validateQuery(PaginationDTO)) + public async getReturnOrder(@requestParam("returnOrderId") returnOrderId: string) { + const returnOrder = await this.returnService.getReturnOrderDetail(returnOrderId); + return this.response({ returnOrder }); + } + @ApiOperation("approve a return order request with return order id") @ApiResponse("successful", HttpStatus.Ok) @ApiParam("returnOrderId", "id of return order", true) diff --git a/src/modules/return/return.repository.ts b/src/modules/return/return.repository.ts index 3b79b34..d58bd3f 100644 --- a/src/modules/return/return.repository.ts +++ b/src/modules/return/return.repository.ts @@ -171,6 +171,124 @@ export class ReturnOrderRepo extends BaseRepository { }; } + async getReturnOrderDetail(returnOrderId: string) { + const [returnOrder] = await this.model.aggregate([ + { + $match: { + _id: new Types.ObjectId(returnOrderId), + }, + }, + // 1) lookup order + { + $lookup: { + from: "orders", + localField: "order", + foreignField: "_id", + as: "order", + }, + }, + { $unwind: { path: "$order", preserveNullAndEmptyArrays: true } }, + + // 2) lookup return order items + { + $lookup: { + from: "returnorderitems", + localField: "_id", + foreignField: "returnOrderId", + as: "returnOrderItems", + }, + }, + { $unwind: { path: "$returnOrderItems", preserveNullAndEmptyArrays: true } }, + + // 3) lookup return reason + { + $lookup: { + from: "returnreasons", + localField: "returnOrderItems.reason", + foreignField: "_id", + as: "returnOrderItems.reason", + }, + }, + { + $unwind: { + path: "$returnOrderItems.reason", + preserveNullAndEmptyArrays: true, + }, + }, + + // 4) lookup orderItem (the original order item) + { + $lookup: { + from: "orderitems", + localField: "returnOrderItems.orderItem", + foreignField: "_id", + as: "orderItem", + }, + }, + { $unwind: { path: "$orderItem", preserveNullAndEmptyArrays: true } }, + + // ✅ 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 isn’t numeric + as: "returnOrderItems.shipmentItem.product", + }, + }, + { + $unwind: { + path: "$returnOrderItems.shipmentItem.product", + preserveNullAndEmptyArrays: true, + }, + }, + // 7) lookup shop + { + $lookup: { + from: "shops", + localField: "orderItem.shop", + foreignField: "_id", + as: "shop", + }, + }, + { $unwind: { path: "$shop", preserveNullAndEmptyArrays: true } }, + { $addFields: { shopName: "$shop.shopName" } }, + + // 8) regroup all return items per return order + { + $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" }, + }, + }, + ]); + + return returnOrder; + } + async getAllReturnsForUser(userId: string) { const docs = await this.model.aggregate([ { diff --git a/src/modules/return/return.service.ts b/src/modules/return/return.service.ts index 28d359e..4a595fb 100644 --- a/src/modules/return/return.service.ts +++ b/src/modules/return/return.service.ts @@ -37,6 +37,12 @@ class ReturnService { returnOrders, }; } + //####################################################### + + async getReturnOrderDetail(returnOrderId: string) { + const returnOrder = await this.returnOrderRepo.getReturnOrderDetail(returnOrderId); + return returnOrder; + } //####################################################### async getAllReturnOrders(queryDto: PaginationDTO) {