TIFNJK_E41221880/app/Http/Controllers/api/ClassController.php

252 lines
8.4 KiB
PHP

<?php
namespace App\Http\Controllers\api;
use App\Http\Controllers\Controller;
use App\Models\Classes;
use App\Models\Notification;
use App\Services\FirebaseMessagingService;
use App\Services\NotificationHelperService;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Laravel\Sanctum\PersonalAccessToken;
class ClassController extends Controller
{
protected FirebaseMessagingService $fcm;
protected NotificationHelperService $notificationHelper;
// Ambil semua data kelas
public function index()
{
return response()->json([
'success' => true,
'message' => 'Student classes fetched successfully',
'data' => Classes::all()],
200);
}
public function __construct(FirebaseMessagingService $fcm, NotificationHelperService $notificationHelper)
{
$this->fcm = $fcm;
$this->notificationHelper = $notificationHelper;
}
// Ambil detail kelas berdasarkan id
public function show($id)
{
$class = Classes::find($id);
if (!$class) {
return response()->json(['message' => 'Class not found'], 404);
}
return response()->json($class, 200);
}
// get schedule for a specific class
public function schedule(Request $request, $id)
{
// check Authorization header for Bearer token
$authHeader = $request->header('Authorization');
if (empty($authHeader) || !Str::startsWith($authHeader, 'Bearer ')) {
return response()->json(['success' => false, 'message' => 'Unauthorized'], 401);
}
$token = trim(Str::after($authHeader, 'Bearer'));
$tokenModel = PersonalAccessToken::findToken($token);
if (!$tokenModel) {
return response()->json(['success' => false, 'message' => 'Unauthorized'], 401);
}
$class = Classes::find($id);
if (!$class) {
return response()->json(['message' => 'Class not found'], 404);
}
$schedules = $class->schedules()->whereHas('academicPeriods', function ($q) {
$q->where('is_active', 1);
})->with(['subject', 'teacher'])->get();
return response()->json([
'success' => true,
'message' => 'Class schedules fetched successfully',
'data' => $schedules
], 200);
}
// get schedule for a specific class for a given day index (1=Senin,..7=Minggu)
public function scheduleByDay(Request $request, $id, $dayindex)
{
// same auth check as schedule()
$authHeader = $request->header('Authorization');
if (empty($authHeader) || !Str::startsWith($authHeader, 'Bearer ')) {
return response()->json(['success' => false, 'message' => 'Unauthorized'], 401);
}
$token = trim(Str::after($authHeader, 'Bearer'));
$tokenModel = PersonalAccessToken::findToken($token);
if (!$tokenModel) {
return response()->json(['success' => false, 'message' => 'Unauthorized'], 401);
}
$class = Classes::find($id);
if (!$class) {
return response()->json(['message' => 'Class not found'], 404);
}
$dayIndex = (int) $dayindex;
$dayNames = [1 => 'Senin', 2 => 'Selasa', 3 => 'Rabu', 4 => 'Kamis', 5 => 'Jumat', 6 => 'Sabtu', 7 => 'Minggu'];
$dayName = $dayNames[$dayIndex] ?? null;
$query = $class->schedules()->whereHas('academicPeriods', function ($q) {
$q->where('is_active', 1);
});
if ($dayName) {
$query->where(function ($q) use ($dayIndex, $dayName) {
$q->where('day_of_week', $dayName)->orWhere('day_of_week', (string) $dayIndex);
});
} else {
$query->where('day_of_week', (string) $dayIndex);
}
$schedules = $query->with(['subject', 'teacher'])->get();
return response()->json([
'success' => true,
'message' => 'Class schedules fetched successfully for day',
'day_index' => $dayIndex,
'data' => $schedules
], 200);
}
// teacher only
public function studentClassInformation($id)
{
$class = Classes::where('id', $id)->with(['students'])->first();
if (!$class) {
return response()->json(['message' => 'Class not found'], 404);
}
return response()->json([
'success' => true,
'message' => 'Class information fetched successfully',
'data' => $class,
], 200);
}
// send to class topic (announcement, homework, assignment, etc)
public function sendAnnouncementToClass(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);
}
$resultMessaging = $this->notificationHelper->send($template);
$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);
}
}
}