8.9 KiB
Архитектура идентификаторов пользователей
Общая структура
Таблицы для хранения данных пользователей
Система идентификации пользователей построена на следующих таблицах:
-
users - Основная таблица пользователей
id SERIAL PRIMARY KEY- Основной идентификатор пользователяstatus- Статус пользователя (active, blocked)role- Роль пользователя (user, admin)created_at,updated_at- Временные метки- Поля
username,emailиaddressявляются устаревшими и должны быть NULL
-
user_identities - Таблица идентификаторов пользователей
id SERIAL PRIMARY KEY- Идентификатор записиuser_id INTEGER REFERENCES users(id)- Ссылка на пользователяprovider VARCHAR(50)- Тип идентификатора (email, wallet, telegram, username)provider_id VARCHAR(255)- Значение идентификатора (должно быть в нижнем регистре для email и wallet)- Уникальный составной ключ
(provider, provider_id) - Ограничение
CHECK (provider IN ('email', 'wallet', 'telegram', 'username'))- запрещает тип 'guest'
-
guest_user_mapping - Таблица связи гостевых идентификаторов с пользователями
id SERIAL PRIMARY KEY- Идентификатор записиuser_id INTEGER REFERENCES users(id)- Ссылка на пользователяguest_id VARCHAR(255)- Гостевой идентификаторprocessed BOOLEAN- Флаг обработки гостевых сообщений- Уникальный ключ
guest_id
-
messages - Таблица сообщений
id SERIAL PRIMARY KEY- Идентификатор сообщенияconversation_id INTEGER REFERENCES conversations(id)- Ссылка на диалогuser_id INTEGER REFERENCES users(id)- Прямая ссылка на пользователяcontent TEXT- Содержание сообщенияsender_type,role- Тип отправителя и роль (user/assistant)
-
guest_messages - Таблица гостевых сообщений
id SERIAL PRIMARY KEY- Идентификатор гостевого сообщенияguest_id VARCHAR(255)- Идентификатор гостяcontent TEXT- Содержание сообщенияis_ai BOOLEAN- Флаг, указывающий на сообщение от AI
Процесс аутентификации и работа с гостевыми сообщениями
Гостевой доступ
- Гость (неаутентифицированный пользователь) начинает взаимодействие с системой
- Для гостя генерируется уникальный
guest_id, который сохраняется в localStorage браузера - Гостевые сообщения сохраняются в таблице
guest_messagesс привязкой кguest_id - Локально сообщения также хранятся в localStorage
Аутентификация пользователя
- Когда гость аутентифицируется (через email, wallet или telegram):
- Создается запись в таблице
users - Создается запись в таблице
user_identitiesс соответствующим провайдером - Гостевой ID сохраняется в таблице
guest_user_mapping(не в user_identities)
- Создается запись в таблице
- После аутентификации система автоматически обрабатывает гостевые сообщения:
- Вызывается метод
linkGuestMessages - Создается новый диалог для гостевых сообщений
- Гостевые сообщения переносятся в таблицу
messagesс привязкой к пользователю - Обработанные гостевые сообщения удаляются из
guest_messages - Запись в
guest_user_mappingпомечается какprocessed = true
- Вызывается метод
Объединение пользователей
Если пользователь аутентифицируется разными способами, система может объединить его данные:
- Система проверяет связанных пользователей через
user_identities - Если находятся связанные пользователи, вызывается метод
migrateUserData - Данные от вторичных аккаунтов мигрируют к основному:
- Идентификаторы в таблице
user_identities - Гостевые связи в таблице
guest_user_mapping - Сообщения с прямым указанием
user_id - Диалоги
- Настройки
- Идентификаторы в таблице
Ограничения и правила
- Тип провайдера
guestзапрещен в таблицеuser_identities(проверяется ограничением CHECK) - Гостевые идентификаторы хранятся только в таблице
guest_user_mapping - Все идентификаторы email и wallet должны храниться в нижнем регистре
- Таблица
messagesимеет прямую связь с пользователем через полеuser_id - Сообщения всегда связаны с конкретным пользователем и диалогом
- В таблице
usersполяusername,emailиaddressдолжны быть NULL
Обработка ошибок
-
Если возникает ошибка при обработке гостевых сообщений, система:
- Логирует ошибку
- Продолжает попытки обработки при следующих авторизациях
- Не удаляет гостевые сообщения до успешной обработки
-
Если гостевые сообщения уже обработаны, повторная обработка пропускается
Оптимизации
-
Индексы созданы для всех полей, используемых в запросах:
user_identities(user_id)user_identities(provider, provider_id)guest_user_mapping(guest_id)guest_user_mapping(user_id)messages(user_id)messages(conversation_id)
-
Триггеры автоматически поддерживают целостность данных:
- Автоматическое заполнение
user_idв таблицеmessages - Очистка неиспользуемых полей в таблице
users
- Автоматическое заполнение
-
Ограничения предотвращают некорректные данные:
- Запрет на использование провайдера
guestв таблицеuser_identities - Уникальность
guest_idв таблицеguest_user_mapping - Ограничение допустимых значений для поля
provider
- Запрет на использование провайдера
Функции для диагностики
-
verify_migration_017() - проверяет состояние гостевых идентификаторов
guest_identities_count- количество гостевых идентификаторов в таблице user_identitiesguest_mapping_count- количество записей в таблице guest_user_mappingmissing_mappings- количество гостевых ID, которые отсутствуют в guest_user_mapping
-
verify_identity_data() - проверяет общее состояние данных идентификаторов
users_with_address- количество пользователей с заполненным полем addressusers_with_email- количество пользователей с заполненным полем emailwallet_identities- количество идентификаторов walletemail_identities- количество идентификаторов emailtelegram_identities- количество идентификаторов telegramduplicate_provider_ids- количество дублирующихся идентификаторов