# Onboarding (ภาษาไทย)

> เริ่มจากศูนย์ถึงรันแอปได้ ภายใน 5 นาที. English mirror: [`README.md`](README.md).

## สิ่งที่ต้องมีก่อน

| เครื่องมือ       | เวอร์ชัน                   | ตรวจสอบ                                        |
| ---------------- | -------------------------- | ---------------------------------------------- |
| Node.js          | ≥ 20.11 (กำหนดใน `.nvmrc`) | `node --version`                               |
| pnpm             | 9.x                        | `pnpm --version`                               |
| .NET SDK         | 9.x                        | `dotnet --version`                             |
| Docker + Compose | 24.x+                      | `docker --version` && `docker compose version` |
| Git              | 2.40+                      | `git --version`                                |

ติดตั้ง pnpm ถ้ายังไม่มี: `npm install -g pnpm`. ที่เหลือดูจากตัวติดตั้งของแต่ละแพลตฟอร์ม.

## 1. ดึงโค้ด (≤ 30 วินาที)

```bash
git clone <repo-url> loma-portal
cd loma-portal
```

## 2. ติดตั้ง dependencies (≤ 90 วินาที ถ้า cache อุ่นแล้ว)

```bash
pnpm install
cd dotnet && dotnet restore && cd ..
```

ถ้า `pnpm install` ฟ้องเรื่อง Node version ให้ติดตั้ง Node 20.11 (ตรงกับ `.nvmrc`). ถ้า `eslint-visitor-keys` ล้ม — root `pnpm.overrides` pin ไว้แล้ว ลองรันใหม่.

## 3. รัน services ใน local (≤ 60 วินาที)

```bash
cp .env.example .env
docker compose up -d
docker compose ps     # postgres + redis + sqlserver ต้องขึ้น "healthy"
```

## 4. เตรียม DB (≤ 60 วินาที)

```bash
pnpm db:migrate       # ครั้งแรกจะถามยืนยัน — ตอบ yes
pnpm db:seed          # สร้าง user admin
```

Admin default: `admin@loma-portal.local` / `ChangeMeOn-FirstLogin!2026`. เปลี่ยนได้ผ่าน env (ดู [`prisma/README.md`](../../prisma/README.md)).

## 5. รันแอป (≤ 60 วินาที จนพร้อมใช้งาน)

```bash
pnpm dev              # รัน Angular + .NET + NestJS + worker พร้อมกันผ่าน turbo
```

| URL                           | คืออะไร                  |
| ----------------------------- | ------------------------ |
| http://localhost:4200         | Angular frontend (หลัก)  |
| http://localhost:3000         | Next.js frontend (สำรอง) |
| http://localhost:5080         | .NET API (canonical)     |
| http://localhost:5080/swagger | Swagger UI               |
| http://localhost:3001         | NestJS API               |
| http://localhost:3001/docs    | NestJS Swagger UI        |

เปิด http://localhost:4200 → ล็อกอินด้วย admin ที่ seed → เห็น dashboard. **เท่านี้ถือว่า Day-1 success.**

## 6. เปิดใช้กับ Claude Code

```bash
claude
```

Claude Code จะอ่าน [`CLAUDE.md`](../../CLAUDE.md) ให้อัตโนมัติ จากนั้นใช้คำสั่ง `/create-feature`, `/review-code`, `/db-migrate` ฯลฯ (ดู [`.claude/commands/`](../../.claude/commands/)).

## ต่อจากนี้ทำอะไร (ตามบทบาท)

### Frontend

- อ่าน [`apps/web-angular/README.md`](../../apps/web-angular/README.md) — convention หลัก
- อ่าน [`knowledge/patterns/angular-signals.md`](../../knowledge/patterns/angular-signals.md)
- เริ่มจาก `/create-page <route>` กับ ticket UI เล็ก ๆ

### Backend

- อ่าน [`dotnet/README.md`](../../dotnet/README.md) + [`knowledge/patterns/clean-architecture-dotnet.md`](../../knowledge/patterns/clean-architecture-dotnet.md)
- เปิด `dotnet/Loma.Portal.sln` ใน IDE
- เริ่มจาก `/create-api <METHOD> <route> <domain>` กับ endpoint เล็ก ๆ

### Full-stack feature

- รัน `/create-feature <name>` — orchestrate DB → API → UI พร้อม skills + agents ที่เกี่ยวข้อง

### DevOps

- อ่าน [`platform/README.md`](../../platform/README.md) + [`docs/runbooks/`](../runbooks/)
- ดู CI: [`.gitlab-ci.yml`](../../.gitlab-ci.yml) (หลัก) + [`.github/workflows/`](../../.github/workflows/) (parallel)

## Troubleshooting

| อาการ                               | แก้อย่างไร                                                                                  |
| ----------------------------------- | ------------------------------------------------------------------------------------------- |
| `pnpm install` ฟ้อง Node engine     | ใช้ Node 20.11 (ตรง `.nvmrc`); ติดตั้งใหม่ผ่าน nvm/fnm                                      |
| `docker compose up` ฟ้องว่า port ชน | หยุด service ที่ใช้ port อยู่; ต้องว่าง 5432/6379/1433                                      |
| ล็อกอินแล้วได้ 401                  | เช็คว่า `pnpm db:seed` รันแล้ว; `.env` `JWT_ACCESS_SECRET` ต้อง ≥ 32 ตัวอักษร               |
| `dotnet build` ขึ้น NU1902          | OpenTelemetry advisory chain — `NoWarn=NU1902` set ที่ Api csproj ไว้แล้ว ลอง clean restore |
| `pnpm validate` ฟ้อง format         | `pnpm format` แล้วลองใหม่                                                                   |
| Husky pre-commit บล็อก `rm -rf`     | bash-guard hook ตั้งใจให้บล็อก ปลอดภัยแล้ว                                                  |

## เช็คลิสต์ Day-1 success

- [ ] `pnpm install` ผ่าน
- [ ] `docker compose up -d` ขึ้น healthy ทั้ง 3 services
- [ ] `pnpm dev` รันไม่มี error
- [ ] Claude Code โหลด `CLAUDE.md` ไม่มี warning
- [ ] `pnpm validate` ผ่าน
- [ ] `pnpm test` ผ่าน
- [ ] Browser ล็อกอินด้วย admin ที่ seed แล้วเห็น dashboard
- [ ] ไฟล์นี้ + `README.md` พาคุณมาถึงตรงนี้

ถ้าข้อใดล้ม แสดงว่า onboarding มี bug — เปิด issue.

## ศึกษาต่อ

- [`CLAUDE.md`](../../CLAUDE.md) — repo memory + convention
- [`AGENTS.md`](../../AGENTS.md) — agent roster
- [`docs/architecture/overview.md`](../architecture/overview.md) — C4 diagram
- [`docs/decisions/`](../decisions/) — เหตุผลที่เลือกสถาปัตยกรรมแบบนี้
- [`docs/runbooks/`](../runbooks/) — วิธีปฏิบัติงาน
- [`docs/compliance/`](../compliance/) — PDPA + GDPR
