Files
vidconf/backend/alembic/versions/504791847d4f_chat_guest_authors.py

70 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""chat guest authors
Разрешить сообщения чата (`chat_messages`) от гостей и хранить снапшот имени
автора:
- `user_id` становится nullable — автором может быть гость;
- `guest_access_id` — необязательная ссылка на `guest_access`, `ON DELETE
CASCADE` (удаление гостевой записи удаляет и его сообщения чата);
- `author_name` — снапшот отображаемого имени из LiveKit-токена на момент
отправки; добавляется nullable, backfill из `users.name_user` для уже
существующих строк (все они с `user_id`, т.к. гостевого автора раньше не
было), затем ужесточается до `NOT NULL`;
- `ck_chat_messages_author` — ровно один из `user_id`/`guest_access_id`
обязателен (как у `ConferenceParticipant`, ADR-001, п.6).
Revision ID: 504791847d4f
Revises: 9d37822e4513
Create Date: 2026-07-18 18:45:20.921653
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '504791847d4f'
down_revision: Union[str, Sequence[str], None] = '9d37822e4513'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema."""
op.add_column('chat_messages', sa.Column('guest_access_id', sa.UUID(), nullable=True))
op.add_column('chat_messages', sa.Column('author_name', sa.String(length=255), nullable=True))
op.alter_column('chat_messages', 'user_id', existing_type=sa.UUID(), nullable=True)
op.create_foreign_key(
'fk_chat_messages_guest_access_id_guest_access',
'chat_messages', 'guest_access', ['guest_access_id'], ['id'], ondelete='CASCADE',
)
# Backfill: до этой миграции автор всегда был зарегистрированным
# пользователем — берём снапшот его текущего имени.
op.execute(
"""
UPDATE chat_messages cm
SET author_name = u.name_user
FROM users u
WHERE cm.user_id = u.id
"""
)
op.alter_column('chat_messages', 'author_name', existing_type=sa.String(length=255), nullable=False)
op.create_check_constraint(
'ck_chat_messages_author',
'chat_messages',
'user_id IS NOT NULL OR guest_access_id IS NOT NULL',
)
def downgrade() -> None:
"""Downgrade schema."""
op.drop_constraint('ck_chat_messages_author', 'chat_messages', type_='check')
op.drop_constraint('fk_chat_messages_guest_access_id_guest_access', 'chat_messages', type_='foreignkey')
op.alter_column('chat_messages', 'user_id', existing_type=sa.UUID(), nullable=False)
op.drop_column('chat_messages', 'author_name')
op.drop_column('chat_messages', 'guest_access_id')