import asyncio from datetime import datetime, timedelta from typing import Dict, List, Optional from server.constants.private import MESSAGE_TYPE_TABLE_MAP, MessagesType from server.db.models.base import Base from server.utils.private import generate_filter_or_in async def _delete_messages_one_table( table: Base, app_slug: str, id_list: Optional[List[int]], event_id_list: Optional[List[int]], external_id_list: Optional[List[str]], message_id_list: Optional[List[int]], account_id_list: Optional[List[int]], days_count: Optional[int], limit: Optional[int], ) -> List[int]: """Delete messages. Args: table: Table. app_slug: App code. id_list: Message table ID list. event_id_list: Event ID list. external_id_list: External ID list. message_id_list: Message ID list. account_id_list: Account ID list. days_count: Messages created before days count from now. limit: Delete not more than limit records. Returns: Removed rows ID list. """ filter_list = [table.app_slug == app_slug] id_filter = generate_filter_or_in( table, id=id_list, event_id=event_id_list, external_id=external_id_list, message_id=message_id_list, account_id=account_id_list, ) if id_filter is not None: filter_list.append(id_filter) if days_count: filter_list.append(table.created_at <= (datetime.utcnow() - timedelta(days=days_count))) return await table.delete(filters=filter_list, return_source=table.id, return_single_column=True, limit=limit) async def delete_messages( type_list: List[MessagesType], app_slug: str, id_list: Optional[List[int]], event_id_list: Optional[List[int]], external_id_list: Optional[List[str]], message_id_list: Optional[List[int]], account_id_list: Optional[List[int]], days_count: Optional[int], limit: Optional[int], ) -> Dict[str, int]: """Delete messages. Args: type_list: Table type list. app_slug: App code. id_list: Message table ID list. event_id_list: Event ID list. external_id_list: External ID list. message_id_list: Message ID list. account_id_list: Account ID list. days_count: Messages created before days count from now. limit: Delete not more than limit records. Returns: Table name to removed ID list map. """ task_list = [ _delete_messages_one_table( MESSAGE_TYPE_TABLE_MAP[message_type], app_slug, id_list, event_id_list, external_id_list, message_id_list, account_id_list, days_count, limit, ) for message_type in type_list ] result = await asyncio.gather(*task_list) return dict(zip([i.value for i in type_list], result))