File size: 2,668 Bytes
b002e56
f03ceb1
b002e56
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f03ceb1
b002e56
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f03ceb1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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()