BAB 64. MULTI-SCHOOL ARCHITECTURE
64.1 Tujuan
Memungkinkan satu instalasi aplikasi TemuBelajar digunakan oleh banyak sekolah sekaligus dengan isolasi data yang aman, efisien, dan mudah dikelola tanpa perlu deployment terpisah per sekolah.
64.2 Pendekatan
Model yang digunakan: Shared Database – Shared Schema (Soft Multi-Tenant)
Setiap record data memiliki kolom school_id yang secara otomatis memfilter akses data hanya ke sekolah yang bersangkutan.
users → school_id
students → school_id
teachers → school_id
requests → school_id
bookings → school_id
meetings → school_id
leaderboards → school_id
64.3 Arsitektur Multi-School
flowchart TD
SA["🏫 SMA Negeri 1\n(school_id: 1)"] --> API["🌐 TemuBelajar\nAPI Gateway"]
SB["🏫 SMA Negeri 2\n(school_id: 2)"] --> API
SC["🏫 SMA Kartini\n(school_id: 3)"] --> API
API --> TR["🔑 Tenant Resolver\n(Resolve school dari token)"]
TR --> DB[("💾 MySQL\n(Shared Database)")]
DB --> D1["📊 Data Sekolah 1"]
DB --> D2["📊 Data Sekolah 2"]
DB --> D3["📊 Data Sekolah 3"]
style TR fill:#7c3aed,color:#fff
style API fill:#4f63d2,color:#fff
64.4 Implementasi Isolasi Data
Global Scope di Model
// app/Shared/Traits/HasSchool.php
trait HasSchool
{
protected static function bootHasSchool(): void
{
static::addGlobalScope('school', function (Builder $builder) {
if (auth()->check()) {
$builder->where(
static::getTable() . '.school_id',
auth()->user()->school_id
);
}
});
}
}
// app/Modules/Requests/Models/Request.php
class Request extends Model
{
use HasSchool; // Semua query otomatis difilter by school_id
protected $fillable = [
'school_id',
'student_id',
'subject_id',
// ...
];
}
Middleware Tenant Resolver
// app/Http/Middleware/VerifiedSchoolMiddleware.php
public function handle(Request $request, Closure $next): Response
{
$school = auth()->user()->school;
if (!$school || !$school->is_active) {
abort(403, 'Sekolah tidak aktif.');
}
// Inject ke app container untuk dipakai di seluruh request
app()->instance('current_school', $school);
return $next($request);
}
64.5 Admin Multi-School
flowchart TD
SA["👑 Super Admin"] --> PORTAL["🖥️ School Portal\n(Manage semua sekolah)"]
PORTAL --> S1["🏫 SMA N 1\n(Admin Sekolah 1)"]
PORTAL --> S2["🏫 SMA N 2\n(Admin Sekolah 2)"]
PORTAL --> S3["🏫 SMA Kartini\n(Admin Sekolah 3)"]
style SA fill:#7c3aed,color:#fff
style PORTAL fill:#4f63d2,color:#fff
64.6 Keuntungan Model Shared Database
| Keuntungan | Penjelasan |
|---|---|
| Biaya rendah | Satu server untuk banyak sekolah |
| Maintenance sederhana | Deploy sekali untuk semua |
| Backup mudah | Satu database untuk di-backup |
| Deployment cepat | Tambah sekolah baru cukup insert data |
| Analytics lintas sekolah | Mudah query statistik nasional |
64.7 Roadmap Pengembangan Lanjutan
Apabila skala sangat besar (>500 sekolah):
| Model | Deskripsi |
|---|---|
| Database per sekolah | Isolasi penuh, migrasi lebih kompleks |
| Schema per sekolah | PostgreSQL schema separation |
| Region per provinsi | Server berbeda per wilayah |
| Microservice per domain | Pisah service AI, Chat, Meeting |