# Checklist operasional: login WorkPulse (FE + BE)

Dokumen terkait: [BE_OPS_LOGIN_DAN_PROXY.md](./BE_OPS_LOGIN_DAN_PROXY.md) (indeks), [BE_OPS_LOGIN_API_HANG.md](./BE_OPS_LOGIN_API_HANG.md) (request **pending** / tombol **Signing in…** lama), [BE_LOGIN_PROD_CHECKLIST.md](./BE_LOGIN_PROD_CHECKLIST.md) (produksi: curl, env, rebuild).

Dokumen untuk **tim ops / backend**: ketika user sudah mengisi email dan password di `work.rycroftapparel.com` tetapi **tidak bisa masuk**, ikuti urutan ini. Untuk skenario umum, penyebab sering **proses, jaringan, TLS, atau proxy** — bukan perubahan kode Go.

Stack BE: **Gin + PostgreSQL** (database `workpulse`).

---

## 1. Binary API dan PM2

```bash
cd /var/www/html/wp-system/BE
go build -o bin/api ./cmd/api/
```

Setelah **mengubah `.env` BE**, muat ulang env PM2 (parser `.env` di `ecosystem.config.cjs` tidak ter-apply hanya dengan `restart`):

```bash
pm2 delete workpulse-api && pm2 start ecosystem.config.cjs && pm2 save
```

Cek proses mendengarkan (default **`127.0.0.1:3040`** — dari **`WORKPULSE_API_ADDR`** di `.env`):

```bash
ss -tlnp | grep 3040
curl -sS -o /dev/null -w "%{http_code}" -X POST http://127.0.0.1:3040/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"fikri@softcomp.io","password":"SALAH"}'
```

Harus **401** dengan envelope JSON (`ok: false`, error invalid credentials), **bukan** connection refused.

---

## 2. Seed superadmin dan password

Akun contoh dari migrasi: **`fikri@softcomp.io`** / **`Bestari24!`** (bcrypt di migrasi `000002_superadmin_seed`).

- Pastikan migrasi **`000002_superadmin_seed`** sudah terapan di DB **`workpulse`** (mis. `WORKPULSE_AUTO_MIGRATE=1` sekali saat deploy, atau jalankan alat migrate proyek).
- Jika ragu password, reset lewat prosedur internal (update `password_hash` dengan bcrypt cost sesuai kebijakan; hash contoh ada di file migrasi tersebut).

Detail seed (sibling folder monorepo): `../docs/BE_SEED_SUPERADMIN_FIKRI.md`.

---

## 3. FE: build, proxy `/workpulse-api`, origin internal

Browser memanggil **`POST /workpulse-api/api/v1/auth/login`** (same origin dengan situs `work`), lalu **Nuxt Nitro** meneruskan ke **`WORKPULSE_INTERNAL_API_ORIGIN`** (biasanya `http://127.0.0.1:3040`).

Setelah pull FE:

```bash
cd /var/www/html/wp-system/FE
npm run build
pm2 restart workpulse-fe --update-env
```

Uji dari **server yang sama** dengan Node (ganti port jika Nitro Anda bukan 3020):

```bash
curl -sS -X POST http://127.0.0.1:3020/workpulse-api/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"fikri@softcomp.io","password":"Bestari24!"}'
```

Harus JSON `ok: true` dan token — bukan HTML, bukan 502.

- **Connection refused ke 3040**: API tidak jalan, atau port/host internal salah — sesuaikan **`WORKPULSE_INTERNAL_API_ORIGIN`** di env **FE** (bukan hanya restart tanpa rebuild bila perlu env build-time).

---

## 4. Apache untuk `work.rycroftapparel.com`

VirtualHost harus mem-proxy **seluruh path** ke Nitro (termasuk `/workpulse-api/...`):

```apache
ProxyPass / http://127.0.0.1:3020/
ProxyPassReverse / http://127.0.0.1:3020/
```

Contoh file: repo FE `deploy/apache/work.rycroftapparel.com-ssl.conf`.

Untuk redirect **HTTP → HTTPS** pada host yang sama: hindari **301** untuk alur yang mem-**POST** body (mis. `/workpulse-api/...`); prefer **308** agar method dan body dipertahankan (lihat `deploy/apache/work.rycroftapparel.com.conf` di FE).

---

## 5. CORS dan pemanggilan langsung ke `apiwork`

Jika FE memakai **`NUXT_PUBLIC_WORKPULSE_API_BASE=https://apiwork.rycroftapparel.com`** (browser ke domain API):

- Sertifikat TLS **`apiwork`** harus valid (SAN sesuai host).
- Di **`.env` BE**, **`WORKPULSE_CORS_ORIGINS`** harus memuat origin FE persis, misalnya `https://work.rycroftapparel.com` (pisahkan koma jika beberapa).

Ini **bukan** penyebab utama jika login hanya lewat proxy path (poin 3): request browser tidak ke domain `apiwork`.

---

## 6. Ringkas: apa yang dicek di BE?

| Gejala | Tindakan |
|--------|----------|
| Connection refused ke **3040** | Jalankan / perbaiki PM2 **`workpulse-api`**, cek **`WORKPULSE_API_ADDR`** dan **`WORKPULSE_DATABASE_DSN`** di `.env` BE |
| **401** invalid credentials | Email/password atau seed / migrasi DB |
| **502** dari `/workpulse-api/...` | Nitro tidak sampai ke API — cek **`WORKPULSE_INTERNAL_API_ORIGIN`**, firewall, port |
| Request **pending** lama / **Signing in…** hingga timeout klien | Lihat [BE_OPS_LOGIN_API_HANG.md](./BE_OPS_LOGIN_API_HANG.md) (Gin/DB/proxy) |
| TLS **`apiwork`** salah di browser | Perbaiki vhost / sertifikat (infra), atau tetap pakai proxy FE |

Untuk TLS saat memanggil **langsung** `https://apiwork...`, lihat juga dokumentasi infra monorepo (mis. `docs/FE_APIWORK_TLS_DAN_PROXY.md` atau `docs/BE_INFRA_APIWORK_TLS.md`).

---

## Variabel BE relevan (ringkas)

| Variabel | Peran |
|----------|--------|
| `WORKPULSE_API_ADDR` | Bind HTTP API (default `127.0.0.1:3040`) |
| `WORKPULSE_DATABASE_DSN` | PostgreSQL; nama DB harus **`workpulse`** |
| `WORKPULSE_CORS_ORIGINS` | Origin yang boleh (credentials / cross-site ke API) |
| `WORKPULSE_JWT_SECRET` | Wajib, minimal 16 karakter |

Lihat `.env.example` di folder BE.
