""" Скрипт для добавления тестового пользователя-администратора в БД. Подключается к PostgreSQL на Render и создает пользователя с ролью ADMIN. """ import psycopg2 import bcrypt from uuid import uuid4 # Параметры подключения к БД на Render DB_CONFIG = { 'host': 'dpg-d5ht8vi4d50c739akh2g-a.virginia-postgres.render.com', 'port': 5432, 'database': 'lead_exchange_bk', 'user': 'lead_exchange_bk_user', 'password': '8m2gtTRBW0iAr7nY2Aadzz0VcZBEVKYM' } # Данные администратора ADMIN_USER = { 'user_id': str(uuid4()), 'email': 'admin@leadexchange.com', 'password': 'admin123', # Будет захеширован 'first_name': 'Админ', 'last_name': 'Администраторов', 'phone': '+79999999999', 'agency_name': 'Lead Exchange Administration', 'avatar_url': 'https://cdn.pixabay.com/photo/2015/10/05/22/37/blank-profile-picture-973460_1280.png', 'role': 'ADMIN' } def hash_password(password: str) -> str: """Хеширование пароля с помощью bcrypt.""" salt = bcrypt.gensalt() hashed = bcrypt.hashpw(password.encode('utf-8'), salt) return hashed.decode('utf-8') def create_admin_user(): """Создание пользователя-администратора в БД.""" try: # Подключение к БД print(f"Подключение к базе данных {DB_CONFIG['database']}...") conn = psycopg2.connect(**DB_CONFIG) cursor = conn.cursor() # Проверяем, существует ли таблица users cursor.execute(""" SELECT EXISTS ( SELECT FROM information_schema.tables WHERE table_name = 'users' ); """) table_exists = cursor.fetchone()[0] if not table_exists: print("⚠️ Таблица 'users' не существует. Создаем...") cursor.execute(""" CREATE TABLE IF NOT EXISTS users ( user_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), email TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, first_name TEXT NOT NULL, last_name TEXT NOT NULL, phone TEXT UNIQUE, agency_name TEXT, avatar_url TEXT, role TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); """) conn.commit() print("✅ Таблица 'users' создана") # Проверяем, существует ли уже пользователь с таким email cursor.execute("SELECT email FROM users WHERE email = %s", (ADMIN_USER['email'],)) existing_user = cursor.fetchone() if existing_user: print(f"⚠️ Пользователь с email {ADMIN_USER['email']} уже существует") # Спрашиваем, обновить ли пароль update = input("Обновить пароль? (y/n): ").lower().strip() if update == 'y': password_hash = hash_password(ADMIN_USER['password']) cursor.execute( "UPDATE users SET password_hash = %s WHERE email = %s", (password_hash, ADMIN_USER['email']) ) conn.commit() print("✅ Пароль обновлен") else: print("❌ Операция отменена") return # Хешируем пароль print("Хеширование пароля...") password_hash = hash_password(ADMIN_USER['password']) # Вставляем пользователя print(f"Создание администратора {ADMIN_USER['email']}...") cursor.execute(""" INSERT INTO users ( user_id, email, password_hash, first_name, last_name, phone, agency_name, avatar_url, role ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) """, ( ADMIN_USER['user_id'], ADMIN_USER['email'], password_hash, ADMIN_USER['first_name'], ADMIN_USER['last_name'], ADMIN_USER['phone'], ADMIN_USER['agency_name'], ADMIN_USER['avatar_url'], ADMIN_USER['role'] )) conn.commit() print("\n" + "="*60) print("✅ Администратор успешно создан!") print("="*60) print(f"ID: {ADMIN_USER['user_id']}") print(f"Email: {ADMIN_USER['email']}") print(f"Пароль: {ADMIN_USER['password']}") print(f"Роль: {ADMIN_USER['role']}") print(f"Имя: {ADMIN_USER['first_name']} {ADMIN_USER['last_name']}") print(f"Телефон: {ADMIN_USER['phone']}") print("="*60) cursor.close() conn.close() except psycopg2.Error as e: print(f"❌ Ошибка PostgreSQL: {e}") raise except Exception as e: print(f"❌ Ошибка: {e}") raise def verify_admin_user(): """Проверка, что администратор успешно создан.""" try: conn = psycopg2.connect(**DB_CONFIG) cursor = conn.cursor() cursor.execute(""" SELECT user_id, email, first_name, last_name, role, created_at FROM users WHERE email = %s """, (ADMIN_USER['email'],)) user = cursor.fetchone() if user: print("\n📋 Информация о пользователе в БД:") print(f" ID: {user[0]}") print(f" Email: {user[1]}") print(f" Имя: {user[2]} {user[3]}") print(f" Роль: {user[4]}") print(f" Создан: {user[5]}") else: print("❌ Пользователь не найден в БД") cursor.close() conn.close() except Exception as e: print(f"❌ Ошибка при проверке: {e}") if __name__ == "__main__": print("🚀 Скрипт создания администратора Lead Exchange") print("-" * 60) try: create_admin_user() verify_admin_user() except KeyboardInterrupt: print("\n\n⚠️ Операция прервана пользователем") except Exception as e: print(f"\n❌ Критическая ошибка: {e}") exit(1)