File size: 6,946 Bytes
93cd57d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
"""
Скрипт для добавления тестового пользователя-администратора в БД.

Подключается к 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)