production-evyos-systems-an.../ServicesTask/app/services/parser/excel/main.py

80 lines
2.9 KiB
Python

import os
import asyncio
import fnmatch
from typing import Awaitable, Callable
from app.services.parser.excel.isbank.parser import parse_isbank_mail
from app.services.types.mail import MailParsedResult, PlainMailReader, ProcessMailObject
from app.services.common.service_base_async import ServiceBaseAsync
from app.services.types.queue import Enqueue
from app.services.types.task import Job
PRODUCE_BURST = int(os.getenv("PRODUCE_BURST", "10"))
PRODUCE_ONCE = os.getenv("PRODUCE_ONCE", "true").lower() == "true"
EVENT_TYPE = os.getenv("EVENT_TYPE", "db-mongo")
PROCESS_SEC = 10
bank_mail_dict = {
"ileti.isbank.com.tr": parse_isbank_mail
}
def grab_fn_callable(domain: str) -> Callable[[ServiceBaseAsync, dict], Awaitable[None]]:
for pat, fn in bank_mail_dict.items():
if fnmatch.fnmatch(domain, pat):
return fn
return None
async def produce(svc: ServiceBaseAsync):
await asyncio.sleep(PROCESS_SEC)
async def handle_from_parser(svc: ServiceBaseAsync, job: dict):
job_model = Job(**job)
await svc.ack_current()
await asyncio.sleep(PROCESS_SEC)
async def handle_from_mail_parser(svc: ServiceBaseAsync, job: dict):
job_model = Job(**job)
process_mail_object = ProcessMailObject(**job_model.payload)
mail_id = process_mail_object.data.id
task_id = f"IsBankServiceExcelParser_{mail_id}"
await asyncio.sleep(PROCESS_SEC)
function_handler = grab_fn_callable(process_mail_object.data.from_.domain)
if not function_handler:
await svc.dlq_current(job, error="Invalid domain")
return
parsed_data = function_handler(process_mail_object)
if not parsed_data:
plain_mail_data = PlainMailReader(**process_mail_object.data.model_dump())
parsed_result = MailParsedResult(task_id=task_id, mail_data=plain_mail_data.model_dump(), send_to="Completed", data=parsed_data)
print("Parser Excel Consumer from mail handle_from_mail :", parsed_result)
enqueue = Enqueue(task_id=task_id, payload=parsed_result.model_dump(), action="mail.service.publish")
await svc.enqueue(enqueue)
await svc.ack_current()
else:
plain_mail_data = PlainMailReader(**process_mail_object.data.model_dump())
parsed_result = MailParsedResult(task_id=task_id, mail_data=plain_mail_data.model_dump(), send_to="Completed", data=parsed_data)
enqueue = Enqueue(task_id=task_id, payload=parsed_result.model_dump(), action="parser.comment.publish")
await svc.enqueue(enqueue)
await svc.ack_current()
print("Parser Excel Consumer from mail handle_from_mail :", task_id)
async def consume_default(svc: ServiceBaseAsync, job: dict):
job_model = Job(**job)
await svc.ack_current()
await asyncio.sleep(PROCESS_SEC)
if __name__ == "__main__":
svc = ServiceBaseAsync(produce_fn=produce, consume_fn=consume_default, handlers={"parser.mail.publish": handle_from_mail_parser})
asyncio.run(svc.run())