TIFNJK_E41221880/app/Http/Controllers/NotificationController.php

346 lines
12 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Enums\NotificationType;
use App\Models\Classes;
use App\Models\Notification;
use App\Services\FirebaseMessagingService;
use App\Services\NotificationHelperService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class NotificationController extends Controller
{
//* Dokumentasi Penggunaan Template Message untuk fitur Notifikasi
//* Contoh penggunaan template untuk kirim ke topic kelas
// $template = $this->notificationHelper->templateTugasKelas(
// 'kelas_10_TKJ_1',
// 'Tugas Baru: Matematika',
// 'Tugas matematika untuk minggu ini sudah tersedia. Silakan cek aplikasi untuk detailnya.',
// );
// $result = $this->notificationHelper->send($template);
// * Contoh penggunaan template untuk kirim ke semua siswa (pengumuman umum)
// $template = $this->notificationHelper->templatePengumuman(
// 'Libur Sekolah',
// 'Sekolah akan libur pada tanggal 25 Desember 2024 hingga 1 Januari 2025. Selamat berlibur!',
// );
// $result = $this->notificationHelper->send($template);
// * Contoh penggunaan template untuk kirim ke satu device (token)
// $template = $this->notificationHelper->tokenTemplate(
// 'fcm_token_device',
// 'Pengumuman Pribadi',
// 'Ini adalah pengumuman khusus untuk Anda. Harap cek aplikasi untuk detailnya.',
// );
// $result = $this->notificationHelper->send($template);
//* Dokumentasi Penggunaan Data NotficationCreateTemplate untuk menyimpan ke database
// $payloadAll = $this->notificationHelper->createTemplateForAll(
// 'Info Umum',
// 'Sekolah libur besok',
// NotificationType::AnnouncementGeneral,
// auth()->id(),
// );
// $payloadClass = $this->notificationHelper->createTemplateForClass(
// 10,
// 'Tugas Baru',
// 'Kerjakan latihan halaman 12',
// NotificationType::Assignment,
// auth()->id(),
// );
// $payloadStudent = $this->notificationHelper->createTemplateForStudent(
// 25,
// 'Catatan Personal',
// 'Harap hubungi wali kelas',
// NotificationType::PersonalNote,
// auth()->id(),
// );
public function index()
{
$notifications = Notification::with(['sender.teacher', 'sender.student', 'class'])
->latest()
->get();
return view('pages.notifikasi.notifikasi', compact('notifications'));
}
protected FirebaseMessagingService $fcm;
protected NotificationHelperService $notificationHelper;
public function __construct(FirebaseMessagingService $fcm, NotificationHelperService $notificationHelper)
{
$this->fcm = $fcm;
$this->notificationHelper = $notificationHelper;
}
// Test kirim ke satu token
public function sendToToken(Request $request)
{
$token = $request->input('token'); // FCM token dari mobile
$title = $request->input('title', 'Judul Notifikasi');
$body = $request->input('body', 'Isi notifikasi');
$data = $request->input('data', []); // optional payload
$this->fcm->sendToToken($token, $title, $body, $data);
return response()->json(['success' => true]);
}
// Kirim ke topic
public function sendToTopic(Request $request)
{
$topic = $request->input('topic'); // contoh: 'session_123'
$title = $request->input('title', 'Judul Notifikasi');
$body = $request->input('body', 'Isi notifikasi');
$data = $request->input('data', []);
$this->fcm->sendToTopic($topic, $title, $body, $data);
return response()->json(['success' => true]);
}
// Contoh penggunaan template notifikasi untuk target topic kelas
public function sendTopicTemplateExample(Request $request)
{
try {
$template = $this->notificationHelper->templateAssignmentForClass(
$request->input('topic', 'kelas_10_TKJ_1'),
$request->input('title', 'Tugas Baru: Matematika'),
$request->input('body', 'Tugas matematika untuk minggu ini silahkan kerjakan buku praktikum halaman 12-15'),
);
$result = $this->notificationHelper->send($template);
$createTemplate = $this->notificationHelper->createTemplateForClass(
1, // class_id, for testing only
$template->title,
$template->body,
NotificationType::Assignment,
1, // sender_id, bisa diganti dengan auth()->id() jika sudah ada sistem autentikasi
);
// store to database
Notification::create($createTemplate->toArray());
return response()->json([
'success' => true,
'message' => 'Topic template notification sent successfully',
'template' => $template->toArray(),
'create_template' => $createTemplate->toArray(),
'result' => $result,
]);
} catch (\Throwable $th) {
return response()->json([
'success' => false,
'error' => 'Failed to send topic template notification',
'message' => $th->getMessage(),
], 500);
}
}
// notes untuk alvian:
// $template = $this->notificationHelper->templatePermissionApproval(
// $request->input('userid'), // receiver_id, contoh: user id siswa yang izin nya disetujui
// // $request->input('title', 'Tugas Baru: Matematika'),
// );
// $result = $this->notificationHelper->send($template);
// $createTemplate = $this->notificationHelper->createTemplateForStudent(
// $request->input('userid'), // receiver_id, contoh: user id siswa yang izin nya disetujui
// $template->title,
// $template->body,
// NotificationType::PersonalNote,
// 1, // sender_id, bisa diganti dengan auth()->id() jika sudah ada sistem autentikasi
// );
// // store to database
// Notification::create($createTemplate->toArray());
// universal send (kirim ke semua student device, untuk pengumuman umum seperti libur, maintenance, dll)
public function sendToAll(Request $request)
{
$title = $request->input('title', 'Judul Notifikasi');
$body = $request->input('body', 'Isi notifikasi');
$data = $request->input('data', []);
// Kirim ke topic global untuk semua siswa
$this->fcm->sendToTopic('student_notifications', $title, $body, $data);
return response()->json(['success' => true]);
}
// send to class topic (announcement, homework, assignment, etc)
public function sendToClassTopic(Request $request)
{
try {
// user auth check
$user = $request->user();
if (!$user) {
return response()->json(['error' => 'Unauthorized'], 401);
}
$userId = $user->id;
$request->validate([
'class_id' => 'required|integer',
'type' => 'nullable|string',
'title' => 'nullable|string',
'body' => 'nullable|string',
'data' => 'nullable',
]);
$type = $request->input('type', 'announcement'); // default ke announcement
$classId = $request->input('class_id'); // contoh: '123'
$title = $request->input('title', null);
$body = $request->input('body', null);
$data = $request->input('data', []);
// get fcm topic from database based on class_id
$class = Classes::find($classId);
if (!$class) {
return response()->json(['error' => 'Class not found'], 404);
}
$topic = $class->fcm_topic;
if (!$topic) {
return response()->json(['error' => 'No FCM topic assigned to this class'], 404);
}
$template = null;
switch ($type) {
case 'assignment':
$t = $title;
$b = $body ?? 'Ada tugas baru untuk kelas ini. Silakan cek aplikasi untuk detail.';
$template = $this->notificationHelper->templateAssignmentForClass(
$topic,
$t,
$b,
$data,
);
break;
case 'class_cancelled':
// contoh template untuk pengumuman kelas dibatalkan
$t = $title ?? 'Kelas Dibatalkan';
$b = $body ?? '(pengirim tidak memberikan detail alasan pembatalan)';
$template = $this->notificationHelper->templateClassCancelled(
$topic,
$b
);
break;
default:
// default ke template pengumuman umum untuk kelas
$t = $title ?? 'Pengumuman Kelas';
$b = $body ?? 'Ada pengumuman untuk kelas ini.';
$template = $this->notificationHelper->templateAnnouncementForClass(
$topic,
$t,
$b,
array_merge($data, ['type' => 'announcement_for_class']),
);
break;
}
if (!$template) {
return response()->json(['error' => 'Failed to create notification template'], 500);
}
try {
$resultMessaging = $this->notificationHelper->send($template);
} catch (\Exception $e) {
Log::error('Failed to send attendance violation notification', ['exception' => $e]);
$resultMessaging = [
'success' => false,
'message' => 'Failed to send notification',
'error' => $e->getMessage(),
];
}
$createTemplate = $this->notificationHelper->createTemplateForClass(
$classId,
$template->title,
$template->body,
$type,
$userId,
);
// store to database
Notification::create($createTemplate->toArray());
return response()->json([
'success' => true,
'message' => 'Notification sent to class topic successfully',
'data' => [
'messaging' => $resultMessaging,
'create_template' => $createTemplate->toArray(),
]
]);
} catch (\Throwable $th) {
//throw $th;
return response()->json([
'success' => false,
'error' => 'Failed to send notification',
'message' => $th->getMessage()], 500);
}
}
public function store(Request $request)
{
Notification::create([
'title' => 'Test',
'body' => 'Test body',
'sender_id' => Auth::id()
]);
return back()->with('success', 'Notifikasi dibuat');
}
public function destroy(int $id)
{
try {
// Auth user
$user = request()->user();
if (!$user) {
return redirect()->back()->with('error', 'Unauthorized');
}
// Find notification by id
$notification = Notification::find($id);
if (!$notification) {
return redirect()->back()->with('error', 'Notifikasi tidak ditemukan');
}
// Delete notification
$notification->delete();
return redirect()->back()->with('success', 'Notifikasi berhasil dihapus');
} catch (\Exception $e) {
return redirect()->back()->with('error', 'Terjadi kesalahan: ' . $e->getMessage());
}
}
}