87 lines
3.1 KiB
JavaScript
87 lines
3.1 KiB
JavaScript
const { Pool } = require('pg');
|
|
require('dotenv').config();
|
|
|
|
const pool = new Pool({
|
|
host: process.env.DB_HOST,
|
|
port: parseInt(process.env.DB_PORT || '5432'),
|
|
database: process.env.DB_NAME,
|
|
user: process.env.DB_USERNAME,
|
|
password: process.env.DB_PASSWORD
|
|
});
|
|
|
|
async function createProfileViewsTable() {
|
|
const client = await pool.connect();
|
|
try {
|
|
console.log('Creating profile_views table...');
|
|
await client.query('BEGIN');
|
|
|
|
// Включаем расширение uuid-ossp, если оно еще не включено
|
|
await client.query(`CREATE EXTENSION IF NOT EXISTS "uuid-ossp"`);
|
|
|
|
// Создаем таблицу profile_views, если она не существует
|
|
await client.query(`
|
|
CREATE TABLE IF NOT EXISTS profile_views (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
viewer_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
viewed_profile_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
view_date TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
view_type VARCHAR(20) NOT NULL DEFAULT 'browse'
|
|
)
|
|
`);
|
|
|
|
// Создаем уникальный индекс для пары (просмотревший - просмотренный)
|
|
await client.query(`
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM pg_indexes
|
|
WHERE indexname = 'profile_views_viewer_viewed_idx'
|
|
) THEN
|
|
CREATE UNIQUE INDEX profile_views_viewer_viewed_idx
|
|
ON profile_views (viewer_id, viewed_profile_id);
|
|
END IF;
|
|
END $$;
|
|
`);
|
|
|
|
// Создаем индекс для быстрого поиска по viewer_id
|
|
await client.query(`
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM pg_indexes
|
|
WHERE indexname = 'profile_views_viewer_idx'
|
|
) THEN
|
|
CREATE INDEX profile_views_viewer_idx
|
|
ON profile_views (viewer_id);
|
|
END IF;
|
|
END $$;
|
|
`);
|
|
|
|
// Создаем индекс для быстрого поиска по viewed_profile_id
|
|
await client.query(`
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM pg_indexes
|
|
WHERE indexname = 'profile_views_viewed_idx'
|
|
) THEN
|
|
CREATE INDEX profile_views_viewed_idx
|
|
ON profile_views (viewed_profile_id);
|
|
END IF;
|
|
END $$;
|
|
`);
|
|
|
|
await client.query('COMMIT');
|
|
console.log('Table profile_views created successfully');
|
|
} catch (e) {
|
|
await client.query('ROLLBACK');
|
|
console.error('Error creating table:', e);
|
|
} finally {
|
|
client.release();
|
|
await pool.end();
|
|
}
|
|
}
|
|
|
|
// Запускаем функцию создания таблицы
|
|
createProfileViewsTable();
|