Fix JSON format issues with photos and add multi-photo gallery support

This commit is contained in:
2025-09-18 10:38:29 +09:00
parent bdd7d0424f
commit e275a9856b
13 changed files with 953 additions and 77 deletions

174
init-notifications-db.js Normal file
View File

@@ -0,0 +1,174 @@
require('dotenv').config();
const { Pool } = require('pg');
const { v4: uuidv4 } = require('uuid');
// Функция для запуска скрипта
async function initializeDatabase() {
console.log('Starting database initialization script...');
const pool = new Pool({
host: 'localhost', // Используем localhost
port: 5432, // Используем стандартный порт 5432
database: 'telegram_tinder_bot',
user: 'postgres',
password: '',
max: 5,
connectionTimeoutMillis: 5000
});
console.log('DB Connection Details:');
console.log('- Host: localhost');
console.log('- Port: 5432');
console.log('- Database: telegram_tinder_bot');
console.log('- User: postgres');
try {
// Проверяем подключение
console.log('Testing connection...');
const client = await pool.connect();
try {
console.log('✅ Connected to database successfully!');
// 1. Создаем расширение для генерации UUID если его нет
console.log('Creating UUID extension...');
await client.query(`CREATE EXTENSION IF NOT EXISTS "uuid-ossp"`);
// 2. Создаем таблицу для шаблонов уведомлений
console.log('Creating notification_templates table...');
await client.query(`
CREATE TABLE IF NOT EXISTS notification_templates (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
type VARCHAR(50) NOT NULL UNIQUE,
title TEXT NOT NULL,
message_template TEXT NOT NULL,
button_template JSONB NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
)
`);
// 3. Вставляем базовые шаблоны
console.log('Inserting notification templates...');
const templates = [
{
id: uuidv4(),
type: 'new_like',
title: 'Новый лайк!',
message_template: '❤️ *{{name}}* поставил(а) вам лайк!\n\nВозраст: {{age}}\n{{city}}\n\nОтветьте взаимностью или посмотрите профиль.',
button_template: JSON.stringify({
inline_keyboard: [
[{ text: '👀 Посмотреть профиль', callback_data: 'view_profile:{{userId}}' }],
[
{ text: '❤️ Лайк в ответ', callback_data: 'like_back:{{userId}}' },
{ text: '⛔️ Пропустить', callback_data: 'dislike_profile:{{userId}}' }
],
[{ text: '💕 Открыть все лайки', callback_data: 'view_likes' }]
]
})
},
{
id: uuidv4(),
type: 'super_like',
title: 'Супер-лайк!',
message_template: '⭐️ *{{name}}* отправил(а) вам супер-лайк!\n\nВозраст: {{age}}\n{{city}}\n\nВы произвели особое впечатление! Ответьте взаимностью или посмотрите профиль.',
button_template: JSON.stringify({
inline_keyboard: [
[{ text: '👀 Посмотреть профиль', callback_data: 'view_profile:{{userId}}' }],
[
{ text: '❤️ Лайк в ответ', callback_data: 'like_back:{{userId}}' },
{ text: '⛔️ Пропустить', callback_data: 'dislike_profile:{{userId}}' }
],
[{ text: '💕 Открыть все лайки', callback_data: 'view_likes' }]
]
})
},
{
id: uuidv4(),
type: 'new_match',
title: 'Новый матч!',
message_template: '🎊 *Ура! Это взаимно!* 🎊\n\nВы и *{{name}}* понравились друг другу!\nВозраст: {{age}}\n{{city}}\n\nСделайте первый шаг - напишите сообщение!',
button_template: JSON.stringify({
inline_keyboard: [
[{ text: '💬 Начать общение', callback_data: 'open_native_chat_{{matchId}}' }],
[
{ text: '👀 Посмотреть профиль', callback_data: 'view_profile:{{userId}}' },
{ text: '📋 Все матчи', callback_data: 'native_chats' }
]
]
})
},
{
id: uuidv4(),
type: 'new_message',
title: 'Новое сообщение!',
message_template: '💌 *Новое сообщение!*\n\nОт: *{{name}}*\n\n"{{message}}"\n\nОтветьте на сообщение прямо сейчас!',
button_template: JSON.stringify({
inline_keyboard: [
[{ text: '📩 Ответить', callback_data: 'open_native_chat_{{matchId}}' }],
[
{ text: '👤 Профиль', callback_data: 'view_profile:{{userId}}' },
{ text: '📋 Все чаты', callback_data: 'native_chats' }
]
]
})
}
];
// Вставляем шаблоны с проверкой на конфликты
for (const template of templates) {
await client.query(`
INSERT INTO notification_templates
(id, type, title, message_template, button_template, created_at)
VALUES ($1, $2, $3, $4, $5, NOW())
ON CONFLICT (type) DO UPDATE
SET title = $3,
message_template = $4,
button_template = $5
`, [template.id, template.type, template.title, template.message_template, template.button_template]);
}
console.log('✅ Notification templates created/updated successfully');
// 4. Создаем таблицу для хранения логов уведомлений если её нет
console.log('Creating notifications table...');
await client.query(`
CREATE TABLE IF NOT EXISTS notifications (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL,
type VARCHAR(50) NOT NULL,
data JSONB NOT NULL,
is_read BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
)
`);
console.log('✅ Notifications table created successfully');
// 5. Проверяем, что таблицы созданы
const tablesResult = await client.query(`
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name IN ('notification_templates', 'notifications')
`);
console.log('Created tables:');
tablesResult.rows.forEach(row => {
console.log(`- ${row.table_name}`);
});
} finally {
client.release();
await pool.end();
}
console.log('✅ Database initialization completed successfully');
} catch (error) {
console.error('❌ Database initialization error:', error);
}
}
// Запускаем скрипт
initializeDatabase();