diff --git a/backlog.md b/backlog.md index 4ba2eb4..ad01405 100644 --- a/backlog.md +++ b/backlog.md @@ -54,6 +54,19 @@ --- +## 🔴 Fase 1.5 — Activity Tracking *(Bisa mulai sekarang — tidak ada dependency)* +> Sebagian sudah dikerjakan: `last_login_at` di super apps sudah fix (Jun 2026). + +| # | Tugas | Estimasi | +|---|---|---| +| **5a** | ✅ **Fix `last_login_at` super apps** — simpan ke DB saat login, tidak ambil dari AD | DONE | +| **5b** | **Activity log FE** — catat page visit, durasi per fitur, simpan ke `geonet-console` | 2-3 hari | +| **5c** | **NAS login tracking** — polling QNAP system log via SSH/API, simpan ke DB | 1-2 hari | +| **5d** | **Gitea activity tracking** — pull events via Gitea API (`/user/heatmap`, `/repos/events`) | 1 hari | +| **5e** | **Admin: Activity Dashboard** — tabel login history, fitur populer, durasi kunjungan | 2-3 hari | + +--- + ## 🔴 Fase 2 — Mail Server *(Prerequisite Ticketing & Mail UI)* | # | Tugas | Estimasi | |---|---|---| @@ -280,6 +293,88 @@ Push Service API (FastAPI, port 17000) - 📢 **Broadcast IT**: pengumuman, maintenance, downtime - *(Future)* 📊 Monitoring: alert Zabbix +--- +# Activity Tracking + +## Status +- ✅ `last_login_at` super apps — **sudah fix** (Jun 2026): kolom ditambah ke `ldap_user_meta`, diset saat `AuthController::login()`, dikembalikan oleh `MeController` prioritas di atas `lastlogontimestamp` AD yang stale. + +## Kenapa Tidak Pakai `lastlogontimestamp` dari AD? +Active Directory `lastlogontimestamp` hanya direplikasi antar Domain Controller setiap **9-14 hari** — by design Microsoft untuk mengurangi replikasi traffic. Jadi selalu stale. Solusi: simpan timestamp di DB sendiri saat login ke super apps. + +## 1. Super Apps — Page Visit & Feature Usage + +### Backend (`geonet-console`) +- [ ] Buat tabel `user_activity_logs` (username, feature, action, duration_seconds, metadata JSON, created_at) +- [ ] `POST /api/v1/activity` — endpoint internal FE kirim activity event +- [ ] `GET /api/v1/admin/activity` — admin query logs (filter: user, feature, date range) +- [ ] Aggregation query: fitur paling banyak dikunjungi, avg durasi per fitur, DAU/WAU/MAU + +### Frontend (Next.js) +- [ ] `src/lib/activity-tracker.ts` — hook `usePageTracking()`: catat `page_enter` + `page_leave` dengan durasi +- [ ] Kirim event ke `/api/v1/activity` saat user leave page (via `beforeunload` + `visibilitychange`) +- [ ] Payload: `{ feature: 'asset-management', action: 'view', duration_seconds: 45 }` + +### Fitur yang Dilacak +| Feature Key | Halaman | +|---|---| +| `dashboard` | `/dashboard` | +| `profile` | `/profile` | +| `asset_management` | `/asset-management` | +| `admin_users` | `/admin/permissions` | +| `ticketing` | `/ticketing` | +| `gitea_issues` | `/gitea/issues` | +| `gitea_repos` | `/gitea/repos` | +| `mail` | `/mail` | +| `monitoring` | `/monitoring` | +| `kpi` | `/kpi` | + +### Admin Activity Dashboard (`/admin/activity`) +- [ ] Card: DAU (Daily Active Users), WAU, MAU +- [ ] Bar chart: page visits per fitur per hari/minggu +- [ ] Tabel: login history per user (username, last_login_at, IP, user agent) +- [ ] Tabel: fitur paling populer (rank by visit count + avg durasi) +- [ ] Filter: by user, date range, feature + +## 2. NAS (QNAP) Login Tracking + +### Pendekatan +QNAP tidak punya webhook login. Opsi terbaik: **polling system log via SSH** periodik. +- SSH ke NAS: `ssh -i ~/.ssh/id_ed25519 admin@10.100.1.10` +- Log path QNAP: `/var/log/connection.log` atau via API `GET /cgi-bin/authLogin.cgi` +- QNAP juga punya REST API: `GET /api/v2/system/log` (QTS 5.x) + +### Implementasi +- [ ] Cek apakah QNAP QTS versi mendukung `/api/v2/system/log` +- [ ] Buat scheduler di `geonet-console` (atau `geonet-kpi`) — pull NAS log setiap 15 menit +- [ ] Parse log entry: timestamp, username, action (login/logout), IP +- [ ] Simpan ke tabel `external_login_logs` (source: 'nas'|'gitea', username, logged_at, ip, metadata) +- [ ] Tampilkan di Admin Activity Dashboard sebagai tab "NAS Login" + +## 3. Gitea Login & Activity Tracking + +### Pendekatan +Gitea punya **Events API** — tidak perlu parsing log. +``` +GET /api/v1/users/{username}/heatmap — commit activity heatmap (per hari) +GET /api/v1/repos/{owner}/{repo}/statuses — repo activity +GET /api/v1/admin/users — list users + last_login (admin token) +``` +- Gitea LDAP auth: login ke Gitea = login via AD — username sama dengan super apps +- Pull data setiap malam via scheduler, simpan ke `external_login_logs` + +### Implementasi +- [ ] Generate Gitea admin token untuk pull user data +- [ ] Scheduler: `GET /api/v1/admin/users` tiap malam → update `external_login_logs` (source: 'gitea') +- [ ] Tampilkan di Admin Activity Dashboard sebagai tab "Gitea Activity" +- [ ] Di profile user: tampilkan "Last seen di Gitea: X hari lalu" + +## Permission +| Permission | Fungsi | +|---|---| +| `activity.view_own` | User lihat activity diri sendiri di profile | +| `activity.view_all` | Admin lihat semua user activity | + --- # Gitea Integration (`git.gisportal.id`)