from app.celery_app import celery from app.database import SessionLocal from app import models from app.llm import generate_draft from app.utils.emailer import send_email from app.utils.x_client import post_to_x from app.utils.note_client import post_to_note @celery.task() def task_generate_draft(draft_id: int): db = SessionLocal() try: draft = db.get(models.Draft, draft_id) if not draft: return {"error": "draft not found"} title, body_md, subj_a, subj_b = generate_draft( draft.raw_text or "", draft.content_type.value, draft.tone.value ) draft.title = title draft.body_md = body_md draft.subject_a = subj_a draft.subject_b = subj_b draft.status = models.DraftStatus.pending db.add(draft) db.commit() db.refresh(draft) return {"id": draft.id, "status": draft.status.value} finally: db.close() @celery.task() def task_deliver(draft_id: int): db = SessionLocal() try: draft = db.get(models.Draft, draft_id) if not draft: return {"error": "draft not found"} results = [] # Email if draft.deliver_email_list: recipients = [e.strip() for e in draft.deliver_email_list.split(',') if e.strip()] res = send_email(recipients, draft.subject_a or draft.title or "お知らせ", draft.subject_b or draft.title or "お知らせ", draft.body_md or "") delivery = models.Delivery(draft_id=draft.id, channel=models.DeliveryChannel.email, payload={"recipients": recipients}, result=res) db.add(delivery); db.commit(); db.refresh(delivery) results.append({"email": res}) # X if draft.deliver_x: text = f"{draft.title}\n\n{(draft.body_md or '')[:220]}" res = post_to_x(text) delivery = models.Delivery(draft_id=draft.id, channel=models.DeliveryChannel.x, payload={"text": text[:280]}, result=res) db.add(delivery); db.commit(); db.refresh(delivery) results.append({"x": res}) # note if draft.deliver_note: res = post_to_note(draft.title or "お知らせ", draft.body_md or "") delivery = models.Delivery(draft_id=draft.id, channel=models.DeliveryChannel.note, payload={"title": draft.title}, result=res) db.add(delivery); db.commit(); db.refresh(delivery) results.append({"note": res}) draft.status = models.DraftStatus.sent db.add(draft); db.commit(); db.refresh(draft) return {"id": draft.id, "results": results} finally: db.close()