83 lines
2.8 KiB
JavaScript
83 lines
2.8 KiB
JavaScript
import dotenv from 'dotenv';
|
||
dotenv.config();
|
||
import express from 'express';
|
||
import { sequelize } from './models/index.js';
|
||
import routes from './routes/index.js';
|
||
import { processScheduledCampaigns } from './service/queueFillerJob.js';
|
||
import { dynamicConsumer } from './service/dynamicConsumer.js';
|
||
import { topicManager } from './service/topicManager.js';
|
||
import { topicRegistry } from './service/topicRegistry.js';
|
||
import authMiddleware from './middleware/auth.js';
|
||
|
||
const app = express();
|
||
app.use(express.json());
|
||
|
||
// Middleware
|
||
app.use('/api/mail', authMiddleware);
|
||
|
||
// Routes
|
||
app.use('/api/mail', routes);
|
||
|
||
const PORT = process.env.PORT || 3000;
|
||
|
||
(async () => {
|
||
try {
|
||
await sequelize.authenticate();
|
||
// Отключаем автоматическую синхронизацию, так как есть проблемы с ключами
|
||
await sequelize.sync({ alter: true });
|
||
console.log('Database connected');
|
||
} catch (err) {
|
||
console.error('Unable to connect to the database:', err);
|
||
process.exit(1);
|
||
}
|
||
})();
|
||
|
||
let isQueueFilling = false;
|
||
|
||
// Периодически заполняем очередь для scheduled кампаний
|
||
setInterval(async () => {
|
||
if (isQueueFilling) return;
|
||
isQueueFilling = true;
|
||
try {
|
||
await processScheduledCampaigns();
|
||
} catch (err) {
|
||
console.error('Queue fill error:', err);
|
||
} finally {
|
||
isQueueFilling = false;
|
||
}
|
||
}, 1000);
|
||
|
||
// Запускаем динамический consumer и инициализируем реестр
|
||
(async () => {
|
||
try {
|
||
await dynamicConsumer.connect();
|
||
|
||
// Синхронизируем реестр с существующими топиками
|
||
await topicManager.syncRegistry();
|
||
|
||
// Очищаем старые топики перед началом работы
|
||
console.log('[index] Clearing old topics...');
|
||
await topicManager.clearTopics('mail-send-');
|
||
|
||
// Подписываемся на существующие топики
|
||
const existingTopics = await topicManager.getAllTopics();
|
||
if (existingTopics.length > 0) {
|
||
console.log(`[index] Found ${existingTopics.length} existing topics:`, existingTopics);
|
||
await dynamicConsumer.subscribeToTopics(existingTopics);
|
||
}
|
||
|
||
// Периодически проверяем новые топики и синхронизируем реестр
|
||
setInterval(async () => {
|
||
await dynamicConsumer.autoSubscribeToNewTopics();
|
||
await topicManager.syncRegistry();
|
||
}, 5000); // Проверяем каждые 5 секунд
|
||
|
||
console.log('[index] Dynamic consumer started with registry synchronization');
|
||
} catch (err) {
|
||
console.error('Dynamic consumer error:', err);
|
||
}
|
||
})();
|
||
|
||
app.listen(PORT, () => {
|
||
console.log(`Mail service running on port ${PORT}`);
|
||
});
|