Отедельные таблицы User и TelegramUser

This commit is contained in:
Artem Tsyrulnikov
2026-01-07 14:00:35 +03:00
parent 3e1ad27c66
commit f6669c3f5a
19 changed files with 344 additions and 74 deletions

View File

@@ -23,6 +23,24 @@ class Postgres(DatabaseBase, Database):
async def update_user(self, user: domain.User) -> None:
await user.save()
async def get_telegram_user(
self,
telegram_user_id: uuid.UUID | None = None,
telegram_id: int | None = None,
) -> domain.TelegramUser | None:
if telegram_user_id:
return await domain.TelegramUser.get_or_none(id=telegram_user_id)
if telegram_id:
return await domain.TelegramUser.get_or_none(telegram_id=telegram_id)
raise ValueError('Either telegram_user_id or telegram_id must be provided')
async def create_telegram_user(self, telegram_user: domain.TelegramUser) -> None:
await telegram_user.save()
async def update_telegram_user(self, telegram_user: domain.TelegramUser) -> None:
await telegram_user.save()
async def create_workspace(self, workspace: domain.Workspace) -> None:
await workspace.save()
@@ -75,14 +93,14 @@ class Postgres(DatabaseBase, Database):
) -> domain.WorkspaceUser | None:
return (
await domain.WorkspaceUser.filter(workspace_id=workspace_id, user_id=user_id)
.prefetch_related('workspace', 'user', 'permissions', 'permission_scopes')
.prefetch_related('workspace', 'user', 'user__telegram_user', 'permissions', 'permission_scopes')
.first()
)
async def get_workspace_members(self, workspace_id: uuid.UUID) -> list[domain.WorkspaceUser]:
return (
await domain.WorkspaceUser.filter(workspace_id=workspace_id)
.prefetch_related('workspace', 'user', 'permissions', 'permission_scopes')
.prefetch_related('workspace', 'user__telegram_user', 'permissions', 'permission_scopes')
.order_by('created_at')
.all()
)
@@ -90,7 +108,7 @@ class Postgres(DatabaseBase, Database):
async def get_workspace_member(self, workspace_user_id: uuid.UUID) -> domain.WorkspaceUser | None:
return (
await domain.WorkspaceUser.filter(id=workspace_user_id)
.prefetch_related('workspace', 'user', 'permissions', 'permission_scopes')
.prefetch_related('workspace', 'user__telegram_user', 'permissions', 'permission_scopes')
.first()
)
@@ -103,7 +121,7 @@ class Postgres(DatabaseBase, Database):
async def get_workspace_invite(self, invite_id: uuid.UUID) -> domain.WorkspaceInvite | None:
return (
await domain.WorkspaceInvite.filter(id=invite_id)
.prefetch_related('workspace', 'user', 'invited_by')
.prefetch_related('workspace', 'user__telegram_user', 'invited_by__telegram_user')
.first()
)
@@ -115,7 +133,7 @@ class Postgres(DatabaseBase, Database):
async def get_workspace_invites(self, workspace_id: uuid.UUID) -> list[domain.WorkspaceInvite]:
return (
await domain.WorkspaceInvite.filter(workspace_id=workspace_id)
.prefetch_related('user', 'invited_by')
.prefetch_related('user__telegram_user', 'invited_by__telegram_user')
.order_by('created_at')
.all()
)
@@ -165,14 +183,24 @@ class Postgres(DatabaseBase, Database):
async def get_user(self, user_id: uuid.UUID | None = None, telegram_id: int | None = None) -> domain.User | None:
if user_id:
return await domain.User.get_or_none(id=user_id)
return (
await domain.User.filter(id=user_id).prefetch_related('telegram_user').first()
)
elif telegram_id:
return await domain.User.get_or_none(telegram_id=telegram_id)
return (
await domain.User.filter(telegram_user__telegram_id=telegram_id)
.prefetch_related('telegram_user')
.first()
)
raise ValueError('Either user_id or telegram_id must be provided')
async def get_user_by_username(self, username: str) -> domain.User | None:
return await domain.User.get_or_none(username__iexact=username)
return (
await domain.User.filter(telegram_user__username__iexact=username)
.prefetch_related('telegram_user')
.first()
)
async def get_login_token(self, token: str) -> domain.LoginToken | None:
return await domain.LoginToken.get_or_none(token=token)
@@ -444,9 +472,11 @@ class Postgres(DatabaseBase, Database):
await subscription.save()
async def get_subscription_by_subscriber_and_placement(
self, subscriber_id: uuid.UUID, placement_id: uuid.UUID
self, telegram_user_id: uuid.UUID, placement_id: uuid.UUID
) -> domain.Subscription | None:
return await domain.Subscription.get_or_none(subscriber_id=subscriber_id, placement_id=placement_id)
return await domain.Subscription.get_or_none(
telegram_user_id=telegram_user_id, placement_id=placement_id
)
async def update_subscription(self, subscription: domain.Subscription) -> None:
await subscription.save()
@@ -471,28 +501,28 @@ class Postgres(DatabaseBase, Database):
return await query.all()
async def get_active_subscriptions_by_subscriber_and_project(
self, subscriber_id: uuid.UUID, project_id: uuid.UUID
self, telegram_user_id: uuid.UUID, project_id: uuid.UUID
) -> list[domain.Subscription]:
return (
await domain.Subscription.filter(
subscriber_id=subscriber_id,
telegram_user_id=telegram_user_id,
placement__project_id=project_id,
status=domain.SubscriptionStatus.ACTIVE,
)
.prefetch_related('placement', 'subscriber')
.prefetch_related('placement', 'telegram_user')
.all()
)
async def get_active_subscription_by_subscriber_and_project(
self, subscriber_id: uuid.UUID, project_id: uuid.UUID
self, telegram_user_id: uuid.UUID, project_id: uuid.UUID
) -> domain.Subscription | None:
return (
await domain.Subscription.filter(
subscriber_id=subscriber_id,
telegram_user_id=telegram_user_id,
placement__project_id=project_id,
status=domain.SubscriptionStatus.ACTIVE,
)
.prefetch_related('placement', 'subscriber')
.prefetch_related('placement', 'telegram_user')
.first()
)