1313logger : logging .Logger = logging .getLogger (__name__ )
1414
1515# --- Account CRUD ---
16- async def add_account (db : AsyncSession , account_name : str , api_id : str , api_hash : str , lang_code : str , is_enabled : bool , device_model : str , system_version : str , app_version : str , user_telegram_id : Optional [int ] = None ) -> Optional [Account ]:
16+ async def add_account (
17+ db : AsyncSession ,
18+ account_name : str ,
19+ api_id : str ,
20+ api_hash : str ,
21+ lang_code : str ,
22+ is_enabled : bool ,
23+ device_model : str ,
24+ system_version : str ,
25+ app_version : str ,
26+ user_telegram_id : int ,
27+ access_hash : int
28+ ) -> Optional [Account ]:
29+ """Adds a new account, including its access_hash, to the database."""
1730 try :
1831 new_account = Account (
1932 account_name = account_name ,
@@ -24,52 +37,71 @@ async def add_account(db: AsyncSession, account_name: str, api_id: str, api_hash
2437 device_model = device_model ,
2538 system_version = system_version ,
2639 app_version = app_version ,
27- user_telegram_id = user_telegram_id
40+ user_telegram_id = user_telegram_id ,
41+ access_hash = access_hash
2842 )
2943 db .add (new_account )
3044 await db .flush ()
3145 return new_account
3246 except IntegrityError :
33- await db .rollback (); return None
47+ logger .warning (f"Account with name '{ account_name } ' or user_id '{ user_telegram_id } ' already exists." )
48+ await db .rollback ()
49+ return None
3450 except Exception as e :
35- await db .rollback (); raise e
51+ logger .error (f"Error adding account '{ account_name } ': { e } " )
52+ await db .rollback ()
53+ raise
3654
3755async def get_account (db : AsyncSession , account_name : str ) -> Optional [Account ]:
38- result = await db .execute (select (Account ).where (Account .account_name == account_name )); return result .scalars ().first ()
56+ """Retrieves an account by its name."""
57+ result = await db .execute (select (Account ).where (Account .account_name == account_name ))
58+ return result .scalars ().first ()
3959
4060async def get_account_by_id (db : AsyncSession , account_id : int ) -> Optional [Account ]:
41- result = await db .execute (select (Account ).where (Account .account_id == account_id )); return result .scalars ().first ()
61+ """Retrieves an account by its primary key ID."""
62+ result = await db .execute (select (Account ).where (Account .account_id == account_id ))
63+ return result .scalars ().first ()
4264
4365async def get_account_by_user_id (db : AsyncSession , user_id : int ) -> Optional [Account ]:
44- result = await db .execute (select (Account ).where (Account .user_telegram_id == user_id )); return result .scalars ().first ()
66+ """Retrieves an account by its Telegram User ID."""
67+ result = await db .execute (select (Account ).where (Account .user_telegram_id == user_id ))
68+ return result .scalars ().first ()
4569
4670async def get_all_accounts (db : AsyncSession ) -> List [Account ]:
47- result = await db .execute (select (Account ).options (selectinload (Account .session )).order_by (Account .account_id )); return result .scalars ().all ()
71+ """Retrieves all accounts from the database, with their sessions for status display."""
72+ result = await db .execute (select (Account ).options (selectinload (Account .session )).order_by (Account .account_id ))
73+ return result .scalars ().all ()
4874
4975async def get_all_active_accounts (db : AsyncSession ) -> List [Account ]:
50- result = await db .execute (select (Account ).where (Account .is_enabled == True )); return result .scalars ().all ()
76+ """Retrieves all enabled accounts from the database."""
77+ result = await db .execute (select (Account ).where (Account .is_enabled == True ))
78+ return result .scalars ().all ()
5179
5280async def delete_account (db : AsyncSession , account_name : str ) -> bool :
81+ """Deletes an account by its name."""
5382 account = await get_account (db , account_name )
5483 if not account : return False
5584 await db .delete (account )
5685 await db .flush ()
5786 return True
5887
5988async def toggle_account_status (db : AsyncSession , account_name : str ) -> Optional [bool ]:
89+ """Toggles the is_enabled status of an account."""
6090 account = await get_account (db , account_name )
6191 if not account : return None
6292 account .is_enabled = not account .is_enabled
6393 await db .flush ()
6494 return account .is_enabled
6595
6696async def update_account_lang (db : AsyncSession , account_id : int , lang_code : str ) -> bool :
97+ """Updates the language for a specific account."""
6798 stmt = update (Account ).where (Account .account_id == account_id ).values (lang_code = lang_code )
6899 result = await db .execute (stmt )
69100 return result .rowcount > 0
70101
71102# --- Session CRUD ---
72103async def get_session (db : AsyncSession , account_id : int ) -> Optional [Session ]:
104+ """Retrieves a session for a given account and decrypts its auth key."""
73105 result = await db .execute (select (Session ).where (Session .account_id == account_id ))
74106 session = result .scalars ().first ()
75107 if session and session .auth_key_data :
@@ -81,6 +113,7 @@ async def get_session(db: AsyncSession, account_id: int) -> Optional[Session]:
81113 return session
82114
83115async def add_or_update_session (db : AsyncSession , ** kwargs ) -> Optional [Session ]:
116+ """Adds or updates a session in the database, encrypting the auth key."""
84117 account_id = kwargs .get ("account_id" )
85118 if not account_id : return None
86119
@@ -101,13 +134,15 @@ async def add_or_update_session(db: AsyncSession, **kwargs) -> Optional[Session]
101134 return session
102135
103136async def delete_session (db : AsyncSession , account_id : int ) -> bool :
137+ """Deletes a session from the database."""
104138 stmt = delete (Session ).where (Session .account_id == account_id )
105139 result = await db .execute (stmt )
106140 await db .flush ()
107141 return result .rowcount > 0
108142
109143# --- Log Management ---
110144async def add_logs_bulk (db : AsyncSession , logs : List [Dict [str , Any ]]) -> None :
145+ """Adds a batch of log entries to the database."""
111146 if not logs : return
112147 try :
113148 db .add_all ([Log (** log_data ) for log_data in logs ])
@@ -116,6 +151,7 @@ async def add_logs_bulk(db: AsyncSession, logs: List[Dict[str, Any]]) -> None:
116151 print (f"CRITICAL: Error during bulk log insert: { e } " )
117152
118153async def get_logs_filtered (db : AsyncSession , limit : int , level : Optional [str ] = None , source : Optional [str ] = None ) -> List [Log ]:
154+ """Retrieves logs from the database with optional filters."""
119155 stmt = select (Log ).order_by (Log .timestamp .desc ()).limit (limit )
120156 if level :
121157 stmt = stmt .where (Log .level == level .upper ())
@@ -125,12 +161,14 @@ async def get_logs_filtered(db: AsyncSession, limit: int, level: Optional[str] =
125161 return result .scalars ().all ()
126162
127163async def delete_old_logs (db : AsyncSession , days_to_keep : int ) -> int :
164+ """Deletes log entries older than a specified number of days."""
128165 cutoff_date = datetime .now (timezone .utc ) - timedelta (days = days_to_keep )
129166 stmt = delete (Log ).where (Log .timestamp < cutoff_date )
130167 result = await db .execute (stmt )
131168 return result .rowcount
132169
133170async def purge_logs (db : AsyncSession ) -> int :
171+ """Deletes all log entries from the database."""
134172 stmt = delete (Log )
135173 result = await db .execute (stmt )
136174 return result .rowcount
0 commit comments