# Login API “menggantung” — tombol FE stuck di “Signing in…”

Dokumen **BE / ops**: ketika permintaan login tidak selesai cepat dari sisi klien. **Tidak perlu mengubah kontrak JSON** login; yang dibutuhkan adalah **respons HTTP tepat waktu** (200 sukses atau 4xx/5xx dengan body JSON).

Stack: **Gin** di **`127.0.0.1:3040`** (default), **PostgreSQL** `workpulse`. Alur browser umum: **`POST /workpulse-api/api/v1/auth/login`** → Nitro proxy → Gin **`POST /api/v1/auth/login`**.

---

## Gejala

- Tombol **Signing in…** lama; setelah deploy FE dengan timeout klien, setelah **±22 detik** muncul pesan server tidak menjawab.
- Artinya request **tidak selesai** dengan cepat (bukan respons **401** cepat untuk password salah).

**Bukan** kasus hang: API mengembalikan **401** dengan envelope `{ "ok": false, "error": { ... } }` — FE menampilkan pesan error kredensial.

---

## Checklist (urutan)

### 1. Proses API benar-benar jalan

```bash
ss -tlnp | grep 3040
pm2 describe workpulse-api
```

Uji dari **mesin yang sama** dengan Nitro (origin internal FE, 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** `curl` atau tidak ada jawaban → periksa proses API, **koneksi DB**, atau **port** (`WORKPULSE_API_ADDR` di `.env` BE).

### 2. Database dan query login

Handler login mem-query tabel **`users`** (email, `password_hash`, `role`, `is_active`). Jika PostgreSQL tidak menjawab, pool habis, atau jaringan DB putus, operasi DB dibatasi **`WORKPULSE_AUTH_DB_QUERY_TIMEOUT`** (default **20s**): klien menerima **504** dengan envelope `ok: false`, `error.code` **`timeout`** (bukan request menggantung tanpa jawaban sampai menit-an). Handler lain tetap memakai `WORKPULSE_DB_QUERY_TIMEOUT` (default 25s).

- Batas baca HTTP: `WORKPULSE_HTTP_READ_TIMEOUT` / `WORKPULSE_HTTP_READ_HEADER_TIMEOUT` (mencegah klien lambat mengirim body).
- **`WORKPULSE_HTTP_WRITE_TIMEOUT` default `0`** (nonaktif) agar **SSE** / koneksi panjang tidak terputus; jangan set ke nilai pendek kecuali Anda yakin tidak memakai stream panjang.

- Cek log PM2 API: `BE/logs/pm2-workpulse-api-error-*.log`
- Cek koneksi: `psql` ke DSN yang sama dengan `WORKPULSE_DATABASE_DSN`
- Cek beban / lock di PostgreSQL saat submit login

### 3. Proxy Nitro → Gin

Di FE, route server mem-proxy ke **`WORKPULSE_INTERNAL_API_ORIGIN`** (runtime). Pastikan env PM2 / systemd untuk **FE** memuat misalnya:

`WORKPULSE_INTERNAL_API_ORIGIN=http://127.0.0.1:3040`

Jika salah host/port, proxy bisa pending sampai timeout Nitro.

Checklist proxy dan build FE: [BE_OPS_LOGIN_DAN_PROXY.md](./BE_OPS_LOGIN_DAN_PROXY.md) dan [BE_OPERASIONAL_LOGIN_CHECKLIST.md](./BE_OPERASIONAL_LOGIN_CHECKLIST.md).

### 4. Redirect HTTP → HTTPS (POST body)

Jika user mem-**POST** ke `http://work...` dan Apache membalas **301** ke HTTPS, beberapa klien **tidak mengulang body** → upstream bisa terlihat seperti gagal / EOF. Prefer **308** untuk redirect permanen yang mempertahankan method dan body. Detail: konfigurasi Apache repo FE (`deploy/apache/work.rycroftapparel.com.conf`) dan dokumentasi FE terkait.

---

## Ringkas

| Gejala | Kemungkinan besar |
|--------|-------------------|
| Stuck **Signing in…** / request **pending** lama | Gin tidak jawab, DB lambat/tidak connect, port 3040 salah, proxy internal putus |
| Error setelah klik (**401** / validasi) | Kredensial atau validasi BE — **bukan** hang |

Timeout klien di FE (`composables/useAuth.ts`) hanya membatasi lama tunggu; akar masalah tetap di **BE / proxy / DB / jaringan**.
