Files
shop-api/src/modules/fine/repository/fine.repository.ts
T
mahyargdz be82059172 first
2025-09-14 15:15:03 +03:30

336 lines
8.0 KiB
TypeScript

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<IFine> {
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();
}