From e2f313e6ea5f5bfb9fc9ebad2d4affb73a6df057 Mon Sep 17 00:00:00 2001 From: Egor Date: Tue, 30 Sep 2025 01:26:37 +0300 Subject: [PATCH] Fix server user list counts --- app/database/crud/server_squad.py | 14 ++++++++++---- app/handlers/admin/servers.py | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/database/crud/server_squad.py b/app/database/crud/server_squad.py index 59bd1e5d..1b5148e9 100644 --- a/app/database/crud/server_squad.py +++ b/app/database/crud/server_squad.py @@ -2,7 +2,7 @@ import logging from datetime import datetime from typing import Iterable, List, Optional, Sequence, Tuple -from sqlalchemy import select, and_, func, update, delete, text +from sqlalchemy import select, and_, func, update, delete, text, or_ from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload @@ -348,14 +348,20 @@ async def sync_with_remnawave( async def get_server_connected_users( db: AsyncSession, - server_id: int + server_id: int, + server_uuid: Optional[str] = None, ) -> List[User]: + filters = [SubscriptionServer.server_squad_id == server_id] + + if server_uuid: + filters.append(Subscription.connected_squads.contains([server_uuid])) + result = await db.execute( select(User) .join(Subscription, Subscription.user_id == User.id) - .join(SubscriptionServer, SubscriptionServer.subscription_id == Subscription.id) - .where(SubscriptionServer.server_squad_id == server_id) + .outerjoin(SubscriptionServer, SubscriptionServer.subscription_id == Subscription.id) + .where(or_(*filters)) .options(selectinload(User.subscription)) .order_by(User.id) ) diff --git a/app/handlers/admin/servers.py b/app/handlers/admin/servers.py index c0233399..c0535a7e 100644 --- a/app/handlers/admin/servers.py +++ b/app/handlers/admin/servers.py @@ -365,7 +365,7 @@ async def show_server_users( await callback.answer("❌ Сервер не найден!", show_alert=True) return - users = await get_server_connected_users(db, server_id) + users = await get_server_connected_users(db, server_id, server.squad_uuid) safe_name = html.escape(server.display_name or "—") safe_uuid = html.escape(server.squad_uuid or "—")