diff --git a/src/server.ts b/src/server.ts index fe11e72..ed5f774 100644 --- a/src/server.ts +++ b/src/server.ts @@ -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(); diff --git a/src/workers/ordersModerationService.ts b/src/workers/ordersModerationService.ts new file mode 100644 index 0000000..d619c56 --- /dev/null +++ b/src/workers/ordersModerationService.ts @@ -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;