From b434df58548c2bfc00196a5cd285da4e52fa457b Mon Sep 17 00:00:00 2001 From: MohammadHMazarei Date: Thu, 17 Apr 2025 13:36:04 +0330 Subject: [PATCH] ADD & UPDATE: BelongingInventory and create Transaction handler --- components/transaction/transactionService.js | 99 +++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) diff --git a/components/transaction/transactionService.js b/components/transaction/transactionService.js index 6c23c96..e44b6b9 100644 --- a/components/transaction/transactionService.js +++ b/components/transaction/transactionService.js @@ -1,9 +1,34 @@ const Transaction = require('./transactionModel') +const Belonging = require('../belonging/belongingModel') const AppError = require('../../globalErrorHandler/AppError') +const mongoose = require('mongoose') +const ObjectID = mongoose.Schema.Types.ObjectId const { client } = require('../../setup/typesense') const TsApiFeatures = require('../../utils/TsApiFeatures') const createTransaction = async (data) => { + if (data.type == 'withdraw') { + // Aggregate transactions to calculate inventory + const result = await Transaction.aggregate([ + { + $match: { + belongingId: ObjectID, + status: 'finished', + }, + }, + { + $group: { + _id: '$belongingId', + totalInventory: { + $sum: '$value', + }, + }, + }, + ]) + + if (result[0].totalInventory <= 0) throw new AppError('Invalid Transaction', 404, {}) + } + return Transaction.create({ type: data.type, status: data.status, @@ -20,4 +45,76 @@ const getUserTransaction = async (userId) => { return Transaction.find({ userId }, null, null) } -module.exports = { createTransaction, getUserTransaction } +const getBelongingInventory = async (belongingId) => { + const belonging = await Belonging.findById(belongingId, null, null) + + if (!belonging) { + throw new AppError('NoBelongingFound', 404, {}) + } + + // Simplified aggregation to calculate inventory metrics + const result = await Transaction.aggregate([ + { + $match: { + belongingId: ObjectID, + $or: [{ status: 'finished' }, { status: 'pending' }], + }, + }, + { + $facet: { + // Calculate total inventory from finished transactions + finishedInventory: [ + { $match: { status: 'finished' } }, + { + $group: { + _id: null, + total: { $sum: '$value' }, + }, + }, + ], + // Calculate pending deposits + pendingDepositsInventory: [ + { + $match: { + status: 'pending', + type: 'deposit', + }, + }, + { + $group: { + _id: null, + total: { $sum: '$value' }, + }, + }, + ], + // Calculate pending withdrawals + pendingWithdrawsInventory: [ + { + $match: { + status: 'pending', + type: 'withdraw', + }, + }, + { + $group: { + _id: null, + total: { $sum: '$value' }, + }, + }, + ], + }, + }, + { + // Restructure the output to get only the values + $project: { + finishedInventory: { $ifNull: [{ $arrayElemAt: ['$finishedInventory.total', 0] }, 0] }, + pendingDepositsInventory: { $ifNull: [{ $arrayElemAt: ['$pendingDepositsInventory.total', 0] }, 0] }, + pendingWithdrawsInventory: { $ifNull: [{ $arrayElemAt: ['$pendingWithdrawsInventory.total', 0] }, 0] }, + }, + }, + ]) + + return { belongingCode: belonging.belongingCode, ...result[0] } +} + +module.exports = { createTransaction, getUserTransaction, getBelongingInventory }