# Resolusi: `GET /api/v1/org/divisions` mengembalikan **404** (halaman Employees)

Dokumen ini menjawab: **error ini karena apa, diperbaiki di FE atau BE, dan apa yang harus dilakukan di server.**

---

## Ringkasan

| Aspek | Jawaban singkat |
|--------|------------------|
| **Penyebab** | Proses yang menerima permintaan **tidak punya handler** untuk path `GET /api/v1/org/divisions` — umumnya **binary API (Gin) belum di-deploy ulang** setelah route ditambahkan, atau **reverse proxy** / **Nuxt proxy** mengarahkan ke proses yang salah. |
| **Perbaikan di FE?** | **Tidak** untuk kasus **404** ini. FE memanggil URL yang benar, misalnya: `/workpulse-api/api/v1/org/divisions?limit=500&active=all`. |
| **Perbaikan di BE / ops** | **Deploy & routing:** build binary yang memuat route, migrasi DB, restart API, pastikan proxy dan (di FE) **`WORKPULSE_INTERNAL_API_ORIGIN`** benar. **Tidak perlu mengubah kontrak URL** jika kode BE di repo sudah sesuai spesifikasi. |

Jika setelah deploy benar Anda mendapat **500** (bukan 404), kemungkinan lain: tabel **`org_divisions`** / **`org_division_members`** / kolom **`description`** belum ada — migrasi **`000003`–`000005`** belum dijalankan pada DB yang dipakai API itu.

---

## Rantai permintaan (agar tim infra paham)

1. Browser → `https://<host>/workpulse-api/api/v1/org/divisions?...`
2. **Nuxt (Nitro)** — route `server/routes/workpulse-api/[...path].ts` (repo FE) mem‑proxy ke **`WORKPULSE_INTERNAL_API_ORIGIN`** (mis. `http://127.0.0.1:3040`) dengan path yang sama setelah prefix `/workpulse-api/`.
3. **Gin (`workpulse-api`)** — harus mendaftarkan `GET /api/v1/org/divisions` di bawah grup terautentikasi.

**404** berarti langkah **2 atau 3** mengarah ke proses yang **bukan** build Gin yang berisi route tersebut, atau Gin memang belum punya route (**build lama**).

---

## File sumber di repo BE (referensi)

| File | Isi relevan |
|------|-------------|
| [`internal/api/router.go`](../internal/api/router.go) | `authz.GET("/org/divisions", s.listOrgDivisions)` dan grup `orgDivAdmin` untuk mutasi. |
| [`internal/api/org_divisions.go`](../internal/api/org_divisions.go) | Handler `listOrgDivisions`, anggota, `POST`/`PATCH`, dll. |
| Migrasi | `000003_org_divisions`, `000004_users_primary_org_division`, `000005_org_division_members` — wajib di DB **sebelum** query bisa sukses (kegagalan biasanya **500**, bukan 404, jika tabel belum ada). |

---

## Checklist deploy / ops (urutan disarankan)

1. **Pastikan kode** di server build dari branch/commit yang **sudah** memuat `GET /org/divisions` di `router.go`.
2. **Build ulang** binary API (Gin), **ganti** binary yang dijalankan PM2/systemd.
3. **Jalankan migrasi** basis data ke lingkungan yang sama dengan API itu (`000003` … `000005`).
4. **Restart** proses API, mis. `pm2 restart workpulse-api` (sesuaikan nama proses).
5. **Verifikasi langsung ke Gin** (di mesin API, tanpa lewat Apache):
   - Gunakan **GET**, bukan `curl -I` (HEAD): Gin tidak selalu mendaftarkan HEAD untuk rute yang sama — HEAD bisa **404** padahal GET **401/200**.
   - Tanpa token (cek rute ada): `curl -s -o /dev/null -w "%{http_code}\n" "http://127.0.0.1:3040/api/v1/org/divisions?limit=10"` → harapkan **401**, bukan **404**.
   - Dengan token superadmin: `curl -s -H "Authorization: Bearer <token>" "http://127.0.0.1:3040/api/v1/org/divisions?limit=10&active=all"` → **200** + envelope `ok`.
6. **Verifikasi Nuxt / PM2 `workpulse-fe`** (repo FE):
   - Env **`WORKPULSE_INTERNAL_API_ORIGIN`** harus ke host:port tempat Gin di langkah 5 mendengar (`ecosystem.config.cjs`, `nuxt.config.ts`).
7. **Reverse proxy (Apache/Nginx)** di depan FE:
   - Prefix **`/workpulse-api`** harus ke **Node (Nitro)**, yang lalu mem‑proxy ke Gin — jangan ke host yang masih menjalankan **build API lama**.

Setelah langkah **5** mengembalikan **200**, tetapi dari browser masih **404**, fokus ke **6–7** (Nitro + proxy).

---

## Peringatan terpisah di konsol: “Hydration completed but contains mismatches”

Itu **isu lain** (SSR vs klien tidak identik), biasanya data yang hanya ada di klien. **Bukan penyebab langsung** HTTP **404** pada `org/divisions`. Perbaikannya **FE** terpisah (selaraskan SSR dengan klien atau tunda konten yang bergantung pada `localStorage`).

---

## Rujukan kontrak API (repo BE)

- [`BE_SPEC_ORG_DIVISIONS_MASTER_AND_CRUD.md`](./BE_SPEC_ORG_DIVISIONS_MASTER_AND_CRUD.md)
- [`BE_SPEC_EMPLOYEE_ORG_MANAGEMENT.md`](./BE_SPEC_EMPLOYEE_ORG_MANAGEMENT.md)
- [`BE_HANDOFF_ORG_DIVISIONS_AND_MEMBERS.md`](./BE_HANDOFF_ORG_DIVISIONS_AND_MEMBERS.md)

---

*Memisahkan diagnosis **404 route tidak ditemukan** dari pengembangan fitur FE.*
