# Proteksi `/` tanpa login — siapa yang mengerjakan?

## Perilaku yang diinginkan

Pengguna **tanpa** cookie sesi (`workpulse-auth=1`) yang membuka `https://work.rycroftapparel.com/` harus diarahkan ke **`/login`**, bukan melihat dashboard.

## Yang sudah diperbaiki (FE saja)

1. **`server/middleware/00-workpulse-auth-redirect.ts`** (Nitro): untuk **GET/HEAD** dokumen, jika cookie `workpulse-auth` bukan `1` dan path bukan publik (`/_nuxt`, `/workpulse-api`, favicon, dll.), server membalas **302 ke `/login`** *sebelum* SSR Nuxt merender dashboard (HTML singkat + header `Location`). Path **`/login`**: tanpa cookie dibiarkan ke Nuxt; dengan cookie **`1`** diarahkan **302 ke `/`** agar tidak ada SSR login untuk sesi yang sudah login. Ini mengatasi kasus **JS `/_nuxt` error (500)** — tanpa JS, pengguna tetap dialihkan ke login.
2. **`layouts/guest.vue` + `definePageMeta({ layout: 'guest' })` di `pages/login.vue`**: halaman login **tidak** memakai `layouts/default.vue` (yang memakai `v-if="isAuthenticated"`). Tanpa ini, SSR dan klien bisa merender cabang berbeda → **hydration mismatch** (dashboard "Fikri" bercampur form login).
3. **`middleware/auth.global.ts`**: tetap **hanya di klien** — navigasi SPA (mis. sudah login membuka `/login` → `/`). **Tanpa** asset `/_nuxt/*` yang sukses, guard ini tidak jalan; untuk navigasi manual lewat bilah alamat, yang memaksa redirect tetap **Nitro** (full page load).

## Apakah perlu update BE?

**Tidak.** Ini murni **routing + cookie + SSR Nuxt**. Tim BE tidak perlu mengubah Gin/JWT untuk perilaku redirect ini.

## Catatan UI dashboard

Teks **"Good afternoon, Fikri"** di halaman utama saat ini adalah **placeholder statis** di `pages/index.vue`, bukan nama dari API login. Setelah proteksi rute benar, pengguna yang belum login **tidak akan melihat** halaman itu sama sekali (akan `/login`).

Untuk menampilkan nama dari backend setelah login, nanti bisa ditambah pemanggilan **`GET /api/v1/me`** (atau setara) — itu pengembangan FE (+ endpoint BE jika belum dipakai penuh di UI), bukan syarat untuk redirect dasar.

## Masih melihat dashboard tanpa login?

1. **Pastikan traffic benar-benar mengenai proses PM2 terbaru.** Jika ada proses `node .../FE/.output/server/index.mjs` lama yang masih **listen di `PORT`/`NITRO_PORT`**, PM2 bisa menampilkan `online` tetapi instance baru gagal bind (`EADDRINUSE`) — browser lalu mengenai build lama (tanpa redirect). Cek: `ss -tlnp | grep 3020` (ganti port sesuai `.env` / `ecosystem.config.cjs`) lalu bandingkan PID dengan `pm2 describe workpulse-fe`; jika beda, hentikan proses orphan lalu `pm2 restart workpulse-fe`.
2. Perbaiki dulu **500 pada `/_nuxt/*`** (lihat [`FE_NUXT_ASSET_500.md`](FE_NUXT_ASSET_500.md)) — tanpa JS, perilaku klien tetap tidak normal.
3. **Hard refresh** / clear cache setelah deploy.
4. Pastikan cookie **`workpulse-auth`** tidak ter-set manual ke `1` di browser untuk uji.

Verifikasi cepat dari mesin FE (tanpa cookie): `curl -sSI http://127.0.0.1:3020/` harus **`302`** dengan header **`location: /login`**.
