This commit is contained in:
Калугин Олег Александрович
2025-12-18 09:39:18 +00:00
parent 540fcca315
commit 21b40be946
3 changed files with 584 additions and 35 deletions

206
postgres.js Normal file
View File

@@ -0,0 +1,206 @@
const { Pool } = require('pg');
require('dotenv').config();
const { initializeDatabase } = require('./postgres-init');
class PostgresLogger {
constructor() {
this.pool = null;
this.initialized = false;
this.init();
}
async init() {
try {
console.log('🔌 Инициализация PostgreSQL логгера...');
// Проверяем наличие переменных окружения
if (!process.env.DB_HOST || !process.env.DB_USER || !process.env.DB_PASSWORD) {
console.log('⚠️ Переменные окружения для PostgreSQL не заданы');
console.log(' DB_HOST:', process.env.DB_HOST || 'не задано');
console.log(' DB_USER:', process.env.DB_USER || 'не задано');
console.log(' DB_NAME:', process.env.DB_NAME || 'minicrm');
this.initialized = false;
return;
}
// Создаем базу данных если нужно
const dbInitialized = await initializeDatabase();
if (!dbInitialized) {
console.error('❌ Не удалось инициализировать базу данных');
this.initialized = false;
return;
}
// Подключаемся к созданной БД
this.pool = new Pool({
host: process.env.DB_HOST,
port: process.env.DB_PORT || 5432,
database: process.env.DB_NAME || 'minicrm',
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
max: 5,
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 5000,
});
// Тестируем подключение
const client = await this.pool.connect();
await client.query('SELECT 1');
client.release();
this.initialized = true;
console.log('✅ PostgreSQL логгер готов к работе');
} catch (error) {
console.error('❌ Ошибка инициализации PostgreSQL логгера:', error.message);
console.error(' Убедитесь, что:');
console.error(' 1. PostgreSQL сервер запущен на', process.env.DB_HOST);
console.error(' 2. Пользователь', process.env.DB_USER, 'имеет права на создание БД');
console.error(' 3. Пароль указан верно в .env файле');
this.initialized = false;
}
}
async logNotification(notificationData) {
if (!this.initialized) {
console.log('⚠️ PostgreSQL не инициализирован, логирование пропущено');
return null;
}
const {
taskId,
taskTitle,
taskDescription = '',
notificationType,
authorId,
authorName,
authorLogin,
recipientId,
recipientName,
recipientLogin,
messageContent,
messageSubject = '',
deliveryMethods = ['email', 'telegram', 'vk'],
comments = ''
} = notificationData;
let client;
try {
client = await this.pool.connect();
const query = `
INSERT INTO sms_logs (
task_id, task_title, task_description, notification_type,
creator_id, creator_name, creator_login,
assignee_id, assignee_name, assignee_login,
message_content, message_subject, delivery_methods,
status, comments, created_at
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, CURRENT_TIMESTAMP)
RETURNING id;
`;
const values = [
taskId,
taskTitle?.substring(0, 500) || 'Без названия',
taskDescription?.substring(0, 5000) || '',
notificationType,
authorId,
authorName || 'Неизвестно',
authorLogin || 'unknown',
recipientId,
recipientName || 'Неизвестно',
recipientLogin || 'unknown',
messageContent?.substring(0, 5000) || '',
messageSubject?.substring(0, 500) || '',
JSON.stringify(deliveryMethods),
'pending',
comments
];
const result = await client.query(query, values);
const logId = result.rows[0]?.id;
if (logId) {
console.log(`📝 Уведомление записано в PostgreSQL, ID: ${logId}`);
}
return logId || null;
} catch (error) {
console.error('❌ Ошибка записи уведомления в PostgreSQL:', error.message);
return null;
} finally {
if (client) client.release();
}
}
async updateNotificationStatus(logId, status, errorMessage = null, sentAt = null) {
if (!this.initialized || !logId) return;
let client;
try {
client = await this.pool.connect();
const query = `
UPDATE sms_logs
SET status = $1,
error_message = $2,
sent_at = $3,
updated_at = CURRENT_TIMESTAMP
WHERE id = $4;
`;
await client.query(query, [
status,
errorMessage,
sentAt ? new Date(sentAt) : (status === 'sent' ? new Date() : null),
logId
]);
console.log(`📝 Статус уведомления ${logId} обновлен на: ${status}`);
} catch (error) {
console.error('❌ Ошибка обновления статуса уведомления:', error.message);
} finally {
if (client) client.release();
}
}
async healthCheck() {
if (!this.initialized) {
return {
connected: false,
error: 'PostgreSQL не инициализирован',
timestamp: new Date().toISOString()
};
}
let client;
try {
client = await this.pool.connect();
await client.query('SELECT 1');
return {
connected: true,
timestamp: new Date().toISOString(),
database: process.env.DB_NAME || 'minicrm',
host: process.env.DB_HOST
};
} catch (error) {
return {
connected: false,
error: error.message,
timestamp: new Date().toISOString()
};
} finally {
if (client) client.release();
}
}
// Другие методы остаются без изменений...
}
// Экспортируем singleton
const postgresLogger = new PostgresLogger();
module.exports = postgresLogger;