import { Types } from "mongoose"; import { BaseRepository } from "../../../common/base/repository"; import { SellerFinesQueries } from "../../../common/types/query.type"; import { IFine } from "../models/Abstraction/IFine"; import { FineModel } from "../models/fine.model"; export class FineRepo extends BaseRepository { constructor() { super(FineModel); } async findAllBySeller(sellerId: string, queries: SellerFinesQueries) { const page = queries.page || 1; const limit = queries.limit || 10; const skip = (page - 1) * limit; const docs = await this.model.aggregate([ { $match: { seller: new Types.ObjectId(sellerId), }, }, { $lookup: { from: "finerules", localField: "fine_rule", foreignField: "_id", as: "fineRuleDetails", }, }, { $unwind: "$fineRuleDetails", }, { $addFields: { sellerDetails: { $arrayElemAt: ["$sellerDetails", 0] }, }, }, { $lookup: { from: "cancelreasons", localField: "reason", foreignField: "_id", as: "cancelReasonDetails", }, }, { $addFields: { cancelReasonDetails: { $ifNull: ["$cancelReasonDetails", []] }, }, }, { $lookup: { from: "returnreasons", localField: "reason", foreignField: "_id", as: "returnReasonDetails", }, }, { $addFields: { returnReasonDetails: { $ifNull: ["$returnReasonDetails", []] }, }, }, { $addFields: { reasonDetails: { $cond: { if: { $eq: ["$reasonRef", "Cancel"] }, then: { $arrayElemAt: ["$cancelReasonDetails", 0] }, else: { $arrayElemAt: ["$returnReasonDetails", 0] }, }, }, }, }, { $unset: ["cancelReasonDetails", "returnReasonDetails"], }, { $lookup: { from: "cancelorderitems", localField: "orderItem", foreignField: "_id", as: "cancelOrderItemDetails", }, }, { $addFields: { cancelOrderItemDetails: { $ifNull: ["$cancelOrderItemDetails", []] }, }, }, { $lookup: { from: "returnorderitems", localField: "orderItem", foreignField: "_id", as: "returnOrderItemDetails", }, }, { $addFields: { returnOrderItemDetails: { $ifNull: ["$returnOrderItemDetails", []] }, }, }, { $addFields: { orderItemsDetails: { $cond: { if: { $eq: ["$orderItemRef", "CancelOrderItem"] }, then: { $arrayElemAt: ["$cancelOrderItemDetails", 0] }, else: { $arrayElemAt: ["$returnOrderItemDetails", 0] }, }, }, }, }, { $unset: ["cancelOrderItemDetails", "returnOrderItemDetails"], }, { $lookup: { from: "orderitems", localField: "orderItemsDetails.orderItem", foreignField: "_id", as: "orderItemsDetails.orderItem", }, }, { $unwind: "$orderItemsDetails.orderItem", }, { $addFields: { shipmentItem: { $arrayElemAt: ["$orderItemsDetails.orderItem.shipmentItems", 0], }, }, }, { $lookup: { from: "products", localField: "shipmentItem.product", foreignField: "_id", as: "product", }, }, { $addFields: { product: { $arrayElemAt: ["$product", 0] }, }, }, { $facet: { data: [{ $skip: skip }, { $limit: limit }], totalCount: [{ $count: "count" }], }, }, { $addFields: { totalCount: { $arrayElemAt: ["$totalCount.count", 0] }, }, }, { $sort: { createdAt: -1, }, }, ]); console.dir(docs[0], { depth: null }); return { count: (docs[0]?.totalCount as number) || 0, docs: docs[0]?.data || [], }; } async findAllForAdmin(queries: SellerFinesQueries) { const page = queries.page || 1; const limit = queries.limit || 10; const skip = (page - 1) * limit; const docs = await this.model.aggregate([ { $lookup: { from: "finerules", localField: "fine_rule", foreignField: "_id", as: "fineRuleDetails", }, }, { $unwind: "$fineRuleDetails", }, { $addFields: { sellerDetails: { $arrayElemAt: ["$sellerDetails", 0] }, }, }, { $lookup: { from: "cancelreasons", localField: "reason", foreignField: "_id", as: "cancelReasonDetails", }, }, { $addFields: { cancelReasonDetails: { $ifNull: ["$cancelReasonDetails", []] }, }, }, { $lookup: { from: "returnreasons", localField: "reason", foreignField: "_id", as: "returnReasonDetails", }, }, { $addFields: { returnReasonDetails: { $ifNull: ["$returnReasonDetails", []] }, }, }, { $addFields: { reasonDetails: { $cond: { if: { $eq: ["$reasonRef", "Cancel"] }, then: { $arrayElemAt: ["$cancelReasonDetails", 0] }, else: { $arrayElemAt: ["$returnReasonDetails", 0] }, }, }, }, }, { $unset: ["cancelReasonDetails", "returnReasonDetails"], }, { $lookup: { from: "cancelorderitems", localField: "orderItem", foreignField: "_id", as: "cancelOrderItemDetails", }, }, { $addFields: { cancelOrderItemDetails: { $ifNull: ["$cancelOrderItemDetails", []] }, }, }, { $lookup: { from: "returnorderitems", localField: "orderItem", foreignField: "_id", as: "returnOrderItemDetails", }, }, { $addFields: { returnOrderItemDetails: { $ifNull: ["$returnOrderItemDetails", []] }, }, }, { $addFields: { orderItemsDetails: { $cond: { if: { $eq: ["$orderItemRef", "CancelOrderItem"] }, then: { $arrayElemAt: ["$cancelOrderItemDetails", 0] }, else: { $arrayElemAt: ["$returnOrderItemDetails", 0] }, }, }, }, }, { $unset: ["cancelOrderItemDetails", "returnOrderItemDetails"], }, { $lookup: { from: "orderitems", localField: "orderItemsDetails.orderItem", foreignField: "_id", as: "orderItemsDetails.orderItem", }, }, { $unwind: "$orderItemsDetails.orderItem", }, { $addFields: { shipmentItem: { $arrayElemAt: ["$orderItemsDetails.orderItem.shipmentItems", 0], }, }, }, { $lookup: { from: "products", localField: "shipmentItem.product", foreignField: "_id", as: "product", }, }, { $addFields: { product: { $arrayElemAt: ["$product", 0] }, }, }, { $facet: { data: [{ $skip: skip }, { $limit: limit }], totalCount: [{ $count: "count" }], }, }, { $addFields: { totalCount: { $arrayElemAt: ["$totalCount.count", 0] }, }, }, { $sort: { createdAt: -1, }, }, ]); console.dir(docs[0], { depth: null }); return { count: (docs[0]?.totalCount as number) || 0, docs: docs[0]?.data || [], }; } } export function createFineRepo(): FineRepo { return new FineRepo(); }