# คู่มือขึ้น TestFlight (internal testing)

โหมด **internal testing** แจกได้สูงสุด 100 คน และ **ไม่ต้องผ่าน App Review** —
ผู้ทดสอบต้องถูกเพิ่มเป็น User ใน App Store Connect (ใช้ Apple ID ของเขาเอง)

---

## ขั้นที่ 1 — สมัคร Apple Developer Program (ต้องทำก่อน)

1. ไปที่ https://developer.apple.com/programs/enroll/ เข้าด้วย Apple ID เดิม
2. เลือก **Individual** (ถ้าใช้ชื่อมหาวิทยาลัย/องค์กรต้องมีเลข D-U-N-S ซึ่งใช้เวลานานกว่ามาก)
3. ยืนยันตัวตนด้วยบัตรประชาชน/พาสปอร์ตผ่านแอป Apple Developer บน iPhone
4. จ่าย $99 USD (~3,400 บาท) ด้วยบัตรเครดิต
5. รออนุมัติ ปกติ 24–48 ชั่วโมง

> ระหว่างรอ ทำขั้นที่ 2 (deploy backend) ไปพร้อมกันได้เลย

---

## ขั้นที่ 2 — deploy backend ขึ้น Railway ✅ เสร็จแล้ว

เซิร์ฟเวอร์ขึ้นออนไลน์เรียบร้อย:

- **API:** https://projectelder-production.up.railway.app/api
- โปรเจกต์ Railway: `happy-rebirth` · service `project_elder` + `MySQL`
- ผูกกับ GitHub `Thapanon112/project_elder` แล้ว — **push ขึ้น main เมื่อไหร่ Railway จะ redeploy ให้เอง**

### ค่าที่ตั้งไว้ (เผื่อต้องตั้งใหม่)

| ค่า | ที่ตั้งไว้ | หมายเหตุ |
|---|---|---|
| Root Directory | `server` | ไม่งั้น railpack หา project ไม่เจอ เพราะ root เป็นโปรเจกต์ Flutter |
| Health Check Path | `/api/health` | |
| Restart Policy | `ON_FAILURE` | |
| `MYSQL_URL` | อ้างอิงจาก service `MySQL` | `db.js` อ่านตัวแปรนี้เอง |
| Target port ของโดเมน | **8080** | Railway ฉีด `PORT=8080` ไม่ใช่ 3000 — ถ้าตั้ง 3000 จะได้ 502 |

> ⚠️ `railway.json` ใช้ไม่ได้แล้ว Railway เลิกรองรับ config as code
> ต้องตั้งค่าผ่านหน้า Settings ของ service หรือ `.railway/railway.ts`

### ถ้าต้องติดตั้งฐานข้อมูลใหม่

MySQL อยู่ในเครือข่ายภายใน (`mysql.railway.internal`) ต่อจากข้างนอกไม่ได้
ต้องเปิด TCP proxy ชั่วคราวก่อน แล้ว**ปิดทิ้งทุกครั้งเมื่อเสร็จ**:

```bash
railway link -p happy-rebirth -e production -s project_elder
railway tcp-proxy create -s MySQL --port 3306        # จดค่า endpoint ที่ได้
cd server && PW=$(railway variables -s MySQL --json | python3 -c "import sys,json,urllib.parse;print(urllib.parse.quote(json.load(sys.stdin)['MYSQLPASSWORD'],safe=''))") \
  && MYSQL_URL="mysql://root:${PW}@<endpoint>/railway" npm run db:init
railway tcp-proxy delete -s MySQL <proxy-id>         # อย่าลืมปิด
```

> `schema.sql` มี `DROP TABLE` อยู่ — รัน `db:init` ซ้ำ = **ข้อมูลเดิมหายทั้งหมด**

## ขั้นที่ 3 — ใส่ URL จริงลงในแอป ✅ เสร็จแล้ว

`lib/api.dart` ชี้ไป `https://projectelder-production.up.railway.app/api` แล้วเมื่อ build โหมด release
โหมด debug ยังชี้ `http://localhost:3000/api` เหมือนเดิม ไม่กระทบการพัฒนา

---

## ขั้นที่ 4 — สร้าง App ID และ app record

1. https://developer.apple.com/account/resources/identifiers → **+**
   → App IDs → App → Bundle ID = **`com.thapanon.medcare`** (explicit)
2. https://appstoreconnect.apple.com/apps → **+** → **New App**
   - Platform: iOS
   - Name: ชื่อที่จะแสดงบน TestFlight (ต้องไม่ซ้ำกับแอปอื่นทั้ง App Store)
   - Primary Language: Thai
   - Bundle ID: เลือก `com.thapanon.medcare` ที่เพิ่งสร้าง
   - SKU: อะไรก็ได้ เช่น `medcare-vhv-001`

---

## ขั้นที่ 5 — archive แล้วอัปโหลด

```bash
flutter build ipa --release
```

ครั้งแรกจะยังเซ็นไม่ผ่าน ให้เปิด Xcode ตั้ง signing ก่อนหนึ่งรอบ:

```bash
open ios/Runner.xcworkspace
```

- เลือก target **Runner** → แท็บ **Signing & Capabilities**
- ติ๊ก **Automatically manage signing**
- **Team** = ทีมที่ได้จาก Developer Program
- ตรวจว่า Bundle Identifier = `com.thapanon.medcare`

แล้วอัปโหลด — เลือกทางใดทางหนึ่ง:

**ทาง A (คำสั่งเดียว):**
```bash
flutter build ipa --release
xcrun altool --upload-app -f build/ios/ipa/*.ipa -t ios \
  -u <apple-id-ของคุณ> -p <app-specific-password>
```
`app-specific-password` สร้างที่ https://account.apple.com → Sign-In and Security → App-Specific Passwords

**ทาง B (ผ่าน Xcode):**
Product → Archive → Distribute App → App Store Connect → Upload

---

## ขั้นที่ 6 — เปิด TestFlight

1. App Store Connect → แอปของคุณ → แท็บ **TestFlight**
2. รอ build ประมวลผลเสร็จ (~5–15 นาที) สถานะจะเปลี่ยนเป็น **Ready to Test**
3. ตอบแบบสอบถาม **Export Compliance**
   แอปนี้ใช้แค่ HTTPS มาตรฐาน → ตอบ "ใช้การเข้ารหัส" แต่ **เข้าข่ายยกเว้น** → ไม่ต้องยื่นเอกสารเพิ่ม
4. **Internal Testing** → **+** สร้างกลุ่ม → เพิ่มผู้ทดสอบ
   (ต้องเพิ่ม Apple ID เขาเป็น User ในแอปก่อน ที่ Users and Access)
5. ผู้ทดสอบโหลดแอป **TestFlight** จาก App Store แล้วกดลิงก์เชิญในอีเมล

---

## เช็กลิสต์สถานะตอนนี้

| รายการ | สถานะ |
|---|---|
| build iOS ผ่าน (pods ครบ) | ✅ |
| Bundle ID `com.thapanon.medcare` | ✅ |
| ชื่อแอปบนเครื่อง "MedCare อสม." | ✅ |
| iPhone อย่างเดียว (ไม่ต้องกังวล layout iPad) | ✅ |
| คำขอสิทธิ์ตำแหน่งภาษาไทยใน Info.plist | ✅ |
| release build ชี้ HTTPS ไม่ใช่ localhost | ✅ |
| backend ออนไลน์บน HTTPS | ✅ |
| Apple Developer Program | ⬜ ขั้นที่ 1 |
| ไอคอนแอป (ยังเป็นไอคอน Flutter default) | ⬜ ไม่บังคับสำหรับ internal test |
| จำการเข้าสู่ระบบ (ตอนนี้ปิดแอปแล้วต้องล็อกอินใหม่) | ⬜ ไม่บังคับ แต่ผู้ทดสอบจะรำคาญ |

สองข้อล่างไม่บล็อก internal testing แต่ถ้าจะขึ้น App Store จริงต้องทำ
พร้อมกับปุ่มลบบัญชีในแอป (Guideline 5.1.1(v)) และ Privacy Policy
