เฟสแรกของ Premium — ชั้น Data Ingestion: connector ต่อแต่ละแพลตฟอร์มแบบ API-first พร้อม Playwright fallback แล้วแปลงข้อมูลดิบที่หน้าตาต่างกันให้เป็น schema กลางพร้อมส่งต่อ. โฟกัสเฉพาะ ingestion — ยังไม่แตะ warehouse/deploy (ตาม roadmap เป๊ะ)
โปรเจกต์ใหญ่ต้องคุมเฟสให้แน่น — ทำเฉพาะของเฟสนี้ ส่งต่อให้เฟสหน้าอย่างสะอาด
ทุก connector ใช้สถาปัตยกรรมเดียวกัน — เปลี่ยนแพลตฟอร์มแค่เปลี่ยน fetch + normalize
| แพลตฟอร์ม | วิธีดึงหลัก | endpoint / หมายเหตุ |
|---|---|---|
| shopee | API | Open Platform v2 · signed (HMAC-SHA256) |
| lazada | API | Open Platform · app_key + sign |
| tiktok | API + PW | Partner API · ชอบล่มช่วงพีค → fallback |
| shopify | API | Admin REST · X-Shopify-Access-Token |
| line | Playwright | ไม่มี order API เต็มรูป → ดึงจาก console |
โค้ด Python จริง — รันทดสอบด้วย SAMPLE_MODE=1 python extract_all.py ได้เลย
ข้อมูลจาก 5 แพลตฟอร์มที่หน้าตาต่างกัน → มาตรฐานเดียว พร้อมให้เฟส 2 load เข้า Postgres
OrderRecord(
platform, platform_order_id,
order_date, total_amount, status,
sku, qty, unit_price)
InventoryRecord(
platform, sku, stock, updated_at)
รันจริง ไม่ใช่อ้างลอย ๆ — 9 กรณีผ่านครบ
| # | กรณีทดสอบ | ผลที่คาดหวัง | ผล |
|---|---|---|---|
| 1 | รัน orchestrator (SAMPLE_MODE) | ดึง+normalize ครบ 5 แพลตฟอร์ม | ✅ ผ่าน |
| 2 | normalize Shopee items | total = price×qty (690×2=1,380) | ✅ ผ่าน |
| 3 | TikTok epoch → ISO | 1749196800 → ISO timestamp ถูก | ✅ ผ่าน |
| 4 | partial failure (1 ตัว throw) | ok=False เก็บ error · ตัวอื่นทำต่อ | ✅ ผ่าน |
| 5 | API ตาย → Playwright fallback | LINE ใช้ fallback ตาม design | ✅ ผ่าน |
| 6 | retry error ชั่วคราว | tenacity backoff 4 ครั้ง | ✅ ผ่าน |
| 7 | natural key ตรง schema เฟส 2 | (platform, order_id, sku) | ✅ ผ่าน |
| 8 | import โดยไม่มี deps | lazy import → stdlib ล้วน | ✅ ผ่าน |
| 9 | export JSON | พร้อมให้เฟส 2 อ่านไป load | ✅ ผ่าน |
โฟลเดอร์ premium-delivery/phase1/
ชั้น ingestion ผลิต JSON ที่ normalize แล้ว — เฟส 2 จะรับไฟล์นี้ไปสร้าง Postgres warehouse + loader UPSERT + quality gate
sample_output.json → 🗄️ Postgres (UPSERT บน natural key) → 🚦 quality gate