# WorkPulse — Seed user Superadmin (login pertama)

Dokumen ini untuk tim **backend (Gin + MySQL)** agar ada **satu akun superadmin** yang bisa dipakai FE untuk uji login.  
Database target: **`workpulse`** saja (user SQL dedikasi), jangan menyentuh tabel aplikasi lain.

---

## 1. Identitas akun (wajib persis)

| Field | Nilai |
|--------|--------|
| **Email** | `fikri@softcomp.io` |
| **Password awal** | `Bestari24!` |
| **Role** | `superadmin` (atau nilai enum setara di BE Anda) |

**Keamanan:** setelah login pertama berhasil, arahkan user mengganti password (flow change-password) dan batasi akses file ini di repo internal.

---

## 2. Hash password (bcrypt) untuk kolom DB

Password di atas di-hash dengan **bcrypt**, cost **10**, kompatibel dengan `golang.org/x/crypto/bcrypt`.

**Hash (simpan di kolom `password_hash` / `password`):**

```text
$2b$10$nZQpe2HillzISs4P/SbYj.IKCUL30voZjuuQQHMfPUXRjsXj0LplG
```

Verifikasi di Go (login):

```go
import "golang.org/x/crypto/bcrypt"
// bcrypt.CompareHashAndPassword([]byte(storedHash), []byte(plainPassword))
```

Jika BE memakai cost lain atau format Argon2, **generate ulang** hash dengan policy BE; jangan memakai hash di atas.

---

## 3. Skema tabel `users` (minimal — sesuaikan nama kolom proyek)

Contoh yang umum dipakai Gin + SQL:

```sql
CREATE TABLE IF NOT EXISTS users (
  id            BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  email         VARCHAR(255) NOT NULL,
  password_hash VARCHAR(255) NOT NULL,
  role          VARCHAR(32)  NOT NULL DEFAULT 'user',
  name          VARCHAR(255) NULL,
  is_active     TINYINT(1)   NOT NULL DEFAULT 1,
  created_at    DATETIME(3)  NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
  updated_at    DATETIME(3)  NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
  UNIQUE KEY uq_users_email (email),
  KEY idx_users_role (role)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```

Sesuaikan tipe/timestamp dengan konvensi migration BE Anda.

---

## 4. Seed SQL (idempotent ringan)

**Hapus dulu** baris dengan email yang sama (opsional), lalu insert:

```sql
USE workpulse;

DELETE FROM users WHERE email = 'fikri@softcomp.io';

INSERT INTO users (email, password_hash, role, name, is_active)
VALUES (
  'fikri@softcomp.io',
  '$2b$10$nZQpe2HillzISs4P/SbYj.IKCUL30voZjuuQQHMfPUXRjsXj0LplG',
  'superadmin',
  'Fikri',
  1
);
```

Jika PK / kolom berbeda, sesuaikan `INSERT` dengan skema final.

---

## 5. Perilaku BE yang disarankan setelah seed

1. **`POST /api/v1/auth/login`** — terima `email` + `password`, cari user by email, `bcrypt.CompareHashAndPassword`, issue JWT / cookie sesuai dokumen auth.
2. **Middleware** — role `superadmin` boleh akses route admin/internal yang Anda definisikan.
3. **Jangan** log password plain di server log.
4. **Rate limit** login per IP + per email untuk mengurangi brute force.

---

## 6. FE — login sudah memanggil API

Form **Sign In** di `pages/login.vue` memanggil **`POST {workpulseApiBase}/api/v1/auth/login`** dengan body JSON `{ "email", "password" }`, membaca envelope `{ ok, data: { accessToken, refreshToken, user } }`, menyimpan token di state Nuxt, dan mengatur cookie sesi.

- Default `workpulseApiBase`: `https://apiwork.rycroftapparel.com` (`nuxt.config.ts`; override: `NUXT_PUBLIC_WORKPULSE_API_BASE`).
- Jika login gagal di browser, periksa **CORS** + **TLS** pada host API (`docs/BE_INFRA_APIWORK_TLS.md`).

---

## 7. Regenerate hash (jika password diubah)

Contoh dengan Python (`pip install bcrypt` jika perlu):

```bash
python3 -c "import bcrypt; print(bcrypt.hashpw(b'PASSWORD_BARU', bcrypt.gensalt(10)).decode())"
```

---

*File: `docs/BE_SEED_SUPERADMIN_FIKRI.md`*
