@@ -25,7 +25,6 @@ async def add_account(
2525 app_version : str ,
2626 user_telegram_id : Optional [int ] = None
2727) -> Optional [Account ]:
28- """Adds a new account to the database with encrypted credentials."""
2928 try :
3029 new_account = Account (
3130 account_name = account_name ,
@@ -43,7 +42,7 @@ async def add_account(
4342 logger .info (f"Added account '{ account_name } ' with ID: { new_account .account_id } " )
4443 return new_account
4544 except IntegrityError :
46- logger .warning (f"Account with name '{ account_name } ' already exists." )
45+ logger .warning (f"Account with name '{ account_name } ' or user_id ' { user_telegram_id } ' already exists." )
4746 await db .rollback ()
4847 return None
4948 except Exception as e :
@@ -52,27 +51,22 @@ async def add_account(
5251 return None
5352
5453async def get_account (db : AsyncSession , account_name : str ) -> Optional [Account ]:
55- """Retrieves an account by its name."""
5654 result = await db .execute (select (Account ).where (Account .account_name == account_name ))
5755 return result .scalars ().first ()
5856
5957async def get_account_by_user_id (db : AsyncSession , user_id : int ) -> Optional [Account ]:
60- """Retrieves an account by its Telegram User ID."""
6158 result = await db .execute (select (Account ).where (Account .user_telegram_id == user_id ))
6259 return result .scalars ().first ()
6360
6461async def get_all_accounts (db : AsyncSession ) -> List [Account ]:
65- """Retrieves all accounts from the database, with their sessions for status display."""
6662 result = await db .execute (select (Account ).options (selectinload (Account .session )).order_by (Account .account_id ))
6763 return result .scalars ().all ()
6864
6965async def get_all_active_accounts (db : AsyncSession ) -> List [Account ]:
70- """Retrieves all enabled accounts from the database."""
7166 result = await db .execute (select (Account ).where (Account .is_enabled == True ))
7267 return result .scalars ().all ()
7368
7469async def delete_account (db : AsyncSession , account_name : str ) -> bool :
75- """Deletes an account by its name."""
7670 account = await get_account (db , account_name )
7771 if not account :
7872 return False
@@ -81,7 +75,6 @@ async def delete_account(db: AsyncSession, account_name: str) -> bool:
8175 return True
8276
8377async def toggle_account_status (db : AsyncSession , account_name : str ) -> Optional [bool ]:
84- """Toggles the is_enabled status of an account."""
8578 account = await get_account (db , account_name )
8679 if not account :
8780 return None
@@ -90,14 +83,12 @@ async def toggle_account_status(db: AsyncSession, account_name: str) -> Optional
9083 return account .is_enabled
9184
9285async def update_account_lang (db : AsyncSession , account_id : int , lang_code : str ) -> bool :
93- """Updates the language for a specific account."""
9486 stmt = update (Account ).where (Account .account_id == account_id ).values (lang_code = lang_code )
9587 result = await db .execute (stmt )
9688 return result .rowcount > 0
9789
9890# --- Session CRUD ---
9991async def get_session (db : AsyncSession , account_id : int ) -> Optional [Session ]:
100- """Retrieves a session for a given account and decrypts its auth key."""
10192 result = await db .execute (select (Session ).where (Session .account_id == account_id ))
10293 session = result .scalars ().first ()
10394 if session and session .auth_key_data :
@@ -109,7 +100,6 @@ async def get_session(db: AsyncSession, account_id: int) -> Optional[Session]:
109100 return session
110101
111102async def add_or_update_session (db : AsyncSession , ** kwargs ) -> Optional [Session ]:
112- """Adds or updates a session in the database, encrypting the auth key."""
113103 account_id = kwargs .get ("account_id" )
114104 if not account_id : return None
115105
@@ -129,37 +119,17 @@ async def add_or_update_session(db: AsyncSession, **kwargs) -> Optional[Session]
129119 await db .flush ()
130120 return session
131121
132- async def delete_session (db : AsyncSession , account_id : int ) -> bool :
133- """Deletes a session from the database."""
134- stmt = delete (Session ).where (Session .account_id == account_id )
135- result = await db .execute (stmt )
136- await db .flush ()
137- return result .rowcount > 0
138-
139122# --- Log CRUD ---
140- async def add_log (db : AsyncSession , level : str , message : str , account_id : Optional [int ] = None , module_name : Optional [str ] = None ) -> Optional [Log ]:
141- """Adds a log entry to the database."""
123+ async def add_logs_bulk (db : AsyncSession , logs : List [Dict [str , Any ]]) -> None :
124+ """Adds a batch of log entries to the database."""
125+ if not logs :
126+ return
142127 try :
143- new_log = Log (
144- level = level .upper (),
145- message = message ,
146- account_id = account_id ,
147- module_name = module_name
148- )
149- db .add (new_log )
128+ # SQLAlchemy 2.0 style bulk insert
129+ db .add_all ([Log (** log_data ) for log_data in logs ])
150130 await db .flush ()
151- return new_log
152131 except Exception as e :
153- print (f"CRITICAL: Error adding log to database: { e } " )
154- return None
155-
156- async def get_logs (db : AsyncSession , account_id : Optional [int ] = None , limit : int = 100 , level : Optional [str ] = None ) -> List [Log ]:
157- """Retrieves logs from the database with optional filters."""
158- stmt = select (Log ).order_by (Log .timestamp .desc ()).limit (limit )
159- if account_id is not None :
160- stmt = stmt .where (Log .account_id == account_id )
161- if level is not None :
162- stmt = stmt .where (Log .level == level .upper ())
163-
164- result = await db .execute (stmt )
165- return result .scalars ().all ()
132+ # Fallback to printing if bulk DB logging fails
133+ print (f"CRITICAL: Error during bulk log insert: { e } " )
134+ for log in logs :
135+ print (f"Fallback Log: [{ log .get ('level' )} ] { log .get ('message' )} " )
0 commit comments