# Spesifikasi BE: profil pengguna login & aktivitas / metrik (WorkPulse)

Dokumen ini untuk tim **backend** (Gin API). **Frontend** (`pages/profile.vue` + `composables/useWorkpulseMe.ts`) memanggil `GET /api/v1/me`, `GET /api/v1/me/summary`, dan `GET /api/v1/me/activity` dengan Bearer dari sesi; teks pengguna **tidak** memuat path dokumen atau jargon endpoint.

---

## 1. Profil “saya” (semua user terautentikasi)

### `GET /api/v1/me`

- **Auth:** wajib (`authMiddleware`), semua role yang punya JWT valid.
- **Respons 200** (`{ ok: true, data: { ... } }`), contoh field:
  - `id` (number)
  - `email` (string, lowercase)
  - `name` (string)
  - `role` (`superadmin` | `user`)
  - `isActive` (boolean)
  - `createdAt` (ISO8601, opsional)
- **Tujuan:** satu sumber kebenaran untuk halaman profil tanpa memakai `GET /api/v1/admin/users/:id` (khusus superadmin).

### `PATCH /api/v1/me` (opsional fase 2)

- Body parsial: mis. `{ "name": "..." }` — **email tidak diubah** lewat endpoint ini (atau alur terpisah verifikasi).
- Validasi & error mengikuti pola envelope yang sudah dipakai (`validation`, `unauthorized`, dll.).

---

## 2. Ringkasan kinerja / metrik dashboard profil

Belum didefinisikan skema final — pilih salah satu pola:

### Opsi A — agregasi read-only

`GET /api/v1/me/summary` atau `GET /api/v1/me/stats`

- Contoh field (sesuaikan dengan domain WorkPulse): `attendanceRate`, `reportsSubmitted`, `reportsExpected`, `productivityScore`, `goalProgressPercent`, dll.
- Periode query opsional: `?period=month` (default).

### Opsi B — embed di `GET /api/v1/me`

- Field nested `stats: { ... }` agar satu round-trip.

**Catatan:** angka harus berasal dari data laporan / absensi nyata, bukan placeholder FE.

---

## 3. Timeline aktivitas / log

`GET /api/v1/me/activity?limit=20&offset=0`

- Daftar entri: judul, deskripsi singkat, timestamp, tipe (mis. `report`, `comment`, `login` — sesuai kebutuhan).
- Dipakai mengganti blok “Recent Activity” statis di FE.

---

## 4. Error HTTP (konsisten dengan API lain)

| Situasi            | HTTP | `error.code`   |
|--------------------|------|----------------|
| Tidak login / JWT | 401  | `unauthorized` |
| User nonaktif     | 403  | `forbidden`    |
| Validasi body     | 400  | `validation` |

---

## 5. Hubungan dengan admin user management

- `GET/PATCH /api/v1/admin/users/:id` tetap untuk **superadmin** mengelola workspace.
- `GET/PATCH /api/v1/me` untuk **pemilik token** melihat/memperbarui diri sendiri tanpa eskalasi privilege admin.

---

## Status implementasi

| Endpoint                 | Status |
|--------------------------|--------|
| `GET /api/v1/me`         | **Ada** — sama handler dengan `GET /api/v1/auth/me` (keduanya). |
| `PATCH /api/v1/me`       | **Ada** — body `name` dan/atau `avatarUrl` (email tidak diubah). |
| `GET /api/v1/me/summary` | **Ada** — agregasi dari tabel `reports`, `calendar_events`, `notifications` (lihat BE doc). |
| `GET /api/v1/me/activity`| **Ada** — gabungan laporan + notifikasi. |

Detail respons & query: [`../BE/docs/BE_SPEC_PROFILE_USER_AND_ACTIVITY.md`](../BE/docs/BE_SPEC_PROFILE_USER_AND_ACTIVITY.md).

## Implementasi FE (ringkas)

- `composables/useWorkpulseMe.ts` — `getMe`, `patchMe`, `getMeSummary`, `getMeActivity`.
- `pages/profile.vue` — memuat profil + ringkasan + aktivitas; salinan bahasa pengguna (tanpa path dokumen); `persistWorkpulseSessionUser` disegarkan dari respons `GET /me` agar header/sidebar konsisten.

File ini: `FE/docs/BE_SPEC_PROFILE_USER_AND_ACTIVITY.md`
