Files
speech2text/TASK_PLAN.md
2026-06-02 17:35:45 +08:00

343 lines
11 KiB
Markdown

# TASK_PLAN.md — Speech2Text MBIP
## Ringkasan Fasa
| Fasa | Fokus | Anggaran |
|---|---|---|
| Fasa 1 | Auth, Role, User Management, Docker | Asas wajib |
| Fasa 2 | Project CRUD, Upload Audio, Collaborator, Policies | Storage + RBAC |
| Fasa 3 | Queue, Transcription Worker, Status, Retry | AI Integration |
| Fasa 4 | Transcript Editor, Version History, Comments | Content Features |
| Fasa 5 | Admin Dashboard, Audit Log, Transfer Ownership | Admin Tools |
| Fasa 6 | Security Hardening, Tests, README, Production Checklist | Quality |
---
## FASA 1: Asas — Auth, Role, User Management, Docker
### Objektif
Sistem boleh login, admin boleh urus pengguna, Docker berjalan.
### Checklist Fasa 1
#### 1.1 Struktur Projek Laravel
- [ ] `laravel new speech2text-mbip` dengan PHP 8.3+
- [ ] Konfigurasi `.env.example`
- [ ] Setup `config/filesystems.php` — tambah private disk
- [ ] Setup `config/auth.php`
- [ ] Konfigurasi Laravel untuk UUID
#### 1.2 Docker Setup
- [ ] `Dockerfile` untuk Laravel app (php:8.3-fpm)
- [ ] `docker-compose.yml` dengan services: app, nginx, mysql, redis, queue-worker, scheduler
- [ ] `docker/nginx/default.conf`
- [ ] `docker/php/php.ini`
- [ ] `.dockerignore`
- [ ] Test: `docker compose up -d --build`
#### 1.3 Database — Migration Awal
- [ ] Migration: `departments`
- [ ] Migration: `users` (dengan `role`, `is_active`, `department_id`, `deleted_at`)
- [ ] Migration: `audit_logs`
- [ ] Migration: `sessions` (jika guna database session)
#### 1.4 Models
- [ ] `User` model (dengan SoftDeletes, role check methods)
- [ ] `Department` model
- [ ] `AuditLog` model
#### 1.5 Authentication
- [ ] Login form (Bootstrap 5)
- [ ] Logout
- [ ] Middleware `EnsureUserIsActive` — check `is_active` selepas login
- [ ] Rate limit login (5 attempts/minute)
- [ ] Redirect admin ke `/admin/dashboard`, user ke `/dashboard`
#### 1.6 Role Middleware
- [ ] Middleware `EnsureAdmin` — untuk route `/admin/*`
- [ ] Middleware `EnsureUser` — untuk route `/dashboard/*`, `/projects/*`
- [ ] Register middleware dalam `bootstrap/app.php`
#### 1.7 Admin — User Management
- [ ] `UserPolicy` — CRUD user oleh admin sahaja
- [ ] `UserController` (Admin) dengan actions:
- `index` — senarai semua pengguna
- `create` / `store` — daftar pengguna baru
- `edit` / `update` — tukar emel pengguna
- `activate` — aktifkan pengguna
- `deactivate` — deactivate pengguna
- `destroy` — delete pengguna (hanya jika tiada usage)
- [ ] Form Request: `CreateUserRequest`, `UpdateUserEmailRequest`
- [ ] Views (Bootstrap 5): senarai pengguna, form cipta, form edit emel
- [ ] Action classes: `CreateUserAction`, `DeactivateUserAction`, `ActivateUserAction`, `DeleteUserAction`, `ChangeUserEmailAction`
#### 1.8 Audit Log Service
- [ ] `AuditLogService` dengan method `log()`
- [ ] Panggil AuditLogService dalam setiap action yang relevan
- [ ] Rekodkan: actor, action, target, old_values, new_values, ip, user_agent, justification
#### 1.9 Seeder
- [ ] `DepartmentSeeder` — beberapa jabatan contoh
- [ ] `AdminUserSeeder` — admin dari `.env` variables
- [ ] `DatabaseSeeder` — panggil semua seeders
#### 1.10 Admin Dashboard (Asas)
- [ ] Dashboard route `/admin/dashboard`
- [ ] Layout admin (Bootstrap 5 sidebar)
- [ ] Papar: jumlah pengguna aktif, jumlah pengguna deactive
### Arahan Test Fasa 1
```bash
# Build dan jalankan
cd /svr/speech2text
docker compose up -d --build
# Setup
docker compose exec app php artisan key:generate
docker compose exec app php artisan migrate --seed
# Semak
docker compose exec app php artisan migrate:status
docker compose exec app php artisan route:list
# Test manual:
# 1. Buka browser http://localhost
# 2. Login sebagai admin (dari .env)
# 3. Admin redirect ke /admin/dashboard
# 4. Admin boleh lihat senarai pengguna
# 5. Admin boleh daftar pengguna baru
# 6. Admin boleh deactivate pengguna
# 7. Pengguna deactivated tidak boleh login
# 8. Admin boleh activate semula
# 9. Admin boleh tukar emel
# 10. Semak audit_logs ada rekod untuk setiap tindakan
# 11. Login sebagai pengguna biasa -> redirect /dashboard
# 12. Pengguna biasa tidak boleh akses /admin/*
```
---
## FASA 2: Project CRUD, Upload Audio, Collaborator, Policies
### Checklist Fasa 2
#### 2.1 Migration
- [ ] `transcription_projects`
- [ ] `project_collaborators`
#### 2.2 Models & Relationships
- [ ] `TranscriptionProject` (dengan UUID, SoftDeletes)
- [ ] `ProjectCollaborator`
- [ ] Relationships dalam `User` model
#### 2.3 Policies
- [ ] `TranscriptionProjectPolicy` — view, create, update, delete, viewAudio, manageCollaborators
- [ ] Register policies dalam `AuthServiceProvider`
#### 2.4 File Upload
- [ ] Konfigurasi private disk dalam `config/filesystems.php`
- [ ] Form Request: `UploadAudioRequest` (validate MIME, size)
- [ ] `StorageService` — handle private file storage
- [ ] AudioController — stream audio melalui policy check
#### 2.5 Project Controllers
- [ ] `ProjectController` (User) — CRUD projek
- [ ] `AudioController` (User) — stream/download audio
- [ ] `CollaboratorController` (User) — tambah/buang collaborator
#### 2.6 Views
- [ ] Project list (dashboard)
- [ ] Create project + upload audio form
- [ ] Project detail (placeholder transcript area)
- [ ] Collaborator management panel
### Arahan Test Fasa 2
```bash
# Test manual:
# 1. Login sebagai user biasa
# 2. Cipta projek baru dengan upload audio
# 3. Semak fail ada dalam storage/app/private/ (bukan public/)
# 4. Dengar audio dalam browser (via controller stream)
# 5. Tambah collaborator
# 6. Login sebagai collaborator — boleh lihat projek
# 7. Login sebagai user lain (bukan collaborator) — 403
# 8. Login sebagai admin — tidak boleh dengar audio (403)
# 9. Admin hanya boleh lihat metadata projek
```
---
## FASA 3: Queue, Transcription Worker, Status, Retry
### Checklist Fasa 3
#### 3.1 Transcription Worker (Python)
- [ ] `docker/transcription-worker/Dockerfile` (Python 3.11 + faster-whisper)
- [ ] `docker/transcription-worker/main.py` (FastAPI endpoint `/transcribe`)
- [ ] `/health` endpoint untuk monitoring
- [ ] Tambah service ke `docker-compose.yml`
#### 3.2 Laravel Queue Job
- [ ] `TranscribeAudioJob` — baca audio, hantar ke Python worker, simpan result
- [ ] Handle timeout dan retry
- [ ] Update `transcription_status` di database
#### 3.3 Ollama Integration (Optional)
- [ ] `OllamaService` — panggil Ollama API untuk post-processing
- [ ] `OllamaPostProcessJob` — dispatch selepas transcription selesai
- [ ] Config via `.env`: `OLLAMA_ENABLED`, `OLLAMA_BASE_URL`, `OLLAMA_MODEL`
#### 3.4 UI Status
- [ ] Status badge dalam project detail (pending/processing/completed/failed)
- [ ] Auto-refresh status menggunakan polling atau SSE
- [ ] Retry button untuk failed transcription (owner sahaja)
### Arahan Test Fasa 3
```bash
# Semak transcription worker
docker compose logs -f transcription-worker
docker compose exec app curl http://transcription-worker:8000/health
# Upload audio dan monitor
docker compose logs -f queue-worker
docker compose exec app php artisan queue:work --once
# Semak result dalam database
docker compose exec mysql mysql -u root -p speech2text \
-e "SELECT id, title, transcription_status, transcript_text FROM transcription_projects LIMIT 5;"
```
---
## FASA 4: Transcript Editor, Version History, Comments
### Checklist Fasa 4
#### 4.1 Migration
- [ ] `transcript_versions`
- [ ] `project_comments`
#### 4.2 Models
- [ ] `TranscriptVersion`
- [ ] `ProjectComment` (dengan SoftDeletes)
#### 4.3 Policies
- [ ] `TranscriptVersionPolicy`
- [ ] `CommentPolicy`
#### 4.4 Controllers & Actions
- [ ] `TranscriptController` — view dan update transcript
- [ ] `TranscriptVersionController` — lihat history, restore
- [ ] `CommentController` — CRUD komen
#### 4.5 Views
- [ ] Transcript editor (textarea, save button)
- [ ] Version history timeline
- [ ] Restore version button
- [ ] Comment/chat panel (sidebar atau bawah transcript)
### Arahan Test Fasa 4
```bash
# Test:
# 1. Edit transcript — semak transcript_versions ada rekod baru
# 2. Edit kedua kali — semak version_number bertambah
# 3. Restore version lama — semak transcript_text dikemaskini
# 4. Collaborator boleh edit transcript
# 5. Admin tidak boleh akses transcript editor (403)
# 6. Buat komen
# 7. Admin tidak boleh lihat komen (403)
```
---
## FASA 5: Admin Dashboard, Audit Log, Transfer Ownership
### Checklist Fasa 5
#### 5.1 Admin Dashboard Lengkap
- [ ] Statistik pengguna (aktif/deactivate)
- [ ] Statistik projek (pending/processing/completed/failed)
- [ ] Statistik storage
- [ ] Top users by usage
- [ ] Chart harian/bulanan (jQuery chart library)
#### 5.2 Admin Project Metadata List
- [ ] Senarai projek dengan metadata sahaja (TANPA transcript_text)
- [ ] Filter: status, tarikh, owner
- [ ] Pagination
#### 5.3 Transfer Ownership
- [ ] Form transfer ownership dengan justification field
- [ ] `TransferProjectOwnerAction`
- [ ] Option: jadikan owner lama sebagai collaborator
- [ ] Audit log untuk transfer
#### 5.4 Audit Log Browser
- [ ] Senarai audit log dengan filter
- [ ] Filter: action, actor, tarikh, projek
- [ ] Pagination
- [ ] Export CSV (admin sahaja)
### Arahan Test Fasa 5
```bash
# Test:
# 1. Admin lihat dashboard dengan statistik
# 2. Admin transfer ownership — semak audit log ada justifikasi
# 3. Selepas transfer, owner baru boleh akses projek
# 4. Owner lama (jika dijadikan collaborator) boleh akses
# 5. Admin browse audit log — semak semua rekod ada
```
---
## FASA 6: Security Hardening, Tests, README, Production
### Checklist Fasa 6
#### 6.1 Feature Tests
- [ ] `AdminCannotViewTranscriptTest`
- [ ] `AdminCannotDownloadAudioTest`
- [ ] `OwnerCanAccessOwnProjectTest`
- [ ] `CollaboratorCanAccessSharedProjectTest`
- [ ] `NonCollaboratorCannotAccessProjectTest`
- [ ] `OnlyOwnerCanDeleteProjectTest`
- [ ] `CollaboratorCanEditTranscriptTest`
- [ ] `TranscriptEditCreatesVersionHistoryTest`
- [ ] `AdminTransferOwnershipRequiresJustificationTest`
- [ ] `DeactivateUserPreventsLoginTest`
- [ ] `DeleteUnusedUserOnlyAllowedTest`
- [ ] `EmailChangeCreatesAuditLogTest`
#### 6.2 Security Hardening
- [ ] Security headers middleware
- [ ] Rate limiting semua endpoint sensitif
- [ ] Validate MIME type dari magic bytes
- [ ] Semak semua `{{ }}` dalam Blade (bukan `{!! !!}`)
- [ ] Semak CSRF token semua form
- [ ] Remove debug routes
#### 6.3 Production Checklist
- [ ] Semua item dalam `DEPLOYMENT.md` production checklist
- [ ] `APP_DEBUG=false` di production
- [ ] Config cache, route cache, view cache
- [ ] Queue supervisor setup
#### 6.4 Documentation
- [ ] README.md utama
- [ ] Arahan deployment
- [ ] Arahan development local
---
## Peringatan Penting
> **Prinsip Privasi:**
> Admin = pentadbir AKAUN, bukan pentadbir KANDUNGAN.
> Setiap fasa mesti pastikan admin tidak boleh akses audio, transcript, atau komen.
> Semak dengan feature test sebelum anggap selesai.