1- import asyncio
21from copy import deepcopy
32from datetime import UTC , datetime , timedelta , timezone
43from enum import Enum
98from sqlalchemy .orm import joinedload , selectinload
109from sqlalchemy .sql .functions import coalesce
1110
12- from app .db .base import GetDB , IS_SQLITE
1311from app .db .compiles_types import DateDiff
1412from app .db .models import (
1513 Admin ,
@@ -698,32 +696,12 @@ async def _delete_user_dependencies(db: AsyncSession, user_ids: list[int]):
698696 if not user_ids :
699697 return
700698
701- statements = [
702- delete (NodeUserUsage ).where (NodeUserUsage .user_id .in_ (user_ids )),
703- delete (NotificationReminder ).where (NotificationReminder .user_id .in_ (user_ids )),
704- delete (UserSubscriptionUpdate ).where (UserSubscriptionUpdate .user_id .in_ (user_ids )),
705- delete (UserUsageResetLogs ).where (UserUsageResetLogs .user_id .in_ (user_ids )),
706- delete (NextPlan ).where (NextPlan .user_id .in_ (user_ids )),
707- users_groups_association .delete ().where (users_groups_association .c .user_id .in_ (user_ids )),
708- ]
709-
710- if IS_SQLITE :
711- for stmt in statements :
712- await db .execute (stmt )
713- return
714-
715- async def execute_in_isolated_session (statement ):
716- async with GetDB () as isolated_db :
717- await isolated_db .execute (statement )
718- await isolated_db .commit ()
719-
720- results = await asyncio .gather (
721- * (execute_in_isolated_session (stmt ) for stmt in statements ),
722- return_exceptions = True ,
723- )
724- for result in results :
725- if isinstance (result , Exception ):
726- raise result
699+ await db .execute (delete (NodeUserUsage ).where (NodeUserUsage .user_id .in_ (user_ids )))
700+ await db .execute (delete (NotificationReminder ).where (NotificationReminder .user_id .in_ (user_ids )))
701+ await db .execute (delete (UserSubscriptionUpdate ).where (UserSubscriptionUpdate .user_id .in_ (user_ids )))
702+ await db .execute (delete (UserUsageResetLogs ).where (UserUsageResetLogs .user_id .in_ (user_ids )))
703+ await db .execute (delete (NextPlan ).where (NextPlan .user_id .in_ (user_ids )))
704+ await db .execute (users_groups_association .delete ().where (users_groups_association .c .user_id .in_ (user_ids )))
727705
728706
729707async def remove_user (db : AsyncSession , db_user : User ) -> User :
@@ -858,16 +836,12 @@ async def modify_user(db: AsyncSession, db_user: User, modify: UserModify) -> Us
858836 return db_user
859837
860838
861- async def _reset_user_traffic_and_log (db : AsyncSession , db_user : User , * , reset_at : datetime | None = None ) -> datetime :
839+ async def _reset_user_traffic_and_log (db : AsyncSession , db_user : User ) :
862840 """Helper to reset user traffic and log the action."""
863- if reset_at is None :
864- reset_at = datetime .now (timezone .utc )
865-
866841 await db_user .awaitable_attrs .next_plan
867842 usage_log = UserUsageResetLogs (
868843 user_id = db_user .id ,
869844 used_traffic_at_reset = db_user .used_traffic ,
870- reset_at = reset_at ,
871845 )
872846 db .add (usage_log )
873847
@@ -885,13 +859,7 @@ async def clear_user_node_usages(db: AsyncSession, user_id: int, *, before: date
885859 await db .execute (stmt )
886860
887861
888- async def reset_user_data_usage (
889- db : AsyncSession ,
890- db_user : User ,
891- * ,
892- skip_node_usage_cleanup : bool = False ,
893- node_usage_cleanup_before : datetime | None = None ,
894- ) -> User :
862+ async def reset_user_data_usage (db : AsyncSession , db_user : User ) -> User :
895863 """
896864 Resets the data usage of a user and logs the reset.
897865
@@ -902,9 +870,8 @@ async def reset_user_data_usage(
902870 Returns:
903871 User: The updated user object.
904872 """
905- reset_at = await _reset_user_traffic_and_log (db , db_user , reset_at = node_usage_cleanup_before )
906- if not skip_node_usage_cleanup :
907- await clear_user_node_usages (db , db_user .id , before = reset_at )
873+ await _reset_user_traffic_and_log (db , db_user )
874+ await clear_user_node_usages (db , db_user .id )
908875
909876 if db_user .status not in [UserStatus .expired , UserStatus .disabled ]:
910877 db_user .status = UserStatus .active .value
@@ -927,8 +894,8 @@ async def bulk_reset_user_data_usage(db: AsyncSession, users: list[User]) -> lis
927894 list[User]: The updated list of user objects.
928895 """
929896 for db_user in users :
930- reset_at = await _reset_user_traffic_and_log (db , db_user )
931- await clear_user_node_usages (db , db_user .id , before = reset_at )
897+ await _reset_user_traffic_and_log (db , db_user )
898+ await clear_user_node_usages (db , db_user .id )
932899 if db_user .status not in [UserStatus .expired , UserStatus .disabled ]:
933900 db_user .status = UserStatus .active .value
934901 await db .commit ()
@@ -991,8 +958,8 @@ async def reset_user_by_next(db: AsyncSession, db_user: User) -> User:
991958 db_user .proxy_settings = proxy_settings
992959 db_user .data_limit_reset_strategy = db_user .next_plan .user_template .data_limit_reset_strategy
993960
994- reset_at = await _reset_user_traffic_and_log (db , db_user )
995- await clear_user_node_usages (db , db_user .id , before = reset_at )
961+ await _reset_user_traffic_and_log (db , db_user )
962+ await clear_user_node_usages (db , db_user .id )
996963 db_user .status = UserStatus .active
997964
998965 await db .commit ()
0 commit comments