# Checklist produksi: login WorkPulse (BE + lingkungan)

Dokumen untuk tim **ops / backend** (repo **BE**). **FE** mem-proxy `POST /workpulse-api/api/v1/auth/login` ke Gin internal (`WORKPULSE_INTERNAL_API_ORIGIN`, default `http://127.0.0.1:3040`).

Salinan ringkas untuk tim yang hanya buka repo FE: [`../FE/docs/BE_LOGIN_PROD_CHECKLIST.md`](../FE/docs/BE_LOGIN_PROD_CHECKLIST.md).

Stack: **PostgreSQL** (`workpulse`), **Gin** di `WORKPULSE_API_ADDR` (default `127.0.0.1:3040`).

---

## Verifikasi cepat dari server

```bash
# BE langsung (password salah → 401 + invalid_credentials; bukan 502 tanpa body)
curl -sS -w "\nHTTP:%{http_code}\n" -X POST http://127.0.0.1:3040/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"user@example.com","password":"wrong"}'

# Lewat Nitro FE (ganti port jika Nitro bukan 3020)
curl -sS -w "\nHTTP:%{http_code}\n" -X POST http://127.0.0.1:3020/workpulse-api/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"user@example.com","password":"wrong"}'
```

Jika keduanya **401** + envelope `invalid_credentials`, stack jaringan/proksi untuk login **hidup**. **504** + `error.code` **`timeout`** = DB/auth deadline (lihat `docs/BE_OPS_LOGIN_API_HANG.md`).

---

## Variabel lingkungan BE (wajib / sering bermasalah)

| Variabel | Catatan |
|----------|---------|
| `WORKPULSE_DATABASE_DSN` | Wajib. Tanpa ini API tidak jalan. |
| `WORKPULSE_JWT_SECRET` | Wajib, minimal 16 karakter. |
| `WORKPULSE_AUTH_DB_QUERY_TIMEOUT` | Default **20s** (kode). DB lambat → **504** `timeout`; selaraskan dengan timeout klien FE (~22s) — `../FE/docs/FE_SYNC_BE_AUTH_TIMEOUT.md` bila ada. |
| `WORKPULSE_DB_QUERY_TIMEOUT` | Timeout query umum handler lain (default **25s**). |
| `WORKPULSE_CORS_ORIGINS` | Origin dipisah koma, **cocok persis** dengan header `Origin` browser. Default di **kode** (bila env kosong): `https://work.rycroftapparel.com`, `http://work.rycroftapparel.com`, `http://localhost:3000`. Jika env **di-set manual** di server, nilai default kode **tidak** dipakai — tambahkan `http://…` jika perlu uji HTTP. Same-origin `/workpulse-api` biasanya **tidak** memicu CORS. |
| `WORKPULSE_AUTH_COOKIES` | Default `false`. Jika `true`, set `WORKPULSE_COOKIE_*` selaras host (HTTPS + `Secure` untuk produksi). |
| `WORKPULSE_COOKIE_SECURE` | Default `true`. Dev HTTP murni ke Gin mungkin perlu `false`. |

Lihat juga `.env.example` di folder BE.

---

## Data pengguna

- Login: `users.email` (dibandingkan **lowercase** di query) dan **bcrypt** pada `password_hash`.
- `is_active = false` → **403** `account_disabled`, bukan 401.
- User Google-only tanpa `password_hash` valid → **401** (reset di DB atau login Google).

---

## Setelah mengubah `internal/config/config.go` atau `.env`

```bash
cd /var/www/html/wp-system/BE
go build -o bin/api ./cmd/api/
pm2 delete workpulse-api && pm2 start ecosystem.config.cjs && pm2 save
```

Perubahan **default CORS di kode** baru berlaku setelah **binary baru** + restart. Perubahan **hanya `.env`**: tetap **`pm2 delete` + `start`** (bukan sekadar `restart`) agar parser `ecosystem.config.cjs` memuat ulang `.env`.

---

## Referensi lain

| Topik | Lokasi |
|--------|--------|
| Proxy, hang, checklist panjang | `docs/BE_OPS_LOGIN_DAN_PROXY.md`, `docs/BE_OPS_LOGIN_API_HANG.md`, `docs/BE_OPERASIONAL_LOGIN_CHECKLIST.md` |
| Seed superadmin | `../docs/BE_SEED_SUPERADMIN_FIKRI.md` |
| TLS `apiwork` | `../docs/BE_INFRA_APIWORK_TLS.md` |
