""" AUTHOR: Khushal P Soonderji DATE: Tuesday, 3rd Dec., 2024 OBJECTIVE: To enlist and retrieve mails for various filtering conditions. REFERENCES: N/A DOWNLOADS: N/A """ # ***************************************************************************************************************** # ***** **** # *** IMPORT *** # ***** **** # ***************************************************************************************************************** # To make sibling directories accessible for imports: import sys sys.path.append(".") sys.path.append("..") # My async utils: from utils_v2.string import json from utils_v2.date_time import date_time from utils_v2.database.async_mongo_v2 import AsyncMongo # Base model: from models.behaviour.base import BaseModel # To work with MongoDB: from bson import ObjectId # To work with datatypes: from typing import Literal # For asynchronous activities: import asyncio # ***************************************************************************************************************** # ***** **** # *** MACROS / ONE-TIME INIT *** # ***** **** # ***************************************************************************************************************** # --- Nothing Yet # ***************************************************************************************************************** # ***** **** # *** VARIABLES *** # ***** **** # ***************************************************************************************************************** # --- Nothing Yet # ***************************************************************************************************************** # ***** **** # *** FUNCTIONS *** # ***** **** # ***************************************************************************************************************** # --- Nothing Yet # ***************************************************************************************************************** # ***** **** # *** CLASSES *** # ***** **** # ***************************************************************************************************************** class MailRetrieveModel(BaseModel): # For MongoDB: AUTH_COLLECTION = "_authTokens" MAIL_COLLECTION = "_messages" async def get_mail( self, mongo_conn: AsyncMongo, mail_id: str | ObjectId ): """ Retrieves one full mail from the database. :param mongo_conn: The instance of the database connector to use to get the mail's data. :param mail_id: The '_id' of the document that holds the mail. :return: Either the JSON that describes the mail or None if such a mail does not exist. """ # Get the data from the database: mail_data = await mongo_conn.find_one( collection = self.MAIL_COLLECTION, filter = {"_id": ObjectId(mail_id)}, projection = { "_id": True, "serviceType": True, "client": True, "payload.ts": True, "payload.readTs": True, "payload.from": True, "payload.to": True, "payload.cc": True, "payload.bcc": True, "payload.parts": True, "payload.attachments": True, "payload.labels": True, "payload.snippet": True, "payload.aiSnippet": True, } ) # Format the data: if mail_data: mail_data["mailId"] = str(mail_data.pop("_id")) mail_data["payload"]["ts"] = mail_data["payload"]["ts"].isoformat() mail_data["payload"]["readTs"] = mail_data["payload"]["readTs"].isoformat() if ai_snippet := mail_data["payload"].pop("aiSnippet"): mail_data["payload"]["aiSnippet"] = ai_snippet["snippet"] # Done here: return mail_data async def list_for_token_id( self, mongo_conn: AsyncMongo, token_id: str | ObjectId, limit: int = 25, skip: int = 0 ): """ To enlist mails for one account. :param mongo_conn: The instance of the database connector to use to get the mail's data. :param token_id: The id of the document in the database that holds the tokens to access the account. :param limit: How many records to fetch. :param skip: How many initial records to skip. useful for pagination. :return: Either the JSON that describes the mails or None if something failed. """ # Get the data from the database: mails_list = await mongo_conn.find_many( collection = self.MAIL_COLLECTION, filter = {"tokenId": ObjectId(token_id)}, projection = { "_id": True, "serviceType": True, "client": True, "payload.ts": True, "payload.readTs": True, "payload.from": True, "payload.labels": True, "payload.snippet": True, "payload.aiSnippet": True, }, limit = limit, skip = skip, sort = {"payload.ts": -1} ) # Format the data: if mails_list: for mail_data in mails_list: mail_data["mailId"] = str(mail_data.pop("_id")) mail_data["payload"]["ts"] = mail_data["payload"]["ts"].isoformat() mail_data["payload"]["readTs"] = mail_data["payload"]["readTs"].isoformat() if ai_snippet := mail_data["payload"].pop("aiSnippet"): mail_data["payload"]["aiSnippet"] = ai_snippet["snippet"] # Done here: return mails_list # ***************************************************************************************************************** # ***** **** # *** MAIN PROGRAM *** # ***** **** # ***************************************************************************************************************** if __name__ == "__main__": pass