# Checklist produksi: login WorkPulse (BE + lingkungan)

Dokumen ini untuk tim ops / backend setelah perubahan di repo. **FE** mem-proxy `POST /workpulse-api/api/v1/auth/login` ke Gin internal (`WORKPULSE_INTERNAL_API_ORIGIN`, default `http://127.0.0.1:3040`).

## Verifikasi cepat dari server

```bash
# BE langsung (harus 401 untuk password salah, bukan 502/504)
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 (harus body JSON sama)
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** + `invalid_credentials`, stack jaringan/proksi untuk login **hidup**. Jika **504** / timeout, lanjut ke bagian database & timeout.

## 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. DB lambat → login hang / 504; sinkron dengan FE (~22s) — lihat `docs/FE_SYNC_BE_AUTH_TIMEOUT.md`. |
| `WORKPULSE_DB_QUERY_TIMEOUT` | Timeout query umum (lebih panjang dari auth). |
| `WORKPULSE_CORS_ORIGINS` | Daftar origin dipisah koma. Default di kode sekarang menyertakan `https://work.rycroftapparel.com` dan `http://work.rycroftapparel.com` (hanya relevan jika browser memanggil API **cross-origin**; default FE memakai same-origin `/workpulse-api`). |
| `WORKPULSE_AUTH_COOKIES` | Default `false`. Jika `true`, atur `WORKPULSE_COOKIE_DOMAIN`, `WORKPULSE_COOKIE_SECURE`, `WORKPULSE_COOKIE_SAMESITE` agar selaras dengan skema host (HTTPS + `Secure`). |
| `WORKPULSE_COOKIE_SECURE` | Default `true`. Untuk uji lokal HTTP murni ke Gin tanpa TLS, mungkin perlu `false` (hanya dev). |

## Data pengguna

- Login memakai `users.email` (lowercase di query) dan `bcrypt` pada `password_hash`.
- `is_active = false` → **403** `account_disabled`, bukan 401.
- User Google-only tanpa password: hash tidak valid → **401** (harus reset password di DB atau pakai Google).

## Setelah mengubah `BE/internal/config/config.go`

Rebuild binary dan restart proses API (contoh PM2 `workpulse-api`):

```bash
cd /var/www/html/wp-system/BE
go build -o /path/to/workpulse-api ./cmd/api
# lalu restart PM2 / systemd sesuai server
```

Perubahan default `WORKPULSE_CORS_ORIGINS` baru berlaku setelah **binary baru** + restart.

## Referensi FE terkait

- `docs/BE_OPS_LOGIN_DAN_PROXY.md` — proxy, POST, redirect HTTPS.
- `docs/FE_NUXT_ASSET_500.md` — chunk `/_nuxt` gagal (bukan error login).
- `docs/FE_SYNC_BE_AUTH_TIMEOUT.md` — mapping timeout FE ↔ BE.

## Salinan di repo BE (build + PM2)

Langkah deploy binary dan variabel env lengkap: [`../BE/docs/BE_LOGIN_PROD_CHECKLIST.md`](../BE/docs/BE_LOGIN_PROD_CHECKLIST.md).
