04 — TaskService — Integration Contract
Integration contract ที่ orchestrator ต้องการจาก Task — endpoint paths/shape (M9-M11) เป็นข้อเสนอไปคุยกับทีม Task
อัปเดต: 2026-06-15
อ่าน 00-OVERVIEW.md + CONTEXT.md ก่อน Scope (grill 2026-06-15): ไฟล์นี้ = integration contract ที่ orchestrator ต้องการจาก Task — endpoint paths/shape (M9-M11) เป็น ข้อเสนอไปคุยกับทีม Task ไม่ใช่ค่าที่ lock ฝ่ายเดียว บทบาท: Task = ที่เก็บ “งาน” ที่เปิดเมื่อมี request จาก Lego (ผ่าน orchestrator) — orchestrator เรียกผ่าน HTTP (
ITaskPort) สถานะปัจจุบัน: create มี (แต่ไม่ idempotent-by-refNo, คืน TaskID ใน Result, 200), GET /ref คืน 200+null ตอน miss, ไม่มี MarkRework
บทบาทของ Task ในระบบนี้
orchestrator เรียก Task ตาม saga lifecycle:
| ตอน | Saga event | → Task |
|---|---|---|
| submit (first) | TaskCreationRequested | create |
| rework/resubmit | TaskReworkRequested | mark-rework |
| approve | TaskCompleteRequested | complete |
| reject / cancel | TaskCloseRequested | close |
idempotency อยู่ฝั่ง orchestrator (decision C — skip create ถ้า
Correlations.TaskIdมีแล้ว); Task UNIQUE(RefNo) เป็น follow-up ไม่ block งานนี้
Tasks
T1 — Create task (มีแล้ว — ยืนยัน contract)
- คืน TaskID ให้ orchestrator เก็บใน
Correlations.TaskId - (follow-up, ไม่ block) เพิ่ม unique index บน RefNo เป็น defense-in-depth
T2 — NEW: mark-rework (PATCH)
- เปลี่ยน task ที่เปิดอยู่เป็นสถานะ “ส่งกลับแก้ไข” (ไม่ปิด — owner กำลังแก้)
- รับ taskId หรือ refNo
T3 — NEW: close + complete
- complete (approve): ปิดแบบสำเร็จ
- close (reject/cancel): ปิดแบบยกเลิก
- idempotent: ปิด task ที่ปิดแล้ว = no-op (200) — สำคัญสำหรับ cancel double-sweep + cancel-vs-create race (00 §6)
T4 — GET by ref (มีแล้ว — ปรับ contract)
- ปัจจุบัน miss → 200 + null; ปรับเป็น 404 ถ้า orchestrator ต้องแยก “ไม่มี” ออกจาก “มีแต่ null” (คุยกับ orchestrator adapter P3)
Test checklist
- create คืน TaskID
- mark-rework เปลี่ยนสถานะถูก (ไม่ปิด task)
- complete / close แยกผลถูก
- close idempotent (ปิดซ้ำ = no-op 200)
- GET by ref miss → 404 (ถ้าตกลงตาม T4)
Phase-0 ต้อง ratify
- Endpoint paths M9-M11 (00 §7.1)
- contract miss-behavior ของ GET /ref (T4) กับ orchestrator
- ใครถือ idempotency key (orchestrator saga-state ตาม decision C — Task ไม่ต้องทำ แต่ต้องรู้)