add projet

This commit is contained in:
root
2026-03-05 12:29:37 -05:00
parent 8d1eef8ba8
commit 23b7db1107
9109 changed files with 1106501 additions and 73 deletions
+307
View File
@@ -0,0 +1,307 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Message;
use App\Models\StudentClass;
use App\Models\Student;
use App\Models\TeacherClass;
use App\Models\User;
use App\Models\UserRole;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\Response;
class MessagesController extends BaseApiController
{
protected Message $message;
protected UserRole $userRole;
protected TeacherClass $teacherClass;
protected StudentClass $studentClass;
protected Student $student;
protected User $user;
public function __construct()
{
parent::__construct();
$this->message = model(Message::class);
$this->userRole = model(UserRole::class);
$this->teacherClass = model(TeacherClass::class);
$this->studentClass = model(StudentClass::class);
$this->student = model(Student::class);
$this->user = model(User::class);
}
public function inbox()
{
$user = $this->getCurrentUser();
if (!$user) {
return $this->respondError('Authentication required', Response::HTTP_UNAUTHORIZED);
}
$messages = $this->message->getInboxMessages((int) $user->id);
return $this->success($messages, 'Inbox messages retrieved');
}
public function sent()
{
$user = $this->getCurrentUser();
if (!$user) {
return $this->respondError('Authentication required', Response::HTTP_UNAUTHORIZED);
}
$messages = $this->message->getSentMessages((int) $user->id);
return $this->success($messages, 'Sent messages retrieved');
}
public function drafts()
{
$user = $this->getCurrentUser();
if (!$user) {
return $this->respondError('Authentication required', Response::HTTP_UNAUTHORIZED);
}
$messages = $this->message->getDraftMessages((int) $user->id);
return $this->success($messages, 'Draft messages retrieved');
}
public function trash()
{
$user = $this->getCurrentUser();
if (!$user) {
return $this->respondError('Authentication required', Response::HTTP_UNAUTHORIZED);
}
$messages = $this->message->getTrashedMessages((int) $user->id);
return $this->success($messages, 'Trashed messages retrieved');
}
public function index()
{
$user = $this->getCurrentUser();
if (!$user) {
return $this->respondError('Authentication required', Response::HTTP_UNAUTHORIZED);
}
$role = $this->resolveRoleName((int) $user->id);
return $this->success([
'role' => $role,
'receivedMessages' => $this->getReceivedMessages((int) $user->id),
], 'Message overview retrieved');
}
public function send()
{
$user = $this->getCurrentUser();
if (!$user) {
return $this->respondError('Authentication required', Response::HTTP_UNAUTHORIZED);
}
$payload = $this->payloadData();
$recipientId = $payload['recipient_id'] ?? null;
if (!$recipientId && !empty($payload['recipient_role'])) {
$recipientId = $this->getRecipientId(['name' => $payload['recipient_role']]);
}
if (!$recipientId) {
return $this->respondError('Recipient not provided', Response::HTTP_UNPROCESSABLE_ENTITY);
}
$attachmentPath = $this->storeAttachment();
$data = [
'sender_id' => (int) $user->id,
'recipient_id' => (int) $recipientId,
'subject' => $payload['subject'] ?? null,
'message' => $payload['message'] ?? null,
'sent_datetime' => Carbon::now('UTC')->format('Y-m-d H:i:s'),
'message_number'=> $this->generateMessageNumber(),
'priority' => $payload['priority'] ?? 'normal',
'attachment' => $attachmentPath,
'status' => $payload['status'] ?? 'sent',
'semester' => $payload['semester'] ?? null,
'school_year' => $payload['school_year'] ?? null,
];
$message = $this->message->create($data);
return $this->success($message->toArray(), 'Message sent successfully');
}
public function receive()
{
$user = $this->getCurrentUser();
if (!$user) {
return $this->respondError('Authentication required', Response::HTTP_UNAUTHORIZED);
}
$messages = $this->getReceivedMessages((int) $user->id);
foreach ($messages as $message) {
$this->markAsRead((int) ($message['id'] ?? 0));
}
return $this->success($messages, 'Received messages retrieved');
}
/**
* GET /api/v1/messages/recipients/{type}
* Get recipients list (teachers or parents)
*/
public function getRecipients($type)
{
$user = $this->getCurrentUser();
if (!$user) {
return $this->respondError('Authentication required', Response::HTTP_UNAUTHORIZED);
}
$type = strtolower(trim((string) ($type ?? '')));
if (!in_array($type, ['teacher', 'parent'], true)) {
return $this->respondError('Unsupported recipient type. Must be "teacher" or "parent"', Response::HTTP_UNPROCESSABLE_ENTITY);
}
$recipients = [];
$teacherClasses = $this->teacherClass->findAll();
if ($type === 'teacher') {
foreach ($teacherClasses as $teacher) {
$userRow = $this->user->find($teacher['teacher_id'] ?? null);
if (!$userRow) {
continue;
}
$recipients[(int) $teacher['teacher_id']] = [
'id' => (int) $teacher['teacher_id'],
'name' => trim(($userRow['firstname'] ?? '') . ' ' . ($userRow['lastname'] ?? '')),
];
}
} elseif ($type === 'parent') {
foreach ($teacherClasses as $class) {
$students = $this->studentClass->where('class_section_id', $class['class_section_id'] ?? null)->findAll();
foreach ($students as $student) {
$studentData = $this->student->find($student['student_id'] ?? null);
if (!$studentData) {
continue;
}
// Get first parent (primary parent)
if (!empty($studentData['parent_id'])) {
$firstParent = $this->user->find($studentData['parent_id']);
if ($firstParent) {
$parentName = trim(($firstParent['firstname'] ?? '') . ' ' . ($firstParent['lastname'] ?? ''));
if ($parentName) {
$recipients[(int) $studentData['parent_id']] = [
'id' => (int) $studentData['parent_id'],
'name' => $parentName,
];
}
}
}
// Get second parent if exists
// Check if secondparent_user_id exists in students table
if (!empty($studentData['secondparent_user_id'])) {
$secondParent = $this->user->find($studentData['secondparent_user_id']);
if ($secondParent) {
$parentName = trim(($secondParent['firstname'] ?? '') . ' ' . ($secondParent['lastname'] ?? ''));
if ($parentName) {
$recipients[(int) $studentData['secondparent_user_id']] = [
'id' => (int) $studentData['secondparent_user_id'],
'name' => $parentName,
];
}
}
} else {
// Fallback: check parents table for second parent
$parentRow = DB::table('parents')
->where('firstparent_id', $studentData['parent_id'] ?? 0)
->first();
if ($parentRow && !empty($parentRow->secondparent_user_id)) {
$secondParent = $this->user->find($parentRow->secondparent_user_id);
if ($secondParent) {
$parentName = trim(($secondParent['firstname'] ?? '') . ' ' . ($secondParent['lastname'] ?? ''));
if ($parentName) {
$recipients[(int) $parentRow->secondparent_user_id] = [
'id' => (int) $parentRow->secondparent_user_id,
'name' => $parentName,
];
}
}
}
}
}
}
}
return $this->success(array_values($recipients), 'Recipients retrieved successfully');
}
protected function resolveRoleName(int $userId): ?string
{
$role = $this->userRole->newQuery()
->select('roles.name')
->join('roles', 'roles.id', '=', 'user_roles.role_id')
->where('user_roles.user_id', $userId)
->first();
return $role['name'] ?? null;
}
protected function getReceivedMessages(int $userId): array
{
$rows = DB::table('messages')
->select('messages.*', 'users.firstname AS sender_name')
->join('users', 'messages.sender_id', '=', 'users.id')
->where('messages.recipient_id', $userId)
->orderBy('sent_datetime', 'DESC')
->get()
->toArray();
return array_map(fn($row) => (array) $row, $rows);
}
protected function markAsRead(int $messageId): void
{
if ($messageId <= 0) {
return;
}
$this->message->markAsRead($messageId);
}
protected function generateMessageNumber(): string
{
return 'MSG-' . Carbon::now('UTC')->format('YmdHis');
}
protected function getRecipientId(array $role): ?int
{
$roleName = strtolower($role['name'] ?? '');
return match ($roleName) {
'teacher' => 1,
'parent' => 2,
'admin' => 3,
'student' => 4,
'guest' => 5,
'administrator' => 6,
default => null,
};
}
protected function storeAttachment(): ?string
{
/** @var UploadedFile|null $file */
$file = $this->laravelRequest->file('attachment');
if (!$file || !$file->isValid()) {
return null;
}
return Storage::putFile('messages', $file);
}
}