add orders expiration

This commit is contained in:
jejolare 2026-01-31 19:49:30 +07:00
parent b508b6c99a
commit 5dd89ed9b4
2 changed files with 53 additions and 0 deletions

View file

@ -24,6 +24,7 @@ import statsRouter from './routes/stats.router';
import exchangeModel from './models/ExchangeTransactions';
import { setupAssociations } from './schemes/Associations';
import statsModel from './models/Stats';
import ordersModerationService from './workers/ordersModerationService';
const PORT = process.env.PORT || 3000;
@ -71,6 +72,7 @@ process.on('unhandledRejection', (reason, promise) => {
}
assetsUpdateChecker.run();
ordersModerationService.run();
exchangeModel.runPairStatsDaemon();
statsModel.init();

View file

@ -0,0 +1,51 @@
import Order from '@/schemes/Order';
import { Op } from 'sequelize';
const CHECKING_INTERVAL = 60 * 60 * 1000; // 1 hr
const ORDER_EXPIRATION_TIME = 30 * 24 * 60 * 60 * 1000; // 30 days
class OrdersModerationService {
public async run() {
/* eslint-disable no-constant-condition */
while (true) {
await this.handleOrdersExpirations();
console.log(
`[${new Date()}] Orders moderation check is done. Next check in ${CHECKING_INTERVAL / 1000} sec.`,
);
await new Promise((resolve) => setTimeout(resolve, CHECKING_INTERVAL));
}
/* eslint-enable no-constant-condition */
}
private async handleOrdersExpirations() {
const now = +Date.now();
const ordersToExpire = await Order.findAll({
where: {
updatedAt: {
[Op.lte]: new Date(now - ORDER_EXPIRATION_TIME),
},
status: 'active',
},
});
const idsToExpire = ordersToExpire.map((order) => order.id);
await Order.destroy({
where: {
id: idsToExpire,
},
});
if (idsToExpire.length > 0) {
console.log(
`[${new Date()}] Expired orders handled. Expired orders IDs: ${idsToExpire.join(', ')}`,
);
}
}
}
const ordersModerationService = new OrdersModerationService();
export default ordersModerationService;