# Login API “menggantung” — tombol FE stuck di “Signing in…”

## Gejala

- Di browser, setelah klik **Sign In**, teks tombol tetap **“Signing in…”** lama sekali (sebelum perbaikan FE: bisa **tanpa batas**).
- Setelah deploy FE terbaru: setelah **±22 detik** muncul pesan bahwa server tidak menjawab (timeout klien).

Itu berarti permintaan **`POST /api/v1/auth/login`** (lewat proxy same-origin `/workpulse-api/...` → Gin di **`127.0.0.1:3040`**) **tidak selesai** dengan cepat dari sisi klien.

## Bukan bug form FE untuk kasus “password salah”

Jika API merespons **401** dengan JSON `{ "ok": false, "error": { ... } }`, FE menampilkan pesan error (mis. *invalid email or password*). **Tidak** stuck tanpa akhir.

Stuck lama = **jaringan / proxy / BE tidak membalas** atau sangat lambat.

---

## Checklist tim BE / ops (urutan)

### 1. Proses API benar-benar jalan

```bash
ss -tlnp | grep 3040
HOME=/root PM2_HOME=/root/.pm2 pm2 describe workpulse-api
```

Uji dari **mesin yang sama** dengan FE (Nitro mem-proxy ke `WORKPULSE_INTERNAL_API_ORIGIN`, default `http://127.0.0.1:3040`):

```bash
curl -sS -m 5 -X POST "http://127.0.0.1:3040/api/v1/auth/login" \
  -H "Content-Type: application/json" \
  -d '{"email":"salah@email.com","password":"x"}' -w "\nHTTP %{http_code}\n"
```

Harus balas **cepat** (biasanya &lt;1 s) dengan **401** dan body JSON. Jika **timeout** atau tidak ada jawaban → perbaiki BE (proses hang, DB tidak connect, port salah).

### 2. Timeout DB di BE (HTTP 504 + envelope)

BE membatasi waktu query DB untuk auth lewat **`WORKPULSE_AUTH_DB_QUERY_TIMEOUT`** (default **20s**). Jika DB/proksi tidak selesai, BE dapat membalas **HTTP 504** dengan body JSON:

`{ "ok": false, "data": null, "error": { "code": "timeout", "message": "…" } }` (pesan bisa berisi *request timed out*).

**FE** memperlakukan `error.code === "timeout"` dan **504** sebagai **gagal server / timeout**, bukan “email atau password salah”. Lihat sinkronisasi lengkap: [`FE_SYNC_BE_AUTH_TIMEOUT.md`](FE_SYNC_BE_AUTH_TIMEOUT.md).

### 3. Database & query login

Login memakai query ke tabel **`users`**. Jika koneksi DB lambat, pool habis, atau deadlock, request bisa menggantung. Cek log Gin / PostgreSQL saat submit login.

### 4. Proxy Nitro → Gin

Di FE, route `server/routes/workpulse-api/[...path].ts` mem-proxy ke origin runtime `workpulseInternalApiOrigin`. Pastikan PM2 / env punya **`WORKPULSE_INTERNAL_API_ORIGIN=http://127.0.0.1:3040`** (atau host internal yang benar).

Lihat juga: [`BE_OPS_LOGIN_DAN_PROXY.md`](BE_OPS_LOGIN_DAN_PROXY.md).

---

## Ringkas

| Gejala | Kemungkinan besar |
|--------|-------------------|
| Stuck “Signing in…” lama / timeout FE | Gin tidak jawab, DB lambat, port 3040 salah, atau proxy internal putus |
| Pesan timeout server / 504 dari BE | `WORKPULSE_AUTH_DB_QUERY_TIMEOUT`, DB lambat — bukan kredensial salah |

Tidak perlu mengubah **kontrak JSON** login untuk mengatasi hang; yang dibutuhkan adalah **respons HTTP yang tepat waktu** (sukses atau error dengan body JSON).
