update controllers logic

This commit is contained in:
root
2026-04-23 00:04:35 -04:00
parent 1977a513df
commit ca4ba272fc
353 changed files with 13402 additions and 1301 deletions
Executable → Regular
+149 -64
View File
@@ -3,8 +3,7 @@
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\Auth\AuthController;
use App\Http\Controllers\DocsController;
use App\Http\Controllers\Api\UserController;
use App\Http\Controllers\Api\Users\UserController;
use App\Http\Controllers\Api\Administrator\AdministratorEnrollmentController;
use App\Http\Controllers\Api\Administrator\AdministratorAbsenceController;
use App\Http\Controllers\Api\Administrator\AdministratorDashboardController;
@@ -14,7 +13,6 @@ use App\Http\Controllers\Api\Administrator\EmergencyContactController as Adminis
use App\Http\Controllers\Api\Administrator\TeacherClassAssignmentController;
use App\Http\Controllers\Api\Badges\BadgeController;
use App\Http\Controllers\Api\Students\StudentController;
use App\Http\Controllers\Api\Attendance\AttendanceController;
use App\Http\Controllers\Api\Students\StudentController as StudentApiController;
use App\Http\Controllers\Api\Finance\InvoiceController;
use App\Http\Controllers\Api\Assignment\AssignmentApiController;
@@ -77,15 +75,15 @@ use App\Http\Controllers\Api\Finance\PaymentEventChargesController;
use App\Http\Controllers\Api\Finance\PaymentManualController;
use App\Http\Controllers\Api\Finance\PaypalPaymentController;
use App\Http\Controllers\Api\Auth\RegisterController;
use App\Http\Controllers\Api\RolePermissionController;
use App\Http\Controllers\Api\RoleSwitcherController;
use App\Http\Controllers\Api\Auth\RolePermissionController;
use App\Http\Controllers\Api\Auth\RoleSwitcherController;
use App\Http\Controllers\Api\Settings\SchoolCalendarController;
use App\Http\Controllers\Api\Scores\ScorePredictorController;
use App\Http\Controllers\Api\Reports\SlipPrinterController;
use App\Http\Controllers\Api\Inventory\SupplierController;
use App\Http\Controllers\Api\Inventory\SupplyCategoryController;
use App\Http\Controllers\Api\Staff\TeacherController;
use App\Http\Controllers\Api\StatsController;
use App\Http\Controllers\Api\System\StatsController;
use App\Http\Controllers\Api\Ui\UiController;
use App\Http\Controllers\Api\Support\ContactController as SupportContactController;
use App\Http\Controllers\Api\Support\SupportController as ApiSupportController;
@@ -113,8 +111,77 @@ use App\Http\Controllers\Api\Attendance\AdminAttendanceApiController;
use App\Http\Controllers\Api\Attendance\AttendanceCommentTemplateController;
use App\Http\Controllers\Api\Attendance\TeacherAttendanceApiController;
use App\Http\Controllers\Api\Attendance\StaffAttendanceApiController;
use App\Http\Controllers\Api\Utilities\ProofreadController;
use App\Http\Controllers\Api\PrintRequests\PrintRequestsController;
use App\Http\Controllers\Api\BadgeScan\BadgeScanController;
use App\Http\Controllers\Api\Documentation\ApiDocsAdminController;
use App\Http\Controllers\Api\Documentation\DocsCatalogController;
use App\Http\Controllers\Api\Parents\AuthorizedUserInviteController;
use App\Http\Controllers\Api\Public\PublicWinnersController;
use App\Http\Controllers\Api\Staff\TimeOffNotificationController;
use App\Http\Controllers\Api\System\AccessDeniedController;
// CodeIgniter also registers POST /api/login and POST /api/register (public, no /v1).
Route::post('login', [AuthController::class, 'login']);
Route::post('register', [RegisterController::class, 'store']);
/*
| CodeIgniter POST /api/proofread (LanguageTool proxy; session or Bearer like CI auth filter).
*/
Route::post('proofread', [ProofreadController::class, 'check'])->middleware('teacher.portal.auth');
Route::get('documentation/swagger.json', [DocsCatalogController::class, 'swaggerMergedJson'])
->name('docs.swagger-json');
Route::prefix('documentation')->group(function () {
Route::get('/', [DocsCatalogController::class, 'index'])->name('docs.index');
Route::get('/swagger', [DocsCatalogController::class, 'swagger'])->name('docs.swagger.catalog');
});
Route::middleware('auth.docs')->group(function () {
Route::get('docs', [ApiDocsAdminController::class, 'index'])->name('api-docs.index');
});
Route::get('docs/public', [ApiDocsAdminController::class, 'public'])->name('api-docs.public');
Route::get('access_denied', [AccessDeniedController::class, 'accessDenied'])->name('access_denied');
Route::get('timeoff/notify/{token}', [TimeOffNotificationController::class, 'notify'])
->where('token', '[^/]+')
->name('api.timeoff.notify');
Route::prefix('winners/competitions')->group(function () {
Route::get('/', [PublicWinnersController::class, 'competitionIndex']);
Route::get('{id}', [PublicWinnersController::class, 'competitionShow'])->whereNumber('id');
});
Route::get('confirm_authorized_user', [AuthorizedUserInviteController::class, 'confirm'])
->name('api.invite.confirm');
Route::get('set_authorized_user_password/{authorizedUserId}', [AuthorizedUserInviteController::class, 'setPasswordForm'])
->whereNumber('authorizedUserId')
->name('api.invite.set-password-form');
Route::post('set_authorized_user_password/{authorizedUserId}', [AuthorizedUserInviteController::class, 'savePassword'])
->whereNumber('authorizedUserId')
->name('api.invite.set-password');
/*
| Legacy paths without /v1: POST cannot use 301 reliably; alias to same handlers as v1 (auth:api).
| GET uses 301 to canonical /api/v1/...
*/
Route::middleware('auth:api')->prefix('attendance-templates')->group(function () {
Route::post('save', [AttendanceCommentTemplateController::class, 'legacySave']);
Route::post('delete', [AttendanceCommentTemplateController::class, 'legacyDelete']);
});
Route::permanentRedirect('attendance-templates', '/api/v1/attendance-templates');
Route::permanentRedirect('attendance-comment-templates', '/api/v1/attendance-comment-templates');
Route::permanentRedirect('attendance-comment-templates/list-data', '/api/v1/attendance-comment-templates/list-data');
Route::permanentRedirect('administrator/attendance-templates', '/api/v1/administrator/attendance-templates');
Route::prefix('v1')->group(function () {
// Parity with CodeIgniter: POST /api/v1/login and POST /api/v1/register (public, no /auth prefix)
Route::post('login', [AuthController::class, 'login']);
Route::post('register', [RegisterController::class, 'store']);
Route::prefix('auth')->group(function () {
Route::get('register/captcha', [RegisterController::class, 'captcha']);
Route::post('register', [RegisterController::class, 'store']);
@@ -138,6 +205,12 @@ Route::prefix('v1')->group(function () {
Route::post('contact', [SupportContactController::class, 'send']);
/*
| Badge scan kiosk (public, throttled). Logs: authenticated staff (legacy CI RFIDController).
*/
Route::post('badge_scan/scan', [BadgeScanController::class, 'scan'])
->middleware('throttle:120,1');
Route::prefix('frontend')->group(function () {
Route::get('/', [FrontendController::class, 'index']);
Route::get('facility', [FrontendController::class, 'facility']);
@@ -168,6 +241,8 @@ Route::prefix('v1')->group(function () {
Route::post('reorder', [NavBuilderController::class, 'reorder']);
});
Route::middleware(['auth:api', 'badge_scan.logs'])->get('badge_scan/logs', [BadgeScanController::class, 'logs']);
Route::middleware('auth:api')->prefix('landing')->group(function () {
Route::get('/', [LandingPageController::class, 'index']);
Route::get('teacher', [LandingPageController::class, 'teacher']);
@@ -178,11 +253,35 @@ Route::prefix('v1')->group(function () {
Route::get('guest', [LandingPageController::class, 'guest']);
});
/*
| Print requests (CodeIgniter PrintRequests — teacher/admin JSON + uploads).
*/
Route::middleware('auth:api')->prefix('print-requests')->group(function () {
Route::middleware('print_requests.teacher')->group(function () {
Route::get('teacher', [PrintRequestsController::class, 'teacher']);
Route::post('/', [PrintRequestsController::class, 'store']);
Route::patch('{id}', [PrintRequestsController::class, 'teacherUpdate'])->whereNumber('id');
Route::delete('{id}', [PrintRequestsController::class, 'destroy'])->whereNumber('id');
Route::post('hand-copy', [PrintRequestsController::class, 'handCopy']);
Route::post('{id}/copy', [PrintRequestsController::class, 'copy'])->whereNumber('id');
});
Route::middleware('print_requests.admin')->group(function () {
Route::get('admin', [PrintRequestsController::class, 'admin']);
Route::patch('{id}/status', [PrintRequestsController::class, 'adminStatus'])->whereNumber('id');
});
Route::get('{id}/file', [PrintRequestsController::class, 'download'])->whereNumber('id');
});
Route::middleware('auth:api')->prefix('info-icon')->group(function () {
Route::get('profile', [InfoIconController::class, 'profileIcon']);
});
Route::middleware('auth:api')->prefix('administrator')->group(function () {
Route::get('attendance-templates', [AttendanceCommentTemplateController::class, 'bootstrapUrls'])
->name('api.v1.administrator.attendance-templates.bootstrap');
Route::get('absence', [AdministratorAbsenceController::class, 'index']);
Route::post('absence', [AdministratorAbsenceController::class, 'store']);
@@ -237,7 +336,7 @@ Route::prefix('v1')->group(function () {
});
});
Route::prefix('attendance-tracking')->group(function () {
Route::middleware('auth:api')->prefix('attendance-tracking')->group(function () {
Route::get('/pending-violations', [AttendanceTrackingController::class, 'pendingViolations']);
Route::get('/notified-violations', [AttendanceTrackingController::class, 'notifiedViolations']);
Route::get('/student-case/{studentId}', [AttendanceTrackingController::class, 'studentCase']);
@@ -249,7 +348,26 @@ Route::prefix('v1')->group(function () {
Route::post('/save-notification-note', [AttendanceTrackingController::class, 'saveNotificationNote']);
});
Route::prefix('assignments')->group(function () {
Route::middleware('auth:api')->prefix('attendance-comment-templates')->group(function () {
Route::get('/', [AttendanceCommentTemplateController::class, 'index'])->name('api.v1.attendance-comment-templates.index');
Route::get('list-data', [AttendanceCommentTemplateController::class, 'listData'])
->name('api.v1.attendance-comment-templates.list-data');
Route::get('{id}', [AttendanceCommentTemplateController::class, 'show']);
Route::post('/', [AttendanceCommentTemplateController::class, 'store']);
Route::put('{id}', [AttendanceCommentTemplateController::class, 'update']);
Route::delete('{id}', [AttendanceCommentTemplateController::class, 'destroy']);
});
/*
| CodeIgniter View\AttendanceCommentTemplateController — legacy list/save/delete (auth:api).
*/
Route::middleware('auth:api')->prefix('attendance-templates')->group(function () {
Route::get('/', [AttendanceCommentTemplateController::class, 'listData'])->name('api.v1.attendance-templates.legacy');
Route::post('save', [AttendanceCommentTemplateController::class, 'legacySave']);
Route::post('delete', [AttendanceCommentTemplateController::class, 'legacyDelete']);
});
Route::middleware('auth:api')->prefix('assignments')->group(function () {
Route::get('/', [AssignmentApiController::class, 'index']);
Route::post('/', [AssignmentApiController::class, 'store']);
Route::get('/class-assignment-data', [AssignmentApiController::class, 'classAssignmentData']);
@@ -416,10 +534,11 @@ Route::prefix('v1')->group(function () {
Route::get('{studentId}/emergency-contacts', [StudentApiController::class, 'emergencyContacts']);
Route::post('{studentId}/emergency-contacts', [StudentApiController::class, 'addEmergencyContact']);
Route::patch('{studentId}/emergency-contacts/{contactId}', [StudentApiController::class, 'updateEmergencyContact']);
Route::post('{studentId}/rfid', [StudentApiController::class, 'updateRfid']);
Route::post('{studentId}/badge_scan', [StudentApiController::class, 'updateBadgeScan']);
Route::post('{studentId}/photo', [StudentApiController::class, 'uploadPhoto']);
Route::get('{studentId}/photo', [StudentApiController::class, 'photo']);
Route::get('{studentId}/report-card', [ReportCardsController::class, 'studentReport']);
Route::get('{studentId}/report-card', [ReportCardsController::class, 'studentReport'])
->name('api.v1.students.report-card');
Route::get('{studentId}/score-card', [StudentApiController::class, 'scoreCard']);
});
@@ -444,6 +563,12 @@ Route::prefix('v1')->group(function () {
Route::get('attendance-reports', [ParentAttendanceReportApiController::class, 'list']);
Route::post('attendance-reports/check-existing', [ParentAttendanceReportApiController::class, 'checkExisting']);
Route::patch('attendance-reports/{reportId}', [ParentAttendanceReportApiController::class, 'update']);
Route::get('authorized-users', [AuthorizedUsersController::class, 'index']);
Route::get('authorized-users/{id}', [AuthorizedUsersController::class, 'show'])->whereNumber('id');
Route::post('authorized-users', [AuthorizedUsersController::class, 'store']);
Route::patch('authorized-users/{id}', [AuthorizedUsersController::class, 'update'])->whereNumber('id');
Route::delete('authorized-users/{id}', [AuthorizedUsersController::class, 'destroy'])->whereNumber('id');
});
Route::prefix('users')->group(function () {
@@ -587,7 +712,8 @@ Route::prefix('v1')->group(function () {
Route::post('batches/assign', [ReimbursementController::class, 'updateBatchAssignment']);
Route::post('batches/lock', [ReimbursementController::class, 'lockBatch']);
Route::post('batches/admin-files', [ReimbursementController::class, 'uploadBatchAdminFile']);
Route::get('batches/admin-files/{name}/{mode?}', [ReimbursementController::class, 'serveAdminCheckFile']);
Route::get('batches/admin-files/{name}/{mode?}', [ReimbursementController::class, 'serveAdminCheckFile'])
->name('api.v1.finance.reimbursements.admin-file');
Route::post('batches/email', [ReimbursementController::class, 'sendBatchEmail']);
Route::get('export', [ReimbursementController::class, 'export']);
Route::get('batches/export', [ReimbursementController::class, 'exportBatch']);
@@ -656,17 +782,20 @@ Route::prefix('v1')->group(function () {
Route::prefix('paypal')->group(function () {
Route::get('redirect', [PaypalPaymentController::class, 'redirect']);
Route::post('payments/{paymentId}/create', [PaypalPaymentController::class, 'create']);
Route::post('execute', [PaypalPaymentController::class, 'execute']);
Route::get('cancel', [PaypalPaymentController::class, 'cancel']);
Route::post('execute', [PaypalPaymentController::class, 'execute'])->name('api.v1.finance.paypal.execute');
Route::get('cancel', [PaypalPaymentController::class, 'cancel'])->name('api.v1.finance.paypal.cancel');
});
});
Route::prefix('files')->group(function () {
Route::get('receipts/{name}', [FilesController::class, 'receipt']);
Route::get('reimbursements/{name}', [FilesController::class, 'reimb']);
Route::get('early-dismissal/{name}', [FilesController::class, 'earlyDismissalSignature']);
Route::get('exams/teacher/{name}', [FilesController::class, 'examDraftTeacher']);
Route::get('exams/final/{name}', [FilesController::class, 'examDraftFinal']);
Route::get('receipts/{name}', [FilesController::class, 'receipt'])->name('api.v1.files.receipt');
Route::get('reimbursements/{name}', [FilesController::class, 'reimb'])->name('api.v1.files.reimbursement');
Route::get('early-dismissal/{name}', [FilesController::class, 'earlyDismissalSignature'])
->name('api.v1.files.early-dismissal');
Route::get('exams/teacher/{name}', [FilesController::class, 'examDraftTeacher'])
->name('api.v1.files.exam-draft-teacher');
Route::get('exams/final/{name}', [FilesController::class, 'examDraftFinal'])
->name('api.v1.files.exam-draft-final');
});
Route::prefix('reports/slips')->group(function () {
@@ -839,11 +968,12 @@ Route::prefix('v1')->group(function () {
Route::get('meta', [ClassProgressController::class, 'meta']);
Route::get('/', [ClassProgressController::class, 'index']);
Route::post('/', [ClassProgressController::class, 'store']);
Route::get('attachments/{attachment}', [ClassProgressController::class, 'downloadAttachment'])
->name('api.v1.class-progress.attachment');
Route::get('{class_progress}', [ClassProgressController::class, 'show']);
Route::patch('{class_progress}', [ClassProgressController::class, 'update']);
Route::delete('{class_progress}', [ClassProgressController::class, 'destroy']);
Route::get('{class_progress}/attachment', [ClassProgressController::class, 'downloadLegacyAttachment']);
Route::get('attachments/{attachment}', [ClassProgressController::class, 'downloadAttachment']);
});
Route::prefix('badges')->group(function () {
@@ -854,48 +984,3 @@ Route::prefix('v1')->group(function () {
});
});
});
Route::prefix('attendance-comment-templates')->group(function () {
Route::get('/', [AttendanceCommentTemplateController::class, 'index']);
Route::get('list-data', [AttendanceCommentTemplateController::class, 'listData']);
Route::get('{id}', [AttendanceCommentTemplateController::class, 'show']);
Route::post('/', [AttendanceCommentTemplateController::class, 'store']);
Route::put('{id}', [AttendanceCommentTemplateController::class, 'update']);
Route::delete('{id}', [AttendanceCommentTemplateController::class, 'destroy']);
});
Route::prefix('attendance-tracking')->group(function () {
Route::get('pending-violations', [AttendanceTrackingController::class, 'pendingViolations']);
Route::get('notified-violations', [AttendanceTrackingController::class, 'notifiedViolations']);
Route::get('student-case/{studentId}', [AttendanceTrackingController::class, 'studentCase']);
Route::post('record', [AttendanceTrackingController::class, 'record']);
Route::post('send-auto-emails', [AttendanceTrackingController::class, 'sendAutoEmails']);
Route::get('compose', [AttendanceTrackingController::class, 'compose']);
Route::post('send-manual-email', [AttendanceTrackingController::class, 'sendManualEmail']);
Route::get('parents-info', [AttendanceTrackingController::class, 'parentsInfo']);
Route::post('save-notification-note', [AttendanceTrackingController::class, 'saveNotificationNote']);
});
Route::middleware('auth:api')->group(function () {
Route::prefix('assignments')->group(function () {
Route::get('/', [AssignmentApiController::class, 'index']);
Route::post('/', [AssignmentApiController::class, 'store']);
Route::get('class-assignment-data', [AssignmentApiController::class, 'classAssignmentData']);
});
Route::prefix('badges')->group(function () {
Route::get('form-data', [BadgeController::class, 'formData']);
Route::post('pdf', [BadgeController::class, 'generatePdf']);
Route::get('print-status', [BadgeController::class, 'printStatus']);
Route::post('log-print', [BadgeController::class, 'logPrint']);
});
Route::prefix('class-prep')->group(function () {
Route::get('/', [ClassPreparationController::class, 'index']);
Route::post('mark-printed', [ClassPreparationController::class, 'markPrinted']);
Route::post('adjustments', [ClassPreparationController::class, 'saveAdjustments']);
Route::post('print/{classSectionId}/{schoolYear}', [ClassPreparationController::class, 'print']);
Route::get('sticker-counts', [ClassPreparationController::class, 'stickerCounts']);
Route::get('classes/{classSectionId}/students', [ClassPreparationController::class, 'studentsByClass']);
});
});