[docs]asyncdefcreate_task(task_type:str,data:dict[str,Any],status:str="pending",result:Optional[str]=None,)->Task:"""Create a generic task. :param task_type: Task type :param data: Task data :param status: Task status :param result: Task result :returns: Task instance """asyncwithSessionLocal()assession:task=Task(task_type=task_type,data=json.dumps(data),status=status,result=result)session.add(task)awaitsession.commit()awaitsession.refresh(task)returntask
[docs]asyncdeflist_pending_tasks()->List[Task]:"""List pending tasks. :returns: List of Task instances """asyncwithSessionLocal()assession:result=awaitsession.execute(select(Task).where(Task.status=="pending").order_by(Task.created_at.asc()))returnlist(result.scalars().all())
[docs]asyncdefmark_task_completed(task_id:int,result_text:Optional[str])->None:"""Mark task as completed. :param task_id: Task ID :param result_text: Result text """asyncwithSessionLocal()assession:task=awaitsession.get(Task,task_id)iftaskisNone:returntask.status="completed"task.result=result_texttask.updated_at=datetime.now()awaitsession.commit()
[docs]asyncdefmark_task_failed(task_id:int,error_text:str)->None:"""Mark task as failed. :param task_id: Task ID :param error_text: Error text """asyncwithSessionLocal()assession:task=awaitsession.get(Task,task_id)iftaskisNone:returntask.status="failed"task.result=error_texttask.updated_at=datetime.now()awaitsession.commit()
[docs]asyncdeflist_completed_tasks_since(last_id:int)->List[Task]:"""List completed tasks since last ID. :param last_id: Last task ID :returns: List of Task instances """asyncwithSessionLocal()assession:result=awaitsession.execute(select(Task).where(and_(Task.id>last_id,Task.status=="completed")).order_by(Task.id.asc()))returnlist(result.scalars().all())
[docs]asyncdefmark_task_sent(task_id:int)->None:"""Mark task as sent. :param task_id: Task ID """asyncwithSessionLocal()assession:task=awaitsession.get(Task,task_id)iftaskisNone:returntask.status="sent"task.updated_at=datetime.now()awaitsession.commit()
[docs]asyncdefget_task(task_id:int)->Optional[Task]:"""Get task by ID. :param task_id: Task ID :returns: Task instance or None """asyncwithSessionLocal()assession:returnawaitsession.get(Task,task_id)