diff --git a/app/Config/Routes.php b/app/Config/Routes.php index d291133..c32358f 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -198,15 +198,15 @@ $routes->group('administrator/subject-curriculum', ['filter' => 'auth:update_cur $routes->post('delete/(:num)', 'View\SubjectCurriculumController::delete/$1'); }); -$routes->get('administrator/trophy', 'View\TrophyController::index', ['filter' => 'auth:admin']); -$routes->get('administrator/trophy/winners', 'View\TrophyController::winners', ['filter' => 'auth:admin']); -$routes->get('administrator/trophy/final', 'View\TrophyController::final', ['filter' => 'auth:admin']); +$routes->get('administrator/trophy', 'View\TrophyController::index', ['filter' => 'auth:admin|principal']); +$routes->get('administrator/trophy/winners', 'View\TrophyController::winners', ['filter' => 'auth:admin|principal']); +$routes->get('administrator/trophy/final', 'View\TrophyController::final', ['filter' => 'auth:admin|principal']); // Certificates -$routes->get('administrator/certificates', 'View\CertificateController::index', ['filter' => 'auth:admin']); -$routes->get('administrator/certificates/csrf-token', 'View\CertificateController::csrfToken', ['filter' => 'auth:admin']); -$routes->post('administrator/certificates/generate', 'View\CertificateController::generate', ['filter' => 'auth:admin']); -$routes->get('administrator/certificates/log', 'View\CertificateController::auditLog', ['filter' => 'auth:admin']); +$routes->get('administrator/certificates', 'View\CertificateController::index', ['filter' => 'auth:admin|principal']); +$routes->get('administrator/certificates/csrf-token', 'View\CertificateController::csrfToken', ['filter' => 'auth:admin|principal']); +$routes->post('administrator/certificates/generate', 'View\CertificateController::generate', ['filter' => 'auth:admin|principal']); +$routes->get('administrator/certificates/log', 'View\CertificateController::auditLog', ['filter' => 'auth:admin|principal']); $routes->get('administrator/certificates/reprint/(:any)', 'View\CertificateController::reprint/$1', ['filter' => 'auth:read']); $routes->get('verify/(:segment)', 'View\CertificateController::verify/$1'); @@ -423,7 +423,7 @@ $routes->get('/teacher/exam-drafts/status', 'View\ExamDraftController::teacherSt $routes->get('teacher/print-requests', 'PrintRequests::teacher_index', ['filter' => 'auth:teacher,teacher_assistant']); -$routes->get('admin/print-requests', 'PrintRequests::admin_index', ['filter' => 'auth:admin']); +$routes->get('admin/print-requests', 'PrintRequests::admin_index', ['filter' => 'auth:admin|principal']); $routes->post('print-requests/create', 'PrintRequests::create', ['filter' => 'auth:teacher,teacher_assistant']); $routes->post('print-requests/create-copy', 'PrintRequests::createCopy', ['filter' => 'auth:teacher,teacher_assistant']); @@ -442,10 +442,6 @@ $routes->get('exam-drafts/files/final/(:segment)', 'View\FilesController::examDr - - - - $routes->get('teacher/progress', 'ClassProgressController::history', ['filter' => 'auth:teacher,teacher_assistant']); $routes->get('teacher/progress/submit', 'ClassProgressController::create', ['filter' => 'auth:teacher,teacher_assistant']); $routes->post('teacher/progress/store', 'ClassProgressController::store', ['filter' => 'auth:teacher,teacher_assistant']); @@ -460,18 +456,18 @@ $routes->get('parent/progress/view/(:num)', 'ParentProgressController::view/$1', $routes->get('parent/progress/attachment/(:num)', 'ParentProgressController::attachment/$1', ['filter' => 'auth:parent']); $routes->get('parent/progress/attachment-file/(:num)', 'ParentProgressController::attachmentFile/$1', ['filter' => 'auth:parent']); -$routes->get('admin/progress', 'AdminProgressController::index', ['filter' => 'auth:admin']); -$routes->get('admin/progress/view/(:num)', 'AdminProgressController::view/$1', ['filter' => 'auth:admin']); -$routes->get('admin/progress/attachment/(:num)', 'AdminProgressController::attachment/$1', ['filter' => 'auth:admin']); -$routes->get('admin/progress/attachment-file/(:num)', 'AdminProgressController::attachmentFile/$1', ['filter' => 'auth:admin']); +$routes->get('admin/progress', 'AdminProgressController::index', ['filter' => 'auth:admin|principal']); +$routes->get('admin/progress/view/(:num)', 'AdminProgressController::view/$1', ['filter' => 'auth:admin|principal']); +$routes->get('admin/progress/attachment/(:num)', 'AdminProgressController::attachment/$1', ['filter' => 'auth:admin|principal']); +$routes->get('admin/progress/attachment-file/(:num)', 'AdminProgressController::attachmentFile/$1', ['filter' => 'auth:admin|principal']); $routes->get('/teacher/calendar', 'View\SchoolCalendarController::calendarTeacherView'); $routes->get('/teacher/absence', 'View\TeacherController::absenceForm', ['filter' => 'auth:teacher,teacher_assistant']); $routes->post('/teacher/absence', 'View\TeacherController::submitAbsence', ['filter' => 'auth:teacher,teacher_assistant']); // Admin self-service staff absence (same features as teacher page) -$routes->get('/administrator/absence', 'View\AdministratorController::absenceFormAdmin', ['filter' => 'auth:admin']); -$routes->post('/administrator/absence', 'View\AdministratorController::submitAbsenceAdmin', ['filter' => 'auth:admin']); +$routes->get('/administrator/absence', 'View\AdministratorController::absenceFormAdmin', ['filter' => 'auth:admin|principal']); +$routes->post('/administrator/absence', 'View\AdministratorController::submitAbsenceAdmin', ['filter' => 'auth:admin|principal']); $routes->get('/timeoff/notify/(:segment)', 'TimeOffNotificationController::notify/$1'); $routes->get('/teacher/showupdate_attendance', 'View\AttendanceController::showUpdateAttendanceForm'); $routes->post('/teacher/update_attendance', 'View\AttendanceController::updateAttendance'); @@ -586,11 +582,11 @@ $routes->post('grading/release-scores', 'View\GradingController::toggleParentSco $routes->post('grading/refresh-semester-scores', 'View\GradingController::refreshSemesterScores', ['filter' => 'auth:read']); // Event admin routes -$routes->get('administrator/events', 'View\EventController::index', ['filter' => 'auth:admin']); -$routes->get('administrator/events/create', 'View\EventController::create', ['filter' => 'auth:admin']); -$routes->post('administrator/events/create', 'View\EventController::create', ['filter' => 'auth:admin']); -$routes->match(['get', 'post'], 'administrator/events/edit/(:num)', 'View\EventController::edit/$1', ['filter' => 'auth:admin']); -$routes->post('administrator/events/delete/(:num)', 'View\EventController::delete/$1', ['filter' => 'auth:admin']); +$routes->get('administrator/events', 'View\EventController::index', ['filter' => 'auth:admin|principal']); +$routes->get('administrator/events/create', 'View\EventController::create', ['filter' => 'auth:admin|principal']); +$routes->post('administrator/events/create', 'View\EventController::create', ['filter' => 'auth:admin|principal']); +$routes->match(['get', 'post'], 'administrator/events/edit/(:num)', 'View\EventController::edit/$1', ['filter' => 'auth:admin|principal']); +$routes->post('administrator/events/delete/(:num)', 'View\EventController::delete/$1', ['filter' => 'auth:admin|principal']); $routes->post('payment/event_charges', 'View\EventController::eventUpdate', ['filter' => 'auth:update_invoice|view_financial_reports|administrator|administrative staff|principal,update']); // Parent event participation @@ -697,20 +693,20 @@ $routes->get('reimbursements/export', 'View\ReimbursementController::export', [' $routes->get('reimbursements', 'View\ReimbursementController::index', ['filter' => 'auth:view_financial_reports|administrator|administrative staff|principal']); // Health check (upload dirs + DB timezone columns) -$routes->get('admin/health', 'View\HealthController::index', ['filter' => 'auth:admin']); +$routes->get('admin/health', 'View\HealthController::index', ['filter' => 'auth:admin|principal']); //Notifications -$routes->get('notifications/active', 'View\NotificationsController::listActive', ['filter' => 'auth:admin']); -$routes->get('api/notifications/active', 'View\NotificationsController::activeNotificationsData', ['filter' => 'auth:admin']); -$routes->get('notifications/deleted', 'View\NotificationsController::listDeleted', ['filter' => 'auth:admin']); -$routes->get('api/notifications/deleted', 'View\NotificationsController::deletedNotificationsData', ['filter' => 'auth:admin']); -$routes->post('notifications/restore/(:num)', 'View\NotificationsController::restore/$1', ['filter' => 'auth:admin']); +$routes->get('notifications/active', 'View\NotificationsController::listActive', ['filter' => 'auth:admin|principal']); +$routes->get('api/notifications/active', 'View\NotificationsController::activeNotificationsData', ['filter' => 'auth:admin|principal']); +$routes->get('notifications/deleted', 'View\NotificationsController::listDeleted', ['filter' => 'auth:admin|principal']); +$routes->get('api/notifications/deleted', 'View\NotificationsController::deletedNotificationsData', ['filter' => 'auth:admin|principal']); +$routes->post('notifications/restore/(:num)', 'View\NotificationsController::restore/$1', ['filter' => 'auth:admin|principal']); //$routes->post('notifications/restore/(:num)', 'View\NotificationsController::restore/$1'); //$routes->get('notifications/mark-read/(:num)', 'View\NotificationsController::markAsRead/$1'); -$routes->get('/administrator/notifications_alerts', 'View\AdministratorController::notificationsAlerts', ['filter' => 'auth:admin']); -$routes->post('/administrator/notifications_alerts/save', 'View\AdministratorController::saveNotificationSubjects', ['filter' => 'auth:admin']); -$routes->get('/administrator/print-notifications', 'View\AdministratorController::printNotificationRecipients', ['filter' => 'auth:admin']); -$routes->post('/administrator/print-notifications/save', 'View\AdministratorController::savePrintNotificationRecipients', ['filter' => 'auth:admin']); +$routes->get('/administrator/notifications_alerts', 'View\AdministratorController::notificationsAlerts', ['filter' => 'auth:admin|principal']); +$routes->post('/administrator/notifications_alerts/save', 'View\AdministratorController::saveNotificationSubjects', ['filter' => 'auth:admin|principal']); +$routes->get('/administrator/print-notifications', 'View\AdministratorController::printNotificationRecipients', ['filter' => 'auth:admin|principal']); +$routes->post('/administrator/print-notifications/save', 'View\AdministratorController::savePrintNotificationRecipients', ['filter' => 'auth:admin|principal']); $routes->get( @@ -782,14 +778,14 @@ $routes->get('administrator/userSearch', 'View\AdministratorController::userSear $routes->get('/administrator/student_profiles', 'View\AdministratorController::studentProfiles'); $routes->get('/administrator/parent_profiles', 'View\AdministratorController::parentProfiles'); -$routes->get('/administrator/teacher-submissions', 'View\AdministratorController::teacherSubmissionsReport', ['filter' => 'auth:admin']); -$routes->post('/administrator/teacher-submissions/notify', 'View\AdministratorController::sendTeacherSubmissionNotifications', ['filter' => 'auth:admin']); -$routes->get('/administrator/exam-drafts', 'View\ExamDraftController::adminIndex', ['filter' => 'auth:admin']); -$routes->post('/administrator/exam-drafts/review', 'View\ExamDraftController::adminReview', ['filter' => 'auth:admin']); -$routes->post('/administrator/exam-drafts/upload-legacy', 'View\ExamDraftController::adminUploadLegacy', ['filter' => 'auth:admin']); -$routes->get('/principal/exam-drafts', 'View\ExamDraftController::principalIndex', ['filter' => 'auth:admin']); -$routes->post('/principal/exam-drafts/review', 'View\ExamDraftController::principalReview', ['filter' => 'auth:admin']); -$routes->post('/principal/exam-drafts/upload-legacy', 'View\ExamDraftController::principalUploadLegacy', ['filter' => 'auth:admin']); +$routes->get('/administrator/teacher-submissions', 'View\AdministratorController::teacherSubmissionsReport', ['filter' => 'auth:admin|principal']); +$routes->post('/administrator/teacher-submissions/notify', 'View\AdministratorController::sendTeacherSubmissionNotifications', ['filter' => 'auth:admin|principal']); +$routes->get('/administrator/exam-drafts', 'View\ExamDraftController::adminIndex', ['filter' => 'auth:admin|principal']); +$routes->post('/administrator/exam-drafts/review', 'View\ExamDraftController::adminReview', ['filter' => 'auth:admin|principal']); +$routes->post('/administrator/exam-drafts/upload-legacy', 'View\ExamDraftController::adminUploadLegacy', ['filter' => 'auth:admin|principal']); +$routes->get('/principal/exam-drafts', 'View\ExamDraftController::principalIndex', ['filter' => 'auth:admin|principal']); +$routes->post('/principal/exam-drafts/review', 'View\ExamDraftController::principalReview', ['filter' => 'auth:admin|principal']); +$routes->post('/principal/exam-drafts/upload-legacy', 'View\ExamDraftController::principalUploadLegacy', ['filter' => 'auth:admin|principal']); /* * -------------------------------------------------------------------- @@ -887,13 +883,13 @@ $routes->get('/parent/attendance', 'View\ParentController::attendance', ['filter $routes->get('parent/report-attendance', 'View\ParentAttendanceReportController::form', ['filter' => 'auth:parent']); $routes->post('parent/report-attendance', 'View\ParentAttendanceReportController::submit', ['filter' => 'auth:parent']); $routes->post('parent/report-attendance/update', 'View\ParentAttendanceReportController::update', ['filter' => 'auth:parent']); -$routes->get('attendance/parent-reports', 'View\ParentAttendanceReportController::list', ['filter' => 'auth:admin']); +$routes->get('attendance/parent-reports', 'View\ParentAttendanceReportController::list', ['filter' => 'auth:admin|principal']); // Admin/Teacher: early dismissal page by month -$routes->get('attendance/early-dismissals', 'View\ParentAttendanceReportController::earlyDismissals', ['filter' => 'auth:admin']); +$routes->get('attendance/early-dismissals', 'View\ParentAttendanceReportController::earlyDismissals', ['filter' => 'auth:admin|principal']); // Admin/Teacher: add early dismissal -$routes->get('attendance/early-dismissals/new', 'View\ParentAttendanceReportController::addEarlyDismissalForm', ['filter' => 'auth:admin']); -$routes->post('attendance/early-dismissals', 'View\ParentAttendanceReportController::saveEarlyDismissal', ['filter' => 'auth:admin']); -$routes->post('attendance/early-dismissals/signature', 'View\ParentAttendanceReportController::uploadEarlyDismissalSignature', ['filter' => 'auth:admin']); +$routes->get('attendance/early-dismissals/new', 'View\ParentAttendanceReportController::addEarlyDismissalForm', ['filter' => 'auth:admin|principal']); +$routes->post('attendance/early-dismissals', 'View\ParentAttendanceReportController::saveEarlyDismissal', ['filter' => 'auth:admin|principal']); +$routes->post('attendance/early-dismissals/signature', 'View\ParentAttendanceReportController::uploadEarlyDismissalSignature', ['filter' => 'auth:admin|principal']); // Parent report: client-side check API $routes->post('api/parent/report-attendance/check', 'View\ParentAttendanceReportController::checkExisting', ['filter' => 'auth:parent']); @@ -980,9 +976,6 @@ $routes->group('inventory', ['filter' => 'auth:view_inventory|administrator|admi // $routes->get('(:alpha)', 'View\InventoryController::index/$1'); }); - - - $routes->get('admin/enrollment/new-students', 'View\AdministratorController::showNewStudents', ['filter' => 'auth:view_new_students']); @@ -1031,13 +1024,13 @@ $routes->group('communications', static function ($routes) { //////////////////////////////////////////////// // app/Config/Routes.php -$routes->group('api', ['filter' => 'auth:admin'], static function ($routes) { +$routes->group('api', ['filter' => 'auth:admin|principal'], static function ($routes) { // Families & Guardians API $routes->get('students/(:num)/families', 'View\FamilyController::familiesByStudent/$1'); $routes->get('families/(:num)/guardians', 'View\FamilyController::guardiansByFamily/$1'); }); -$routes->group('families', ['filter' => 'auth:admin'], static function ($routes) { +$routes->group('families', ['filter' => 'auth:admin|principal'], static function ($routes) { // Allow GET for convenience in browser; keep POST for API/automation $routes->match(['get', 'post'], 'bootstrap', 'View\FamilyController::bootstrap'); // protect with auth in production $routes->post('attach-second-by-user', 'View\FamilyController::attachSecondByUser'); @@ -1049,10 +1042,10 @@ $routes->group('families', ['filter' => 'auth:admin'], static function ($routes) $routes->post('unlink-student', 'View\FamilyController::unlinkStudent'); }); // Allow GET for manual triggering from browser -$routes->match(['get', 'post'], 'families/import-legacy', 'View\FamilyController::importSecondParentsFromLegacy', ['filter' => 'auth:admin']); +$routes->match(['get', 'post'], 'families/import-legacy', 'View\FamilyController::importSecondParentsFromLegacy', ['filter' => 'auth:admin|principal']); // Admin page (protect with your auth/permission) -$routes->group('family', ['filter' => 'auth:admin'], static function ($routes) { +$routes->group('family', ['filter' => 'auth:admin|principal'], static function ($routes) { $routes->get('', 'View\FamilyAdminController::index'); $routes->get('index', 'View\FamilyAdminController::index'); $routes->get('search', 'View\FamilyAdminController::search'); @@ -1061,7 +1054,7 @@ $routes->group('family', ['filter' => 'auth:admin'], static function ($routes) { $routes->post('compose-email/send', 'View\FamilyAdminController::sendComposeEmail'); }); // Convenience alias -$routes->get('family', 'View\FamilyAdminController::index', ['filter' => 'auth:admin']); +$routes->get('family', 'View\FamilyAdminController::index', ['filter' => 'auth:admin|principal']); ////////////////////////////////////////////////////////// //upload files @@ -1079,24 +1072,24 @@ $routes->post('reimbursements/update/(:num)', 'View\ReimbursementController::upd // app/Config/Routes.php -$routes->get('whatsapp/', 'View\WhatsappController::index', ['filter' => 'auth:admin']); -$routes->post('whatsapp/sendInvites', 'View\WhatsappController::sendInvites', ['filter' => 'auth:admin']); -$routes->post('whatsapp/saveLink', 'View\WhatsappController::saveLink', ['filter' => 'auth:admin']); -$routes->get('whatsapp/parent-contacts', 'View\WhatsappController::parentContacts', ['filter' => 'auth:admin']); -$routes->get('whatsapp/parent-contacts-by-class', 'View\WhatsappController::parentContactsByClass', ['filter' => 'auth:admin']); +$routes->get('whatsapp/', 'View\WhatsappController::index', ['filter' => 'auth:admin|principal']); +$routes->post('whatsapp/sendInvites', 'View\WhatsappController::sendInvites', ['filter' => 'auth:admin|principal']); +$routes->post('whatsapp/saveLink', 'View\WhatsappController::saveLink', ['filter' => 'auth:admin|principal']); +$routes->get('whatsapp/parent-contacts', 'View\WhatsappController::parentContacts', ['filter' => 'auth:admin|principal']); +$routes->get('whatsapp/parent-contacts-by-class', 'View\WhatsappController::parentContactsByClass', ['filter' => 'auth:admin|principal']); // Track WhatsApp group membership per class/parent -$routes->match(['get', 'post'], 'whatsapp/update-membership', 'View\WhatsappController::updateMembership', ['filter' => 'auth:admin']); +$routes->match(['get', 'post'], 'whatsapp/update-membership', 'View\WhatsappController::updateMembership', ['filter' => 'auth:admin|principal']); //Attendance -$routes->get('admin/teacher-attendance', 'View\AttendanceController::index', ['filter' => 'auth:admin']); -$routes->post('admin/teacher-attendance/save', 'View\AttendanceController::save', ['filter' => 'auth:admin']); +$routes->get('admin/teacher-attendance', 'View\AttendanceController::index', ['filter' => 'auth:admin|principal']); +$routes->post('admin/teacher-attendance/save', 'View\AttendanceController::save', ['filter' => 'auth:admin|principal']); // NEW: monthly overview (all sections) -$routes->get('admin/teacher-attendance/month', 'View\AttendanceController::month', ['filter' => 'auth:admin']); -$routes->get('admin/teacher-attendance/month.csv', 'View\AttendanceController::monthCsv', ['filter' => 'auth:admin']); -$routes->get('api/admin/teacher-attendance/month', 'View\AttendanceController::monthData', ['filter' => 'auth:admin']); +$routes->get('admin/teacher-attendance/month', 'View\AttendanceController::month', ['filter' => 'auth:admin|principal']); +$routes->get('admin/teacher-attendance/month.csv', 'View\AttendanceController::monthCsv', ['filter' => 'auth:admin|principal']); +$routes->get('api/admin/teacher-attendance/month', 'View\AttendanceController::monthData', ['filter' => 'auth:admin|principal']); $routes->post('attendance/record', 'View\AttendanceTrackingController::record'); @@ -1785,13 +1778,13 @@ if (file_exists(APPPATH . 'Config/' . ENVIRONMENT . '/Routes.php')) { // ---- Administrator API endpoints (added by Codex) ---- $routes->group('api/administrator', ['namespace' => 'App\\Controllers\\Api'], static function ($routes) { $routes->get('dashboard', 'AdministratorController::dashboard'); - $routes->get('absence', 'AdministratorController::absenceInfo', ['filter' => 'auth:admin']); - $routes->post('absence', 'AdministratorController::submitAbsence', ['filter' => 'auth:admin']); - $routes->get('search', 'AdministratorController::search', ['filter' => 'auth:admin']); - $routes->get('enrollment-withdrawal/data', 'AdministratorController::enrollmentWithdrawalData', ['filter' => 'auth:admin']); - $routes->post('enrollment-withdrawal/update', 'AdministratorController::updateEnrollmentStatuses', ['filter' => 'auth:admin']); - $routes->get('students', 'AdministratorController::studentProfiles', ['filter' => 'auth:admin']); - $routes->get('parents', 'AdministratorController::parentProfiles', ['filter' => 'auth:admin']); + $routes->get('absence', 'AdministratorController::absenceInfo', ['filter' => 'auth:admin|principal']); + $routes->post('absence', 'AdministratorController::submitAbsence', ['filter' => 'auth:admin|principal']); + $routes->get('search', 'AdministratorController::search', ['filter' => 'auth:admin|principal']); + $routes->get('enrollment-withdrawal/data', 'AdministratorController::enrollmentWithdrawalData', ['filter' => 'auth:admin|principal']); + $routes->post('enrollment-withdrawal/update', 'AdministratorController::updateEnrollmentStatuses', ['filter' => 'auth:admin|principal']); + $routes->get('students', 'AdministratorController::studentProfiles', ['filter' => 'auth:admin|principal']); + $routes->get('parents', 'AdministratorController::parentProfiles', ['filter' => 'auth:admin|principal']); }); // ---- Parent API additions (parity with View) ---- $routes->group('api/parents', ['namespace' => 'App\\Controllers\\Api'], static function ($routes) {