(20241203) Mails sync'ing, listing, and fetching done.

This commit is contained in:
2024-12-03 16:01:08 +05:30
parent 3b5a1fc92f
commit bef8f6ef0d
8 changed files with 137 additions and 223 deletions
+54 -5
View File
@@ -108,11 +108,12 @@ class MailRetrieveModel(BaseModel):
: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_identifier)},
projection = {
"mailId": "_id",
"_id": True,
"serviceType": True,
"client": True,
"payload.ts": True,
@@ -125,13 +126,22 @@ class MailRetrieveModel(BaseModel):
"payload.attachments": True,
"payload.labels": True,
"payload.snippet": True,
"payload.aiSnippet": "payload.aiSnippet.snippet",
"payload.aiSnippet": True,
}
)
if mail_data: mail_data["mailId"] = str(mail_data["mailId"])
# 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_by_account_identifier(
async def list_for_account_identifier(
self,
mongo_conn: AsyncMongo,
account_identifier: str | ObjectId,
@@ -139,7 +149,46 @@ class MailRetrieveModel(BaseModel):
skip: int = 0
):
pass
"""
To enlist mails for one account.
:param mongo_conn: The instance of the database connector to use to get the mail's data.
:param account_identifier: 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 = {"accountId": ObjectId(account_identifier)},
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
# *****************************************************************************************************************