# DB Migration Plan (เฟส 5 + เฟส 2 profile schema)
อัปเดต: 25 กุมภาพันธ์ 2026

## เป้าหมาย
- รองรับ ingestion ผ่าน API แบบต่อเนื่องด้วย schema เดิมของ WepAppOpus
- เพิ่มดัชนีที่จำเป็นสำหรับ query/UPSERT รายวัน
- เพิ่มตาราง checkpoint สำหรับเก็บ state ต่อ ad account

## ตาราง/ดัชนีที่เพิ่ม
1) `api_checkpoints` (ใหม่)  
   - columns: `account_id` (uniq), `checkpoint_date` (DATE/TEXT), `cursor` (nullable), `updated_at`  
   - ใช้เก็บ cursor/วันที่ล่าสุดที่ดึงสำเร็จต่อ account
2) ดัชนี `ad_entries.row_hash` (UNIQUE) — บังคับ dedup ผ่าน UPSERT
3) ดัชนี `ad_entries (date, account_id)` — เร่ง query dashboard/ingestion
4) ดัชนี `import_logs (status, uploaded_at)` — ใช้ติดตาม job status/monitoring
5) `auth_users` (ensure table สำหรับ login/RBAC)
6) `auth_user_api_profiles` (ใหม่)  
   - owner ต่อ user, มี `is_default`, `is_active`, `last_used_at`
   - unique `(user_id, profile_name)`
   - จำกัด default 1 อันต่อ user ผ่าน unique strategy
7) `auth_user_api_sources` (ใหม่)  
   - หลาย token source ต่อ profile (`source_key`, `source_label`, `access_token_enc`)
   - unique `(profile_id, source_key)`
8) `auth_user_api_accounts` (ใหม่)  
   - preset account list ต่อ profile
   - unique `(profile_id, source_key, account_id)`
9) `auth_user_api_audit` (ใหม่)  
   - บันทึก action สำคัญของ profile/token config

## สคริปต์ที่เพิ่ม
- `src/db/sql.ts` — SQL statement สำหรับ SQLite + MySQL + index existence checks
- `src/db/run-migrations.ts` — runner อัตโนมัติ ตรวจสอบก่อนสร้าง (safe rerun)
- NPM script: `npm run db:migrate`

## การทำงาน
- ถ้า `DATABASE_URL` ถูกตั้ง → ใช้ MySQL (mysql2/promise)  
  - ตรวจ `information_schema` ก่อนสร้าง table/index เพื่อหลีกเลี่ยง error  
  - สร้าง `api_checkpoints` + ชุดตาราง profile/token/audit เมื่อไม่พบ
- ถ้าไม่มี `DATABASE_URL` → ใช้ SQLite (better-sqlite3) ที่ `ADS_DB_PATH` (หรือ fallback ../WepAppOpus/db/ads.db)

## ผลกระทบต่อ WepAppOpus
- ไม่มีการเปลี่ยนแปลงคอลัมน์เดิมของ `ad_entries` / `import_logs`; เพิ่มแค่ดัชนี
- `api_checkpoints` เป็นตารางใหม่ ไม่กระทบ UI เดิม
- ตาราง `auth_user_api_*` รองรับระบบ profile token per-user โดยไม่เปลี่ยนโครงสร้าง `ad_entries`

## วิธีรัน
```bash
cd WepAppOpusApi
npm install    # ครั้งแรก
npm run db:migrate
```

## ตรวจสอบหลังรัน
- MySQL: ตรวจ `SHOW INDEX FROM ad_entries LIKE 'idx_ad_entries_row_hash';`
- SQLite: ใช้ `sqlite3 db/ads.db '.schema api_checkpoints'`
