Lewati ke konten utama

BAB 46. NOTIFICATION ARCHITECTURE

Tujuan

Sistem notifikasi memastikan tutor, siswa, dan guru menerima informasi secara real-time tentang setiap peristiwa penting dalam siklus belajar.


Arsitektur

flowchart TD
E["📡 Domain Event\n(RequestCreated, BookingAccepted, etc.)"] --> NS["🔔 NotificationService"]
NS --> Q["⏳ Queue\nSendNotificationJob"]
Q --> FCM["🔥 Firebase Cloud\nMessaging (FCM)"]
Q --> DB[("💾 Simpan ke DB\ntabel notifications")]
FCM --> AND["🤖 Android"]
FCM --> IOS["🍎 iOS"]

style E fill:#4f63d2,color:#fff
style FCM fill:#f59e0b,color:#fff

Jenis Notifikasi

JenisTriggerPenerima
Request BaruAI menemukan tutor cocokTutor
Booking AcceptedTutor menerima requestSiswa
Booking RejectedTutor menolak requestSiswa
Reschedule RequestTutor mengusulkan jadwal baruSiswa
Reschedule AcceptedSiswa menerima jadwal baruTutor
Meeting Reminder15 menit sebelum jadwalSemua peserta
Check-In OpenWaktu meeting tibaSemua peserta
Check-Out ReminderSetelah 5 menit melewati durasiSemua peserta
Rating ReminderSetelah check-outSemua peserta
Badge EarnedXP mencapai thresholdSiswa
Leaderboard UpdateHarian (cron job)Semua siswa

Channel Notifikasi

ChannelTeknologiKondisi
Push NotificationFirebase Cloud MessagingSelalu
In-App NotificationDisimpan di DB, ditampilkan saat buka appSelalu
EmailLaravel Mail + SMTPOpsional (konfigurasi admin)

Tabel notifications

KolomTipeDeskripsi
idbigintPrimary Key
user_idbigintFK → users (penerima)
titlevarcharJudul notifikasi
bodytextIsi notifikasi
typevarcharbooking_accepted, meeting_reminder, dll
datajsonPayload tambahan (booking_id, meeting_id, dll)
is_readtinyint0 = belum dibaca
sent_attimestampWaktu dikirim
read_attimestampWaktu dibaca (nullable)

Implementasi NotificationService

// app/Modules/Notifications/Services/NotificationService.php

class NotificationService implements NotificationServiceInterface
{
public function sendToUser(
int $userId,
string $title,
string $body,
string $type = 'general',
array $data = []
): void {
// 1. Simpan ke database (in-app)
Notification::create([
'user_id' => $userId,
'title' => $title,
'body' => $body,
'type' => $type,
'data' => $data,
'sent_at' => now(),
]);

// 2. Dispatch push notification job
SendNotificationJob::dispatch($userId, $title, $body, $data)
->onQueue('high');
}
}

Flutter — Menerima Notifikasi

// core/services/fcm_service.dart

class FcmService {
Future<void> init() async {
// Request permission
await FirebaseMessaging.instance.requestPermission();

// Foreground notification
FirebaseMessaging.onMessage.listen((message) {
_showInAppBanner(message.notification);
_saveToLocalDB(message.data);
});

// Background / terminated
FirebaseMessaging.onMessageOpenedApp.listen((message) {
_navigateToRelatedScreen(message.data);
});
}
}