11 KiB
11 KiB
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-mbipdengan 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
Dockerfileuntuk Laravel app (php:8.3-fpm)docker-compose.ymldengan services: app, nginx, mysql, redis, queue-worker, schedulerdocker/nginx/default.confdocker/php/php.ini.dockerignore- Test:
docker compose up -d --build
1.3 Database — Migration Awal
- Migration:
departments - Migration:
users(denganrole,is_active,department_id,deleted_at) - Migration:
audit_logs - Migration:
sessions(jika guna database session)
1.4 Models
Usermodel (dengan SoftDeletes, role check methods)DepartmentmodelAuditLogmodel
1.5 Authentication
- Login form (Bootstrap 5)
- Logout
- Middleware
EnsureUserIsActive— checkis_activeselepas 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 sahajaUserController(Admin) dengan actions:index— senarai semua penggunacreate/store— daftar pengguna baruedit/update— tukar emel penggunaactivate— aktifkan penggunadeactivate— deactivate penggunadestroy— 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
AuditLogServicedengan methodlog()- 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 contohAdminUserSeeder— admin dari.envvariablesDatabaseSeeder— 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
# 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_projectsproject_collaborators
2.2 Models & Relationships
TranscriptionProject(dengan UUID, SoftDeletes)ProjectCollaborator- Relationships dalam
Usermodel
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 projekAudioController(User) — stream/download audioCollaboratorController(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
# 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)/healthendpoint 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_statusdi database
3.3 Ollama Integration (Optional)
OllamaService— panggil Ollama API untuk post-processingOllamaPostProcessJob— 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
# 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_versionsproject_comments
4.2 Models
TranscriptVersionProjectComment(dengan SoftDeletes)
4.3 Policies
TranscriptVersionPolicyCommentPolicy
4.4 Controllers & Actions
TranscriptController— view dan update transcriptTranscriptVersionController— lihat history, restoreCommentController— 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
# 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
# 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
AdminCannotViewTranscriptTestAdminCannotDownloadAudioTestOwnerCanAccessOwnProjectTestCollaboratorCanAccessSharedProjectTestNonCollaboratorCannotAccessProjectTestOnlyOwnerCanDeleteProjectTestCollaboratorCanEditTranscriptTestTranscriptEditCreatesVersionHistoryTestAdminTransferOwnershipRequiresJustificationTestDeactivateUserPreventsLoginTestDeleteUnusedUserOnlyAllowedTestEmailChangeCreatesAuditLogTest
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.mdproduction checklist APP_DEBUG=falsedi 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.