Files
2024-09-23 16:54:02 +03:00

145 lines
4.6 KiB
JavaScript

const express = require("express");
const router = express.Router();
const Transaction = require("../models/Transaction");
const axios = require('axios');
const { authenticateToken } = require("./middleware");
const BuyOrder = require("../models/BuyOrder");
const { nodeUrl } = require("../utils");
router.post("/updatetx", authenticateToken, async (req, res) => {
try {
const { qortalAtAddresses, qortAddress, node, status, message = '', encryptedMessageToBase58 = undefined, chatSignature = '', sender = '', senderPublicKey = '', reference = ''} = req.body;
const authId = req.user.id;
// Check if the authenticated user is authorized
if(authId !== qortAddress) {
res.status(500).json({
errors: [
{ msg: "Not authorized" },
],
});
return;
}
try {
// If there is an encrypted message, create a buy order
if(encryptedMessageToBase58) {
const buyOrder = new BuyOrder({
data: encryptedMessageToBase58,
recipient: "QXPejUe5Za1KD3zCMViWCX35AreMQ9H7ku",
sender,
signature: chatSignature,
senderPublicKey,
isEncrypted: true,
reference
});
await buyOrder.save();
}
// Iterate through each qortalAtAddress and update transaction
for (const qortalAtAddress of qortalAtAddresses) {
const transaction = await Transaction.findOne({ qortalAtAddress, qortAddress });
if(transaction && transaction?.status === 'trade-ongoing') {
continue; // Skip if the transaction is already ongoing
}
// Update or create a new transaction for each address
await Transaction.findOneAndUpdate(
{ qortalAtAddress, qortAddress },
{ qortalAtAddress, qortAddress, node, status, message },
{ new: true, upsert: true, runValidators: true }
);
}
res.json(true); // Return success after processing all addresses
} catch (error) {
return res.status(500).json({ error: error.message });
}
} catch (err) {
console.error(err.message);
}
});
// Define the GET endpoint with query parameters
router.get('/fetch-qortAddress', authenticateToken, async (req, res) => {
try {
const authId = req.user.id
const { qortAddress } = req.query;
if(authId !== qortAddress){
res.status(500).json({
errors: [
{ msg: "Not authorized" },
],
});
return
}
// Validate the qortAddress parameter
if (!qortAddress) {
return res.status(400).json({ error: 'qortAddress query parameter is required' });
}
const fortyMinutesAgo = new Date(Date.now() - 22 * 60 * 1000);
// Fetch the transactions created in the last 15 minutes, sorted newest to oldest, filtering by qortAddress
const transactions = await Transaction.find({
updatedAt: { $gte: fortyMinutesAgo },
qortAddress: qortAddress
})
.sort({ createdAt: -1 })
.exec();
// Placeholder for async action to get more data for each qortAddress
const fetchTradeInfo = async (qortalAtAddress) => {
// Replace with your async action
const checkIfOfferingRes = await axios.get(
`${nodeUrl}/crosschain/trade/${qortalAtAddress}`
);
const data = checkIfOfferingRes.data
return data
};
const results = [];
for (const transaction of transactions) {
const tradeData = await fetchTradeInfo(transaction.qortalAtAddress);
if(tradeData.qortalPartnerReceivingAddress && tradeData.qortalPartnerReceivingAddress !== qortAddress) continue
let newStatus = transaction.status
if(tradeData.qortalPartnerReceivingAddress && tradeData.qortalPartnerReceivingAddress === qortAddress){
newStatus = tradeData.mode.toLowerCase()
}
results.push({...transaction.toJSON(), tradeInfo: tradeData, status: newStatus});
}
res.json(results);
} catch (error) {
res.status(500).send(error.message);
}
});
router.get('/buyorders/recent', async (req, res) => {
try {
const { secretKey } = req.query;
if(secretKey !== process.env.SECRET_KEY_ENDPOINT){
res.json([])
return
}
const thirtyMinutesAgo = new Date(Date.now() - 60 * 60 * 1000);
const recentBuyOrders = await BuyOrder.find({
createdAt: { $gte: thirtyMinutesAgo }
});
res.json(recentBuyOrders);
} catch (err) {
console.error('Error fetching recent buy orders:', err);
res.status(500).json({ message: 'Internal server error' });
}
});
module.exports = router;