mainly functional matching
This commit is contained in:
66
scripts/checkDatabase.js
Normal file
66
scripts/checkDatabase.js
Normal file
@@ -0,0 +1,66 @@
|
||||
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 checkDatabase() {
|
||||
const client = await pool.connect();
|
||||
try {
|
||||
console.log('\n===== ПРОВЕРКА СОСТОЯНИЯ БАЗЫ ДАННЫХ =====');
|
||||
|
||||
// Проверка таблицы users
|
||||
const usersResult = await client.query('SELECT COUNT(*) as count FROM users');
|
||||
console.log(`Пользователей в БД: ${usersResult.rows[0].count}`);
|
||||
if (parseInt(usersResult.rows[0].count) > 0) {
|
||||
const users = await client.query('SELECT id, telegram_id, username, first_name FROM users LIMIT 10');
|
||||
console.log('Последние пользователи:');
|
||||
users.rows.forEach(user => {
|
||||
console.log(` - ID: ${user.id.substring(0, 8)}... | Telegram: ${user.telegram_id} | Имя: ${user.first_name || user.username}`);
|
||||
});
|
||||
}
|
||||
|
||||
// Проверка таблицы profiles
|
||||
const profilesResult = await client.query('SELECT COUNT(*) as count FROM profiles');
|
||||
console.log(`\nПрофилей в БД: ${profilesResult.rows[0].count}`);
|
||||
if (parseInt(profilesResult.rows[0].count) > 0) {
|
||||
const profiles = await client.query(`
|
||||
SELECT p.id, p.user_id, p.name, p.age, p.gender, p.interested_in, p.is_visible
|
||||
FROM profiles p
|
||||
ORDER BY p.created_at DESC
|
||||
LIMIT 10
|
||||
`);
|
||||
console.log('Последние профили:');
|
||||
profiles.rows.forEach(profile => {
|
||||
console.log(` - ID: ${profile.id.substring(0, 8)}... | UserID: ${profile.user_id.substring(0, 8)}... | Имя: ${profile.name} | Возраст: ${profile.age} | Пол: ${profile.gender} | Интересы: ${profile.interested_in} | Виден: ${profile.is_visible}`);
|
||||
});
|
||||
}
|
||||
|
||||
// Проверка таблицы swipes
|
||||
const swipesResult = await client.query('SELECT COUNT(*) as count FROM swipes');
|
||||
console.log(`\nСвайпов в БД: ${swipesResult.rows[0].count}`);
|
||||
|
||||
// Проверка таблицы profile_views
|
||||
const viewsResult = await client.query('SELECT COUNT(*) as count FROM profile_views');
|
||||
console.log(`Просмотров профилей в БД: ${viewsResult.rows[0].count}`);
|
||||
|
||||
// Проверка таблицы matches
|
||||
const matchesResult = await client.query('SELECT COUNT(*) as count FROM matches');
|
||||
console.log(`Матчей в БД: ${matchesResult.rows[0].count}`);
|
||||
|
||||
console.log('\n===== ПРОВЕРКА ЗАВЕРШЕНА =====\n');
|
||||
} catch (e) {
|
||||
console.error('Ошибка при проверке базы данных:', e);
|
||||
} finally {
|
||||
client.release();
|
||||
await pool.end();
|
||||
}
|
||||
}
|
||||
|
||||
// Запускаем проверку
|
||||
checkDatabase();
|
||||
64
scripts/checkProfileViews.js
Normal file
64
scripts/checkProfileViews.js
Normal file
@@ -0,0 +1,64 @@
|
||||
// Скрипт для проверки таблицы profile_views
|
||||
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 checkProfileViewsTable() {
|
||||
const client = await pool.connect();
|
||||
try {
|
||||
console.log('Проверка таблицы profile_views...');
|
||||
|
||||
// Проверяем наличие таблицы
|
||||
const tableCheck = await client.query(`
|
||||
SELECT EXISTS (
|
||||
SELECT FROM information_schema.tables
|
||||
WHERE table_schema = 'public'
|
||||
AND table_name = 'profile_views'
|
||||
);
|
||||
`);
|
||||
|
||||
const tableExists = tableCheck.rows[0].exists;
|
||||
console.log(`Таблица profile_views ${tableExists ? 'существует' : 'не существует'}`);
|
||||
|
||||
if (tableExists) {
|
||||
// Проверяем количество записей в таблице
|
||||
const countResult = await client.query('SELECT COUNT(*) FROM profile_views');
|
||||
console.log(`Количество записей в таблице: ${countResult.rows[0].count}`);
|
||||
|
||||
// Получаем данные из таблицы
|
||||
const dataResult = await client.query(`
|
||||
SELECT pv.*,
|
||||
v.telegram_id as viewer_telegram_id,
|
||||
vp.telegram_id as viewed_telegram_id
|
||||
FROM profile_views pv
|
||||
LEFT JOIN users v ON pv.viewer_id = v.id
|
||||
LEFT JOIN users vp ON pv.viewed_profile_id = vp.id
|
||||
LIMIT 10
|
||||
`);
|
||||
|
||||
if (dataResult.rows.length > 0) {
|
||||
console.log('Данные из таблицы profile_views:');
|
||||
dataResult.rows.forEach((row, index) => {
|
||||
console.log(`${index + 1}. Просмотр: ${row.viewer_telegram_id || 'Неизвестно'} → ${row.viewed_telegram_id || 'Неизвестно'}, дата: ${row.view_date}`);
|
||||
});
|
||||
} else {
|
||||
console.log('Таблица profile_views пуста');
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Ошибка при проверке таблицы profile_views:', error);
|
||||
} finally {
|
||||
client.release();
|
||||
await pool.end();
|
||||
}
|
||||
}
|
||||
|
||||
// Запускаем проверку
|
||||
checkProfileViewsTable();
|
||||
55
scripts/cleanDatabase.js
Normal file
55
scripts/cleanDatabase.js
Normal file
@@ -0,0 +1,55 @@
|
||||
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 cleanDatabase() {
|
||||
const client = await pool.connect();
|
||||
try {
|
||||
console.log('Очистка базы данных...');
|
||||
await client.query('BEGIN');
|
||||
|
||||
// Отключаем временно foreign key constraints
|
||||
await client.query('SET CONSTRAINTS ALL DEFERRED');
|
||||
|
||||
// Очищаем таблицы в правильном порядке
|
||||
console.log('Очистка таблицы messages...');
|
||||
await client.query('DELETE FROM messages');
|
||||
|
||||
console.log('Очистка таблицы profile_views...');
|
||||
await client.query('DELETE FROM profile_views');
|
||||
|
||||
console.log('Очистка таблицы matches...');
|
||||
await client.query('DELETE FROM matches');
|
||||
|
||||
console.log('Очистка таблицы swipes...');
|
||||
await client.query('DELETE FROM swipes');
|
||||
|
||||
console.log('Очистка таблицы profiles...');
|
||||
await client.query('DELETE FROM profiles');
|
||||
|
||||
console.log('Очистка таблицы users...');
|
||||
await client.query('DELETE FROM users');
|
||||
|
||||
// Возвращаем foreign key constraints
|
||||
await client.query('SET CONSTRAINTS ALL IMMEDIATE');
|
||||
|
||||
await client.query('COMMIT');
|
||||
console.log('✅ База данных успешно очищена');
|
||||
} catch (e) {
|
||||
await client.query('ROLLBACK');
|
||||
console.error('❌ Ошибка при очистке базы данных:', e);
|
||||
} finally {
|
||||
client.release();
|
||||
await pool.end();
|
||||
}
|
||||
}
|
||||
|
||||
// Запускаем функцию очистки
|
||||
cleanDatabase();
|
||||
66
scripts/clearDatabase.js
Normal file
66
scripts/clearDatabase.js
Normal file
@@ -0,0 +1,66 @@
|
||||
// Скрипт для очистки всех таблиц в базе данных
|
||||
import { Pool } from 'pg';
|
||||
import dotenv from 'dotenv';
|
||||
|
||||
// Загружаем переменные окружения из .env файла
|
||||
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 clearDatabase() {
|
||||
const client = await pool.connect();
|
||||
try {
|
||||
console.log('Начинаем очистку базы данных...');
|
||||
|
||||
// Начинаем транзакцию
|
||||
await client.query('BEGIN');
|
||||
|
||||
// Отключаем внешние ключи на время выполнения (если они используются)
|
||||
// await client.query('SET session_replication_role = \'replica\'');
|
||||
|
||||
// Очистка таблиц в порядке, учитывающем зависимости
|
||||
console.log('Очистка таблицы сообщений...');
|
||||
await client.query('TRUNCATE TABLE messages CASCADE');
|
||||
|
||||
console.log('Очистка таблицы просмотров профилей...');
|
||||
await client.query('TRUNCATE TABLE profile_views CASCADE');
|
||||
|
||||
console.log('Очистка таблицы свайпов...');
|
||||
await client.query('TRUNCATE TABLE swipes CASCADE');
|
||||
|
||||
console.log('Очистка таблицы матчей...');
|
||||
await client.query('TRUNCATE TABLE matches CASCADE');
|
||||
|
||||
console.log('Очистка таблицы профилей...');
|
||||
await client.query('TRUNCATE TABLE profiles CASCADE');
|
||||
|
||||
console.log('Очистка таблицы пользователей...');
|
||||
await client.query('TRUNCATE TABLE users CASCADE');
|
||||
|
||||
// Возвращаем внешние ключи (если они использовались)
|
||||
// await client.query('SET session_replication_role = \'origin\'');
|
||||
|
||||
// Фиксируем транзакцию
|
||||
await client.query('COMMIT');
|
||||
|
||||
console.log('Все таблицы успешно очищены!');
|
||||
} catch (error) {
|
||||
// В случае ошибки откатываем транзакцию
|
||||
await client.query('ROLLBACK');
|
||||
console.error('Произошла ошибка при очистке базы данных:', error);
|
||||
} finally {
|
||||
// Освобождаем клиента
|
||||
client.release();
|
||||
// Закрываем пул соединений
|
||||
await pool.end();
|
||||
}
|
||||
}
|
||||
|
||||
// Запускаем функцию очистки
|
||||
clearDatabase();
|
||||
81
scripts/clearDatabase.mjs
Normal file
81
scripts/clearDatabase.mjs
Normal file
@@ -0,0 +1,81 @@
|
||||
// Скрипт для очистки всех таблиц в базе данных
|
||||
import { Pool } from 'pg';
|
||||
import dotenv from 'dotenv';
|
||||
|
||||
// Загружаем переменные окружения из .env файла
|
||||
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 clearDatabase() {
|
||||
const client = await pool.connect();
|
||||
try {
|
||||
console.log('Начинаем очистку базы данных...');
|
||||
|
||||
// Начинаем транзакцию
|
||||
await client.query('BEGIN');
|
||||
|
||||
// Получаем список существующих таблиц
|
||||
const tablesResult = await client.query(`
|
||||
SELECT table_name
|
||||
FROM information_schema.tables
|
||||
WHERE table_schema = 'public'
|
||||
AND table_type = 'BASE TABLE'
|
||||
`);
|
||||
|
||||
const tables = tablesResult.rows.map(row => row.table_name);
|
||||
console.log('Найдены таблицы:', tables.join(', '));
|
||||
|
||||
// Очистка таблиц в порядке, учитывающем зависимости
|
||||
if (tables.includes('messages')) {
|
||||
console.log('Очистка таблицы messages...');
|
||||
await client.query('TRUNCATE TABLE messages CASCADE');
|
||||
}
|
||||
|
||||
if (tables.includes('swipes')) {
|
||||
console.log('Очистка таблицы swipes...');
|
||||
await client.query('TRUNCATE TABLE swipes CASCADE');
|
||||
}
|
||||
|
||||
if (tables.includes('matches')) {
|
||||
console.log('Очистка таблицы matches...');
|
||||
await client.query('TRUNCATE TABLE matches CASCADE');
|
||||
}
|
||||
|
||||
if (tables.includes('profiles')) {
|
||||
console.log('Очистка таблицы profiles...');
|
||||
await client.query('TRUNCATE TABLE profiles CASCADE');
|
||||
}
|
||||
|
||||
if (tables.includes('users')) {
|
||||
console.log('Очистка таблицы users...');
|
||||
await client.query('TRUNCATE TABLE users CASCADE');
|
||||
}
|
||||
|
||||
// Возвращаем внешние ключи (если они использовались)
|
||||
// await client.query('SET session_replication_role = \'origin\'');
|
||||
|
||||
// Фиксируем транзакцию
|
||||
await client.query('COMMIT');
|
||||
|
||||
console.log('Все таблицы успешно очищены!');
|
||||
} catch (error) {
|
||||
// В случае ошибки откатываем транзакцию
|
||||
await client.query('ROLLBACK');
|
||||
console.error('Произошла ошибка при очистке базы данных:', error);
|
||||
} finally {
|
||||
// Освобождаем клиента
|
||||
client.release();
|
||||
// Закрываем пул соединений
|
||||
await pool.end();
|
||||
}
|
||||
}
|
||||
|
||||
// Запускаем функцию очистки
|
||||
clearDatabase();
|
||||
26
scripts/clear_database.sql
Normal file
26
scripts/clear_database.sql
Normal file
@@ -0,0 +1,26 @@
|
||||
-- Скрипт для очистки всех таблиц в базе данных
|
||||
-- Важно: таблицы очищаются в порядке, учитывающем зависимости между ними
|
||||
|
||||
-- Отключаем внешние ключи на время выполнения (если они используются)
|
||||
-- SET session_replication_role = 'replica';
|
||||
|
||||
-- Очистка таблицы сообщений
|
||||
TRUNCATE TABLE messages CASCADE;
|
||||
|
||||
-- Очистка таблицы просмотров профилей
|
||||
TRUNCATE TABLE profile_views CASCADE;
|
||||
|
||||
-- Очистка таблицы свайпов
|
||||
TRUNCATE TABLE swipes CASCADE;
|
||||
|
||||
-- Очистка таблицы матчей
|
||||
TRUNCATE TABLE matches CASCADE;
|
||||
|
||||
-- Очистка таблицы профилей
|
||||
TRUNCATE TABLE profiles CASCADE;
|
||||
|
||||
-- Очистка таблицы пользователей
|
||||
TRUNCATE TABLE users CASCADE;
|
||||
|
||||
-- Возвращаем внешние ключи (если они использовались)
|
||||
-- SET session_replication_role = 'origin';
|
||||
86
scripts/createProfileViewsTable.js
Normal file
86
scripts/createProfileViewsTable.js
Normal file
@@ -0,0 +1,86 @@
|
||||
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();
|
||||
70
scripts/createProfileViewsTable.ts
Normal file
70
scripts/createProfileViewsTable.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
// Скрипт для создания таблицы profile_views
|
||||
|
||||
// Функция для ручного запуска создания таблицы profile_views
|
||||
async function createProfileViewsTable() {
|
||||
const client = await require('../database/connection').pool.connect();
|
||||
try {
|
||||
console.log('Создание таблицы profile_views...');
|
||||
|
||||
// Проверяем, существует ли уже таблица profile_views
|
||||
const tableCheck = await client.query(`
|
||||
SELECT EXISTS (
|
||||
SELECT FROM information_schema.tables
|
||||
WHERE table_schema = 'public'
|
||||
AND table_name = 'profile_views'
|
||||
);
|
||||
`);
|
||||
|
||||
if (tableCheck.rows[0].exists) {
|
||||
console.log('Таблица profile_views уже существует, пропускаем создание');
|
||||
return;
|
||||
}
|
||||
|
||||
// Начинаем транзакцию
|
||||
await client.query('BEGIN');
|
||||
|
||||
// Создаем таблицу profile_views
|
||||
await client.query(`
|
||||
CREATE TABLE 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(`
|
||||
CREATE UNIQUE INDEX profile_views_viewer_viewed_idx ON profile_views (viewer_id, viewed_profile_id);
|
||||
`);
|
||||
|
||||
// Индекс для быстрого поиска по viewer_id
|
||||
await client.query(`
|
||||
CREATE INDEX profile_views_viewer_idx ON profile_views (viewer_id);
|
||||
`);
|
||||
|
||||
// Индекс для быстрого поиска по viewed_profile_id
|
||||
await client.query(`
|
||||
CREATE INDEX profile_views_viewed_idx ON profile_views (viewed_profile_id);
|
||||
`);
|
||||
|
||||
// Фиксируем транзакцию
|
||||
await client.query('COMMIT');
|
||||
|
||||
console.log('Таблица profile_views успешно создана!');
|
||||
} catch (error) {
|
||||
// В случае ошибки откатываем транзакцию
|
||||
await client.query('ROLLBACK');
|
||||
console.error('Произошла ошибка при создании таблицы profile_views:', error);
|
||||
} finally {
|
||||
// Освобождаем клиента
|
||||
client.release();
|
||||
}
|
||||
}
|
||||
|
||||
// Запускаем функцию создания таблицы
|
||||
createProfileViewsTable()
|
||||
.then(() => console.log('Скрипт выполнен'))
|
||||
.catch(err => console.error('Ошибка выполнения скрипта:', err))
|
||||
.finally(() => process.exit());
|
||||
102
scripts/testMatching.js
Normal file
102
scripts/testMatching.js
Normal file
@@ -0,0 +1,102 @@
|
||||
require('dotenv').config();
|
||||
const { MatchingService } = require('../dist/services/matchingService');
|
||||
const { ProfileService } = require('../dist/services/profileService');
|
||||
|
||||
// Функция для создания тестовых пользователей
|
||||
async function createTestUsers() {
|
||||
const profileService = new ProfileService();
|
||||
|
||||
console.log('Создание тестовых пользователей...');
|
||||
|
||||
// Создаем мужской профиль
|
||||
const maleUserId = await profileService.ensureUser('123456', {
|
||||
username: 'test_male',
|
||||
first_name: 'Иван',
|
||||
last_name: 'Тестов'
|
||||
});
|
||||
|
||||
await profileService.createProfile(maleUserId, {
|
||||
name: 'Иван',
|
||||
age: 30,
|
||||
gender: 'male',
|
||||
interestedIn: 'female',
|
||||
bio: 'Тестовый мужской профиль',
|
||||
photos: ['photo1.jpg'],
|
||||
city: 'Москва',
|
||||
searchPreferences: {
|
||||
minAge: 18,
|
||||
maxAge: 45,
|
||||
maxDistance: 50
|
||||
}
|
||||
});
|
||||
console.log(`Создан мужской профиль: userId=${maleUserId}, telegramId=123456`);
|
||||
|
||||
// Создаем женский профиль
|
||||
const femaleUserId = await profileService.ensureUser('654321', {
|
||||
username: 'test_female',
|
||||
first_name: 'Анна',
|
||||
last_name: 'Тестова'
|
||||
});
|
||||
|
||||
await profileService.createProfile(femaleUserId, {
|
||||
name: 'Анна',
|
||||
age: 28,
|
||||
gender: 'female',
|
||||
interestedIn: 'male',
|
||||
bio: 'Тестовый женский профиль',
|
||||
photos: ['photo2.jpg'],
|
||||
city: 'Москва',
|
||||
searchPreferences: {
|
||||
minAge: 25,
|
||||
maxAge: 40,
|
||||
maxDistance: 30
|
||||
}
|
||||
});
|
||||
console.log(`Создан женский профиль: userId=${femaleUserId}, telegramId=654321`);
|
||||
|
||||
console.log('Тестовые пользователи созданы успешно');
|
||||
}
|
||||
|
||||
// Функция для тестирования подбора анкет
|
||||
async function testMatching() {
|
||||
console.log('\n===== ТЕСТИРОВАНИЕ ПОДБОРА АНКЕТ =====');
|
||||
|
||||
const matchingService = new MatchingService();
|
||||
|
||||
console.log('\nТест 1: Получение анкеты для мужского профиля (должна вернуться женская анкета)');
|
||||
const femaleProfile = await matchingService.getNextCandidate('123456', true);
|
||||
if (femaleProfile) {
|
||||
console.log(`✓ Получена анкета: ${femaleProfile.name}, возраст: ${femaleProfile.age}, пол: ${femaleProfile.gender}`);
|
||||
} else {
|
||||
console.log('✗ Анкета не найдена');
|
||||
}
|
||||
|
||||
console.log('\nТест 2: Получение анкеты для женского профиля (должна вернуться мужская анкета)');
|
||||
const maleProfile = await matchingService.getNextCandidate('654321', true);
|
||||
if (maleProfile) {
|
||||
console.log(`✓ Получена анкета: ${maleProfile.name}, возраст: ${maleProfile.age}, пол: ${maleProfile.gender}`);
|
||||
} else {
|
||||
console.log('✗ Анкета не найдена');
|
||||
}
|
||||
|
||||
console.log('\n===== ТЕСТИРОВАНИЕ ЗАВЕРШЕНО =====\n');
|
||||
|
||||
// Завершение работы скрипта
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
// Главная функция
|
||||
async function main() {
|
||||
try {
|
||||
// Создаем тестовых пользователей
|
||||
await createTestUsers();
|
||||
|
||||
// Тестируем подбор анкет
|
||||
await testMatching();
|
||||
} catch (error) {
|
||||
console.error('Ошибка при выполнении тестов:', error);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
main();
|
||||
98
scripts/testProfileViews.js
Normal file
98
scripts/testProfileViews.js
Normal file
@@ -0,0 +1,98 @@
|
||||
// Тестирование работы с таблицей profile_views
|
||||
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 testRecordProfileView(viewerId, viewedProfileId) {
|
||||
const client = await pool.connect();
|
||||
try {
|
||||
console.log(`Запись просмотра профиля: ${viewerId} просмотрел ${viewedProfileId}`);
|
||||
|
||||
// Получаем UUID пользователей
|
||||
const viewerResult = await client.query('SELECT id FROM users WHERE telegram_id = $1', [viewerId]);
|
||||
if (viewerResult.rows.length === 0) {
|
||||
console.log(`Пользователь с telegram_id ${viewerId} не найден, создаём нового пользователя`);
|
||||
const newUserResult = await client.query(`
|
||||
INSERT INTO users (telegram_id, username, first_name, last_name)
|
||||
VALUES ($1, $2, $3, $4) RETURNING id
|
||||
`, [viewerId, `user_${viewerId}`, `Имя ${viewerId}`, `Фамилия ${viewerId}`]);
|
||||
|
||||
var viewerUuid = newUserResult.rows[0].id;
|
||||
} else {
|
||||
var viewerUuid = viewerResult.rows[0].id;
|
||||
}
|
||||
|
||||
const viewedResult = await client.query('SELECT id FROM users WHERE telegram_id = $1', [viewedProfileId]);
|
||||
if (viewedResult.rows.length === 0) {
|
||||
console.log(`Пользователь с telegram_id ${viewedProfileId} не найден, создаём нового пользователя`);
|
||||
const newUserResult = await client.query(`
|
||||
INSERT INTO users (telegram_id, username, first_name, last_name)
|
||||
VALUES ($1, $2, $3, $4) RETURNING id
|
||||
`, [viewedProfileId, `user_${viewedProfileId}`, `Имя ${viewedProfileId}`, `Фамилия ${viewedProfileId}`]);
|
||||
|
||||
var viewedUuid = newUserResult.rows[0].id;
|
||||
} else {
|
||||
var viewedUuid = viewedResult.rows[0].id;
|
||||
}
|
||||
|
||||
console.log(`UUID просматривающего: ${viewerUuid}`);
|
||||
console.log(`UUID просматриваемого: ${viewedUuid}`);
|
||||
|
||||
// Записываем просмотр
|
||||
await client.query(`
|
||||
INSERT INTO profile_views (viewer_id, viewed_profile_id, view_type, view_date)
|
||||
VALUES ($1, $2, $3, NOW())
|
||||
ON CONFLICT (viewer_id, viewed_profile_id) DO UPDATE
|
||||
SET view_date = NOW(), view_type = $3
|
||||
`, [viewerUuid, viewedUuid, 'browse']);
|
||||
|
||||
console.log('Просмотр профиля успешно записан');
|
||||
|
||||
// Получаем список просмотренных профилей
|
||||
const viewedProfiles = await client.query(`
|
||||
SELECT v.viewed_profile_id, v.view_date, u.telegram_id
|
||||
FROM profile_views v
|
||||
JOIN users u ON u.id = v.viewed_profile_id
|
||||
WHERE v.viewer_id = $1
|
||||
ORDER BY v.view_date DESC
|
||||
`, [viewerUuid]);
|
||||
|
||||
console.log('Список просмотренных профилей:');
|
||||
viewedProfiles.rows.forEach((row, index) => {
|
||||
console.log(`${index + 1}. ID: ${row.telegram_id}, просмотрен: ${row.view_date}`);
|
||||
});
|
||||
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error('Ошибка записи просмотра профиля:', error);
|
||||
return false;
|
||||
} finally {
|
||||
client.release();
|
||||
}
|
||||
}
|
||||
|
||||
// Запускаем тест
|
||||
async function runTest() {
|
||||
try {
|
||||
// Тестируем запись просмотра профиля
|
||||
await testRecordProfileView(123456, 789012);
|
||||
await testRecordProfileView(123456, 345678);
|
||||
await testRecordProfileView(789012, 123456);
|
||||
|
||||
console.log('Тесты завершены успешно');
|
||||
} catch (error) {
|
||||
console.error('Ошибка при выполнении тестов:', error);
|
||||
} finally {
|
||||
await pool.end();
|
||||
}
|
||||
}
|
||||
|
||||
runTest();
|
||||
Reference in New Issue
Block a user