{ "openapi": "3.0.3", "info": { "title": "Alrahma Unified API", "version": "1.0.0", "description": "HTTP endpoints that power the Alrahma platform. Routes are namespaced under /api/v1 unless noted otherwise." }, "servers": [ { "url": "http://localhost:8000", "description": "Local development server" }, { "url": "https://localhost", "description": "Local HTTPS server" }, { "url": "{scheme}://{host}", "description": "Custom environment", "variables": { "scheme": { "default": "https", "enum": [ "http", "https" ] }, "host": { "default": "localhost:8000" } } } ], "components": { "securitySchemes": { "bearerAuth": { "type": "http", "scheme": "bearer", "bearerFormat": "JWT" } }, "schemas": { "ErrorResponse": { "type": "object", "properties": { "status": { "type": "boolean", "example": false }, "message": { "type": "string", "example": "Validation failed" }, "errors": { "type": "object", "additionalProperties": true } } }, "Pagination": { "type": "object", "properties": { "current_page": { "type": "integer", "example": 1 }, "per_page": { "type": "integer", "example": 20 }, "total": { "type": "integer", "example": 250 }, "total_pages": { "type": "integer", "example": 13 } } }, "PaginatedResponse": { "type": "object", "properties": { "status": { "type": "boolean", "example": true }, "message": { "type": "string", "example": "Students retrieved successfully" }, "data": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Student" } }, "pagination": { "$ref": "#/components/schemas/Pagination" } } } } }, "Student": { "type": "object", "properties": { "id": { "type": "integer", "example": 42 }, "school_year": { "type": "string" }, "school_id": { "type": "string" }, "firstname": { "type": "string", "example": "Ahmed" }, "lastname": { "type": "string", "example": "Rahman" }, "dob": { "type": "string", "format": "date", "example": "2013-04-22" }, "age": { "type": "integer" }, "gender": { "type": "string", "enum": [ "male", "female" ] }, "is_active": { "type": "boolean" }, "registration_grade": { "type": "string" }, "is_new": { "type": "boolean" }, "photo_consent": { "type": "boolean" }, "parent_id": { "type": "integer" }, "registration_date": { "type": "string", "format": "date" }, "tuition_paid": { "type": "boolean" }, "semester": { "type": "string" }, "year_of_registration": { "type": "integer" }, "name": { "type": "string" }, "cellphone": { "type": "string" }, "email": { "type": "string" }, "relation": { "type": "string" }, "current_class": { "type": "object", "nullable": true } } }, "AttendanceRecord": { "type": "object", "properties": { "id": { "type": "integer", "example": 321 }, "student_id": { "type": "integer", "example": 42 }, "class_section_id": { "type": "integer", "example": 8 }, "date": { "type": "string", "format": "date", "example": "2024-11-01" }, "status": { "type": "string", "enum": [ "present", "absent", "late" ] }, "notes": { "type": "string", "nullable": true } } }, "Invoice": { "type": "object", "properties": { "id": { "type": "integer", "example": 101 }, "parent_id": { "type": "integer", "example": 55 }, "status": { "type": "string", "example": "pending" }, "balance": { "type": "number", "format": "float", "example": 125.5 }, "description": { "type": "string" }, "school_year": { "type": "string", "example": "2024-2025" }, "semester": { "type": "string", "example": "Fall" } } }, "LoginRequest": { "type": "object", "required": [ "email", "password" ], "properties": { "email": { "type": "string", "format": "email", "example": "admin@example.com" }, "password": { "type": "string", "example": "secret" } } }, "LoginResponse": { "type": "object", "required": [ "status", "token", "access_token", "token_type", "expires_in", "user" ], "properties": { "status": { "type": "boolean", "example": true }, "token": { "type": "string", "example": "eyJ0eXAiOiJKV1QiLCJh..." }, "access_token": { "type": "string", "example": "eyJ0eXAiOiJKV1QiLCJh..." }, "token_type": { "type": "string", "example": "bearer" }, "expires_in": { "type": "integer", "example": 216000 }, "user": { "type": "object", "required": [ "id", "name", "roles" ], "properties": { "id": { "type": "integer", "example": 2 }, "name": { "type": "string", "example": "Amina Teacher" }, "firstname": { "type": "string", "nullable": true, "example": "Amina" }, "lastname": { "type": "string", "nullable": true, "example": "Teacher" }, "email": { "type": "string", "format": "email", "nullable": true, "example": "amina.teacher@example.test" }, "roles": { "type": "object", "additionalProperties": { "type": "boolean" }, "example": { "teacher": true } }, "class_section_id": { "type": "integer", "nullable": true, "example": 42 }, "class_section_name": { "type": "string", "nullable": true, "example": "Grade 5 - A" } } } } }, "RegisterRequest": { "type": "object", "required": [ "firstname", "lastname", "gender", "email", "confirm_email", "cellphone", "city", "state", "zip", "accept_school_policy", "captcha" ], "properties": { "firstname": { "type": "string", "example": "Yara" }, "lastname": { "type": "string", "example": "Khalil" }, "gender": { "type": "string", "example": "Female" }, "email": { "type": "string", "format": "email", "example": "parent@example.com" }, "confirm_email": { "type": "string", "format": "email", "example": "parent@example.com" }, "cellphone": { "type": "string", "example": "203-555-1234" }, "address_street": { "type": "string", "example": "123 Main St" }, "apt": { "type": "string", "example": "Apt 4B" }, "city": { "type": "string", "example": "New Haven" }, "state": { "type": "string", "example": "CT" }, "zip": { "type": "string", "example": "06510" }, "accept_school_policy": { "type": "boolean", "example": true }, "captcha": { "type": "string", "example": "A1B2" }, "is_parent": { "type": "boolean", "example": true }, "no_second_parent_info": { "type": "boolean", "example": false }, "second_firstname": { "type": "string", "example": "Omar" }, "second_lastname": { "type": "string", "example": "Khalil" }, "second_gender": { "type": "string", "example": "Male" }, "second_email": { "type": "string", "format": "email", "example": "second.parent@example.com" }, "second_cellphone": { "type": "string", "example": "203-555-4567" } } }, "UserSummary": { "type": "object", "properties": { "id": { "type": "integer", "example": 4321 }, "firstname": { "type": "string", "example": "Yara" }, "lastname": { "type": "string", "example": "Khalil" }, "email": { "type": "string", "format": "email", "example": "parent@example.com" }, "school_id": { "type": "string", "example": "SID-AB12CD34" }, "status": { "type": "string", "example": "active" } } }, "RegisterResponse": { "type": "object", "properties": { "ok": { "type": "boolean", "example": true }, "registration": { "type": "object", "properties": { "user_id": { "type": "integer", "example": 4321 }, "email": { "type": "string", "format": "email", "example": "parent@example.com" }, "firstname": { "type": "string", "example": "Yara" }, "lastname": { "type": "string", "example": "Khalil" }, "role": { "type": "string", "example": "parent" }, "activation_sent": { "type": "boolean", "example": true } } } } }, "ForgotPasswordRequest": { "type": "object", "required": [ "email" ], "properties": { "email": { "type": "string", "format": "email", "example": "parent@example.com" } } }, "PasswordResetRequest": { "type": "object", "required": [ "token", "password", "pass_confirm" ], "properties": { "token": { "type": "string", "example": "abc123reset" }, "password": { "type": "string", "example": "Str0ngReset!" }, "pass_confirm": { "type": "string", "example": "Str0ngReset!" } } }, "SetPasswordRequest": { "type": "object", "required": [ "user_id", "token", "password", "password_confirm" ], "properties": { "user_id": { "type": "integer", "example": 4321 }, "token": { "type": "string", "example": "def456confirm" }, "password": { "type": "string", "example": "NewPass123!" }, "password_confirm": { "type": "string", "example": "NewPass123!" } } }, "MessageResponse": { "type": "object", "properties": { "status": { "type": "boolean", "example": true }, "message": { "type": "string", "example": "Check your inbox for the next steps." } } }, "LoginActivityRecord": { "type": "object", "properties": { "user_id": { "type": "integer", "example": 7 }, "email": { "type": "string", "format": "email", "example": "parent@example.com" }, "login_time": { "type": "string", "format": "date-time", "example": "2025-08-15T08:22:41" }, "logout_time": { "type": [ "string", "null" ], "format": "date-time", "example": null }, "ip_address": { "type": "string", "example": "192.0.2.55" }, "user_agent": { "type": "string", "example": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" } } }, "LoginActivityResponse": { "type": "object", "properties": { "status": { "type": "boolean", "example": true }, "data": { "type": "object", "properties": { "activities": { "type": "array", "items": { "$ref": "#/components/schemas/LoginActivityRecord" } }, "pagination": { "$ref": "#/components/schemas/Pagination" } } }, "message": { "type": "string", "example": "Login activity retrieved" } } }, "WebRegisterForm": { "type": "object", "required": [ "firstname", "lastname", "gender", "email", "confirm_email", "cellphone", "address_street", "city", "state", "zip", "accept_school_policy", "captcha" ], "properties": { "firstname": { "type": "string", "example": "Amina" }, "lastname": { "type": "string", "example": "El-Sayed" }, "gender": { "type": "string", "enum": [ "Male", "Female" ], "example": "Female" }, "email": { "type": "string", "format": "email", "example": "parent@alrahma.org" }, "confirm_email": { "type": "string", "format": "email", "example": "parent@alrahma.org" }, "cellphone": { "type": "string", "example": "203-555-0147" }, "address_street": { "type": "string", "example": "123 Elm Street" }, "apt": { "type": "string", "example": "Apt 5" }, "city": { "type": "string", "example": "Hartford" }, "state": { "type": "string", "enum": [ "CT", "ME", "MA", "NH", "NY", "RI", "VT" ], "example": "CT" }, "zip": { "type": "string", "example": "06106" }, "accept_school_policy": { "type": "boolean", "example": true }, "captcha": { "type": "string", "example": "7F3Z" }, "is_parent": { "type": "boolean", "example": true }, "no_second_parent_info": { "type": "boolean", "example": false }, "second_firstname": { "type": "string", "example": "Maya" }, "second_lastname": { "type": "string", "example": "El-Sayed" }, "second_gender": { "type": "string", "enum": [ "Male", "Female" ], "example": "Female" }, "second_email": { "type": "string", "format": "email", "example": "co-parent@alrahma.org" }, "second_cellphone": { "type": "string", "example": "203-555-0189" } } }, "WebLoginForm": { "type": "object", "required": [ "email", "password" ], "properties": { "email": { "type": "string", "format": "email", "example": "parent@alrahma.org" }, "password": { "type": "string", "example": "SecurePass123!" } } }, "WebForgotPasswordForm": { "type": "object", "required": [ "email" ], "properties": { "email": { "type": "string", "format": "email", "example": "parent@alrahma.org" } } }, "WebResetPasswordForm": { "type": "object", "required": [ "token", "password", "pass_confirm" ], "properties": { "token": { "type": "string", "example": "abc123reset" }, "password": { "type": "string", "example": "Str0ngReset!" }, "pass_confirm": { "type": "string", "example": "Str0ngReset!" } } }, "WebSetPasswordForm": { "type": "object", "required": [ "user_id", "token", "password", "password_confirm" ], "properties": { "user_id": { "type": "integer", "example": 4321 }, "token": { "type": "string", "example": "def456confirm" }, "password": { "type": "string", "example": "NewPass123!" }, "password_confirm": { "type": "string", "example": "NewPass123!" } } } }, "responses": { "UnauthorizedError": { "description": "Missing or invalid bearer token", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } }, "security": [ { "bearerAuth": [] } ], "x-controllers": [ { "name": "AdministratorController", "class": "App\\Http\\Controllers\\Api\\AdministratorController", "path": "app/Http/Controllers/Api/AdministratorController.php" }, { "name": "AssignmentController", "class": "App\\Http\\Controllers\\Api\\AssignmentController", "path": "app/Http/Controllers/Api/AssignmentController.php" }, { "name": "AttendanceController", "class": "App\\Http\\Controllers\\Api\\AttendanceController", "path": "app/Http/Controllers/Api/AttendanceController.php" }, { "name": "AttendanceTrackingController", "class": "App\\Http\\Controllers\\Api\\AttendanceTrackingController", "path": "app/Http/Controllers/Api/AttendanceTrackingController.php" }, { "name": "AuthorizedUsersController", "class": "App\\Http\\Controllers\\Api\\AuthorizedUsersController", "path": "app/Http/Controllers/Api/AuthorizedUsersController.php" }, { "name": "BaseApiController", "class": "App\\Http\\Controllers\\Api\\Core\\BaseApiController", "path": "app/Http/Controllers/Api/Core/BaseApiController.php" }, { "name": "BroadcastEmailController", "class": "App\\Http\\Controllers\\Api\\BroadcastEmailController", "path": "app/Http/Controllers/Api/BroadcastEmailController.php" }, { "name": "CalendarController", "class": "App\\Http\\Controllers\\Api\\CalendarController", "path": "app/Http/Controllers/Api/CalendarController.php" }, { "name": "request adapter", "class": "App\\Http\\Controllers\\Api\\Core\\request adapter", "path": "app/Http/Controllers/Api/Core/request adapter.php" }, { "name": "ClassController", "class": "App\\Http\\Controllers\\Api\\ClassController", "path": "app/Http/Controllers/Api/ClassController.php" }, { "name": "ClassPreparationController", "class": "App\\Http\\Controllers\\Api\\ClassPreparationController", "path": "app/Http/Controllers/Api/ClassPreparationController.php" }, { "name": "CommunicationController", "class": "App\\Http\\Controllers\\Api\\CommunicationController", "path": "app/Http/Controllers/Api/CommunicationController.php" }, { "name": "ConfigurationController", "class": "App\\Http\\Controllers\\Api\\ConfigurationController", "path": "app/Http/Controllers/Api/ConfigurationController.php" }, { "name": "ContactController", "class": "App\\Http\\Controllers\\Api\\ContactController", "path": "app/Http/Controllers/Api/ContactController.php" }, { "name": "DiscountController", "class": "App\\Http\\Controllers\\Api\\DiscountController", "path": "app/Http/Controllers/Api/DiscountController.php" }, { "name": "EmailController", "class": "App\\Http\\Controllers\\Api\\EmailController", "path": "app/Http/Controllers/Api/EmailController.php" }, { "name": "EmailExtractorController", "class": "App\\Http\\Controllers\\Api\\EmailExtractorController", "path": "app/Http/Controllers/Api/EmailExtractorController.php" }, { "name": "EmergencyContactController", "class": "App\\Http\\Controllers\\Api\\EmergencyContactController", "path": "app/Http/Controllers/Api/EmergencyContactController.php" }, { "name": "EventController", "class": "App\\Http\\Controllers\\Api\\EventController", "path": "app/Http/Controllers/Api/EventController.php" }, { "name": "ExpenseController", "class": "App\\Http\\Controllers\\Api\\ExpenseController", "path": "app/Http/Controllers/Api/ExpenseController.php" }, { "name": "ExtraChargesController", "class": "App\\Http\\Controllers\\Api\\ExtraChargesController", "path": "app/Http/Controllers/Api/ExtraChargesController.php" }, { "name": "FamilyAdminController", "class": "App\\Http\\Controllers\\Api\\FamilyAdminController", "path": "app/Http/Controllers/Api/FamilyAdminController.php" }, { "name": "FamilyController", "class": "App\\Http\\Controllers\\Api\\FamilyController", "path": "app/Http/Controllers/Api/FamilyController.php" }, { "name": "FilesController", "class": "App\\Http\\Controllers\\Api\\FilesController", "path": "app/Http/Controllers/Api/FilesController.php" }, { "name": "FinalController", "class": "App\\Http\\Controllers\\Api\\FinalController", "path": "app/Http/Controllers/Api/FinalController.php" }, { "name": "FinancialController", "class": "App\\Http\\Controllers\\Api\\FinancialController", "path": "app/Http/Controllers/Api/FinancialController.php" }, { "name": "FlagController", "class": "App\\Http\\Controllers\\Api\\FlagController", "path": "app/Http/Controllers/Api/FlagController.php" }, { "name": "FrontendController", "class": "App\\Http\\Controllers\\Api\\FrontendController", "path": "app/Http/Controllers/Api/FrontendController.php" }, { "name": "GradingController", "class": "App\\Http\\Controllers\\Api\\GradingController", "path": "app/Http/Controllers/Api/GradingController.php" }, { "name": "HealthController", "class": "App\\Http\\Controllers\\Api\\HealthController", "path": "app/Http/Controllers/Api/HealthController.php" }, { "name": "HomeworkController", "class": "App\\Http\\Controllers\\Api\\HomeworkController", "path": "app/Http/Controllers/Api/HomeworkController.php" }, { "name": "HomeworkTrackingController", "class": "App\\Http\\Controllers\\Api\\HomeworkTrackingController", "path": "app/Http/Controllers/Api/HomeworkTrackingController.php" }, { "name": "InventoryController", "class": "App\\Http\\Controllers\\Api\\InventoryController", "path": "app/Http/Controllers/Api/InventoryController.php" }, { "name": "InvoiceController", "class": "App\\Http\\Controllers\\Api\\InvoiceController", "path": "app/Http/Controllers/Api/InvoiceController.php" }, { "name": "IpBanController", "class": "App\\Http\\Controllers\\Api\\IpBanController", "path": "app/Http/Controllers/Api/IpBanController.php" }, { "name": "LandingPageController", "class": "App\\Http\\Controllers\\Api\\LandingPageController", "path": "app/Http/Controllers/Api/LandingPageController.php" }, { "name": "LateSlipLogsController", "class": "App\\Http\\Controllers\\Api\\LateSlipLogsController", "path": "app/Http/Controllers/Api/LateSlipLogsController.php" }, { "name": "MessageController", "class": "App\\Http\\Controllers\\Api\\MessageController", "path": "app/Http/Controllers/Api/MessageController.php" }, { "name": "MessagesController", "class": "App\\Http\\Controllers\\Api\\MessagesController", "path": "app/Http/Controllers/Api/MessagesController.php" }, { "name": "MessagingController", "class": "App\\Http\\Controllers\\Api\\MessagingController", "path": "app/Http/Controllers/Api/MessagingController.php" }, { "name": "NavBuilderController", "class": "App\\Http\\Controllers\\Api\\NavBuilderController", "path": "app/Http/Controllers/Api/NavBuilderController.php" }, { "name": "NotificationController", "class": "App\\Http\\Controllers\\Api\\NotificationController", "path": "app/Http/Controllers/Api/NotificationController.php" }, { "name": "NotificationsController", "class": "App\\Http\\Controllers\\Api\\NotificationsController", "path": "app/Http/Controllers/Api/NotificationsController.php" }, { "name": "PageController", "class": "App\\Http\\Controllers\\Api\\PageController", "path": "app/Http/Controllers/Api/PageController.php" }, { "name": "ParentAttendanceReportController", "class": "App\\Http\\Controllers\\Api\\ParentAttendanceReportController", "path": "app/Http/Controllers/Api/ParentAttendanceReportController.php" }, { "name": "ParentController", "class": "App\\Http\\Controllers\\Api\\ParentController", "path": "app/Http/Controllers/Api/ParentController.php" }, { "name": "ParticipationController", "class": "App\\Http\\Controllers\\Api\\ParticipationController", "path": "app/Http/Controllers/Api/ParticipationController.php" }, { "name": "PaymentController", "class": "App\\Http\\Controllers\\Api\\PaymentController", "path": "app/Http/Controllers/Api/PaymentController.php" }, { "name": "PaymentNotificationController", "class": "App\\Http\\Controllers\\Api\\PaymentNotificationController", "path": "app/Http/Controllers/Api/PaymentNotificationController.php" }, { "name": "PaymentTransactionController", "class": "App\\Http\\Controllers\\Api\\PaymentTransactionController", "path": "app/Http/Controllers/Api/PaymentTransactionController.php" }, { "name": "PaypalTransactionsController", "class": "App\\Http\\Controllers\\Api\\PaypalTransactionsController", "path": "app/Http/Controllers/Api/PaypalTransactionsController.php" }, { "name": "PaypalWebhook", "class": "App\\Http\\Controllers\\Api\\PaypalWebhook", "path": "app/Http/Controllers/Api/PaypalWebhook.php" }, { "name": "PolicyController", "class": "App\\Http\\Controllers\\Api\\PolicyController", "path": "app/Http/Controllers/Api/PolicyController.php" }, { "name": "PreferencesController", "class": "App\\Http\\Controllers\\Api\\PreferencesController", "path": "app/Http/Controllers/Api/PreferencesController.php" }, { "name": "PrintablesReportsController", "class": "App\\Http\\Controllers\\Api\\PrintablesReportsController", "path": "app/Http/Controllers/Api/PrintablesReportsController.php" }, { "name": "ProjectController", "class": "App\\Http\\Controllers\\Api\\ProjectController", "path": "app/Http/Controllers/Api/ProjectController.php" }, { "name": "PurchaseOrderController", "class": "App\\Http\\Controllers\\Api\\PurchaseOrderController", "path": "app/Http/Controllers/Api/PurchaseOrderController.php" }, { "name": "QuizController", "class": "App\\Http\\Controllers\\Api\\QuizController", "path": "app/Http/Controllers/Api/QuizController.php" }, { "name": "BadgeScanController", "class": "App\\Http\\Controllers\\Api\\BadgeScan\\BadgeScanController", "path": "app/Http/Controllers/Api/BadgeScan/BadgeScanController.php" }, { "name": "RefundController", "class": "App\\Http\\Controllers\\Api\\RefundController", "path": "app/Http/Controllers/Api/RefundController.php" }, { "name": "RegisterController", "class": "App\\Http\\Controllers\\Api\\RegisterController", "path": "app/Http/Controllers/Api/RegisterController.php" }, { "name": "ReimbursementController", "class": "App\\Http\\Controllers\\Api\\ReimbursementController", "path": "app/Http/Controllers/Api/ReimbursementController.php" }, { "name": "RolePermissionController", "class": "App\\Http\\Controllers\\Api\\Auth\\RolePermissionController", "path": "app/Http/Controllers/Api/Auth/RolePermissionController.php" }, { "name": "RoleSwitcherController", "class": "App\\Http\\Controllers\\Api\\Auth\\RoleSwitcherController", "path": "app/Http/Controllers/Api/Auth/RoleSwitcherController.php" }, { "name": "SchoolCalendarController", "class": "App\\Http\\Controllers\\Api\\SchoolCalendarController", "path": "app/Http/Controllers/Api/SchoolCalendarController.php" }, { "name": "ScoreCommentController", "class": "App\\Http\\Controllers\\Api\\ScoreCommentController", "path": "app/Http/Controllers/Api/ScoreCommentController.php" }, { "name": "ScoreController", "class": "App\\Http\\Controllers\\Api\\ScoreController", "path": "app/Http/Controllers/Api/ScoreController.php" }, { "name": "ScorePredictorController", "class": "App\\Http\\Controllers\\Api\\ScorePredictorController", "path": "app/Http/Controllers/Api/ScorePredictorController.php" }, { "name": "SendSMSController", "class": "App\\Http\\Controllers\\Api\\SendSMSController", "path": "app/Http/Controllers/Api/SendSMSController.php" }, { "name": "SessionController", "class": "App\\Http\\Controllers\\Api\\SessionController", "path": "app/Http/Controllers/Api/SessionController.php" }, { "name": "SessionTimeoutController", "class": "App\\Http\\Controllers\\Api\\SessionTimeoutController", "path": "app/Http/Controllers/Api/SessionTimeoutController.php" }, { "name": "SettingsController", "class": "App\\Http\\Controllers\\Api\\SettingsController", "path": "app/Http/Controllers/Api/SettingsController.php" }, { "name": "SlipPrinterController", "class": "App\\Http\\Controllers\\Api\\SlipPrinterController", "path": "app/Http/Controllers/Api/SlipPrinterController.php" }, { "name": "StaffController", "class": "App\\Http\\Controllers\\Api\\StaffController", "path": "app/Http/Controllers/Api/StaffController.php" }, { "name": "StatsController", "class": "App\\Http\\Controllers\\Api\\System\\StatsController", "path": "app/Http/Controllers/Api/System/StatsController.php" }, { "name": "StudentController", "class": "App\\Http\\Controllers\\Api\\StudentController", "path": "app/Http/Controllers/Api/StudentController.php" }, { "name": "SupplierController", "class": "App\\Http\\Controllers\\Api\\SupplierController", "path": "app/Http/Controllers/Api/SupplierController.php" }, { "name": "SupplyCategoryController", "class": "App\\Http\\Controllers\\Api\\SupplyCategoryController", "path": "app/Http/Controllers/Api/SupplyCategoryController.php" }, { "name": "SupportController", "class": "App\\Http\\Controllers\\Api\\SupportController", "path": "app/Http/Controllers/Api/SupportController.php" }, { "name": "TeacherController", "class": "App\\Http\\Controllers\\Api\\TeacherController", "path": "app/Http/Controllers/Api/TeacherController.php" }, { "name": "TestDBController", "class": "App\\Http\\Controllers\\Api\\TestDBController", "path": "app/Http/Controllers/Api/TestDBController.php" }, { "name": "TimeController", "class": "App\\Http\\Controllers\\Api\\TimeController", "path": "app/Http/Controllers/Api/TimeController.php" }, { "name": "UiController", "class": "App\\Http\\Controllers\\Api\\UiController", "path": "app/Http/Controllers/Api/UiController.php" }, { "name": "UserController", "class": "App\\Http\\Controllers\\Api\\Users\\UserController", "path": "app/Http/Controllers/Api/Users/UserController.php" }, { "name": "WhatsappController", "class": "App\\Http\\Controllers\\Api\\WhatsappController", "path": "app/Http/Controllers/Api/WhatsappController.php" }, { "name": "AuthController", "class": "App\\Http\\Controllers\\Api\\Auth\\AuthController", "path": "app/Http/Controllers/Api/Auth/AuthController.php" } ], "paths": { "/api/v1/auth/register": { "post": { "operationId": "register", "tags": [ "Auth" ], "summary": "Create a parent account and trigger email verification", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RegisterRequest" } } } }, "responses": { "201": { "description": "Parent account created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RegisterResponse" } } } }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/auth/forgot-password": { "post": { "operationId": "forgotPassword", "tags": [ "Auth" ], "summary": "Request a password reset link", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ForgotPasswordRequest" } } } }, "responses": { "200": { "description": "Email sent (or queued)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MessageResponse" } } } }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/auth/reset-password": { "post": { "operationId": "resetPassword", "tags": [ "Auth" ], "summary": "Submit a new password using the reset token received via email", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PasswordResetRequest" } } } }, "responses": { "200": { "description": "Password changed successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MessageResponse" } } } }, "422": { "description": "Validation or token error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/auth/set-password": { "post": { "operationId": "setPassword", "tags": [ "Auth" ], "summary": "Complete account setup by choosing a new password after email confirmation", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SetPasswordRequest" } } } }, "responses": { "200": { "description": "Password saved", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MessageResponse" } } } }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/auth/login": { "post": { "operationId": "login", "tags": [ "Auth" ], "summary": "Issue a JWT for a valid user", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LoginRequest" } } } }, "responses": { "200": { "description": "Authentication successful", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LoginResponse" } } } }, "401": { "description": "Invalid credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } }, "security": [] } }, "/api/v1/auth/me": { "get": { "operationId": "getCurrentUser", "tags": [ "Auth" ], "summary": "Return the authenticated user's profile", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Profile data" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/auth/logout": { "post": { "operationId": "logout", "tags": [ "Auth" ], "summary": "Revoke the active token", "security": [ { "bearerAuth": [] } ], "responses": { "204": { "description": "Token revoked" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/users/login-activity": { "get": { "operationId": "getUserLoginActivity", "tags": [ "Users" ], "summary": "Get paginated login history", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }, { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 25 } } ], "responses": { "200": { "description": "Login activity" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/users": { "get": { "operationId": "listUsers", "tags": [ "Users" ], "summary": "List users", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }, { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 20 } }, { "name": "sort", "in": "query", "schema": { "type": "string", "enum": [ "id", "firstname", "lastname", "email", "role" ] } }, { "name": "order", "in": "query", "schema": { "type": "string", "enum": [ "asc", "desc" ] } } ], "responses": { "200": { "description": "Paginated user list" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "createUser", "tags": [ "Users" ], "summary": "Create a new user", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "firstname", "lastname", "email", "password", "cellphone", "address_street", "city", "state", "zip", "accept_school_policy", "role_id" ], "properties": { "firstname": { "type": "string" }, "lastname": { "type": "string" }, "email": { "type": "string", "format": "email" }, "password": { "type": "string" }, "cellphone": { "type": "string" }, "address_street": { "type": "string" }, "city": { "type": "string" }, "state": { "type": "string" }, "zip": { "type": "string" }, "accept_school_policy": { "type": "boolean" }, "role_id": { "type": "integer" } } } } } }, "responses": { "201": { "description": "User created" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/students": { "get": { "operationId": "listStudentsByYear", "tags": [ "Students" ], "summary": "StudentController::index", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "school_year", "in": "query", "schema": { "type": "string" } }, { "name": "parent_id", "in": "query", "schema": { "type": "integer" } }, { "name": "parent_ids[]", "in": "query", "schema": { "type": "array", "items": { "type": "integer" } } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } }, "post": { "operationId": "createStudent", "tags": [ "Students" ], "summary": "StudentController::store", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "school_year", "firstname", "lastname" ], "properties": { "school_year": { "type": "string" }, "firstname": { "type": "string" }, "lastname": { "type": "string" }, "dob": { "type": "string", "format": "date" }, "age": { "type": "integer" }, "gender": { "type": "string" }, "is_active": { "type": "boolean" }, "registration_grade": { "type": "string" }, "is_new": { "type": "boolean" }, "photo_consent": { "type": "boolean" }, "parent_id": { "type": "integer" }, "registration_date": { "type": "string", "format": "date" }, "tuition_paid": { "type": "boolean" }, "semester": { "type": "string" }, "year_of_registration": { "type": "integer" } } } } } }, "responses": { "201": { "description": "Created" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/students/{id}": { "get": { "operationId": "getStudent", "tags": [ "Students" ], "summary": "Retrieve a single student", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Student details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Student" } } } }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } }, "patch": { "operationId": "updateStudent", "tags": [ "Students" ], "summary": "Update a student", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "school_id": { "type": "string" }, "school_year": { "type": "string" }, "firstname": { "type": "string" }, "lastname": { "type": "string" }, "dob": { "type": "string", "format": "date" }, "age": { "type": "integer" }, "gender": { "type": "string" }, "is_active": { "type": "boolean" }, "registration_grade": { "type": "string" }, "is_new": { "type": "boolean" }, "photo_consent": { "type": "boolean" }, "parent_id": { "type": "integer" }, "registration_date": { "type": "string", "format": "date" }, "tuition_paid": { "type": "boolean" }, "semester": { "type": "string" }, "year_of_registration": { "type": "integer" }, "name": { "type": "string" }, "cellphone": { "type": "string" }, "email": { "type": "string" }, "relation": { "type": "string" } } } } } }, "responses": { "200": { "description": "Student updated" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } }, "delete": { "operationId": "deleteStudent", "tags": [ "Students" ], "summary": "Delete a student", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Student deleted" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/attendance": { "get": { "operationId": "listAttendance", "tags": [ "Attendance" ], "summary": "List attendance records", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }, { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 20 } }, { "name": "student_id", "in": "query", "schema": { "type": "integer" } }, { "name": "date", "in": "query", "schema": { "type": "string", "format": "date" } } ], "responses": { "200": { "description": "Paginated attendance records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedResponse" } } } }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "createAttendance", "tags": [ "Attendance" ], "summary": "Create an attendance record", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AttendanceRecord" } } } }, "responses": { "201": { "description": "Record created" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "409": { "description": "Duplicate for student/date" } } } }, "/api/v1/invoices": { "get": { "operationId": "listInvoices", "tags": [ "Invoices" ], "summary": "List invoices", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }, { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 20 } }, { "name": "parent_id", "in": "query", "schema": { "type": "integer" } }, { "name": "status", "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Paginated invoices", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedResponse" } } } }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "createInvoice", "tags": [ "Invoices" ], "summary": "Create an invoice", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Invoice" } } } }, "responses": { "201": { "description": "Invoice created" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/invoices/{id}": { "get": { "operationId": "getInvoice", "tags": [ "Invoices" ], "summary": "Show a single invoice", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Invoice details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Invoice" } } } }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } }, "patch": { "operationId": "updateInvoice", "tags": [ "Invoices" ], "summary": "Update invoice attributes", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Invoice" } } } }, "responses": { "200": { "description": "Invoice updated" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "delete": { "operationId": "deleteInvoice", "tags": [ "Invoices" ], "summary": "Delete an invoice", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Invoice deleted" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/register": { "post": { "operationId": "webRegister", "tags": [ "Web" ], "summary": "Submit the legacy parent registration form", "requestBody": { "required": true, "content": { "application/x-www-form-urlencoded": { "schema": { "$ref": "#/components/schemas/WebRegisterForm" } } } }, "responses": { "302": { "description": "Redirects to /register/success when registration completes." }, "422": { "description": "Validation issues cause a redirect back to the form with flash errors." } } } }, "/user/login": { "post": { "operationId": "webLogin", "tags": [ "Web" ], "summary": "Submit the legacy login form", "requestBody": { "required": true, "content": { "application/x-www-form-urlencoded": { "schema": { "$ref": "#/components/schemas/WebLoginForm" } } } }, "responses": { "302": { "description": "Redirects to the dashboard when authentication succeeds." }, "401": { "description": "Invalid credentials or suspended account results in a redirect back with flash information." } } } }, "/processForgotPassword": { "post": { "operationId": "webForgotPassword", "tags": [ "Web" ], "summary": "Request a password reset link via the legacy form", "requestBody": { "required": true, "content": { "application/x-www-form-urlencoded": { "schema": { "$ref": "#/components/schemas/WebForgotPasswordForm" } } } }, "responses": { "302": { "description": "Always redirects back to the form; success is indicated via flash data." } } } }, "/user/processResetPassword": { "post": { "operationId": "webResetPassword", "tags": [ "Web" ], "summary": "Submit a new password using the reset token from the email", "requestBody": { "required": true, "content": { "application/x-www-form-urlencoded": { "schema": { "$ref": "#/components/schemas/WebResetPasswordForm" } } } }, "responses": { "200": { "description": "Renders the 'password_set_success' view when the token is valid." }, "302": { "description": "Invalid token or validation errors redirect to the home page or form." } } } }, "/user/save_password": { "post": { "operationId": "webSetPassword", "tags": [ "Web" ], "summary": "Save the password after confirming the email address", "requestBody": { "required": true, "content": { "application/x-www-form-urlencoded": { "schema": { "$ref": "#/components/schemas/WebSetPasswordForm" } } } }, "responses": { "302": { "description": "Redirects to /user/password_set_success on success or back on failure." } } } }, "/api/v1/administrator/dashboard": { "get": { "operationId": "getAdministratorDashboard", "tags": [ "Administrator" ], "summary": "Returns counts for students, staff roles, and parents plus the four most recent login activities", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Dashboard data" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/administrator/absence": { "get": { "operationId": "getAdministratorAbsence", "tags": [ "Administrator" ], "summary": "Get absence form data", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Absence form data" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "submitAdministratorAbsence", "tags": [ "Administrator" ], "summary": "Submit absence request", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "dates", "reason" ], "properties": { "dates": { "type": "array", "items": { "type": "string", "format": "date" } }, "reason_type": { "type": "string" }, "reason": { "type": "string" } } } } } }, "responses": { "200": { "description": "Absence submitted" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/administrator/search": { "get": { "operationId": "searchAdministrator", "tags": [ "Administrator" ], "summary": "Search across users, students, parents, staff, and emergency contacts", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "q", "in": "query", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Search results" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/assignments": { "get": { "operationId": "listAssignments", "tags": [ "Assignments" ], "summary": "List assignments", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "class_id", "in": "query", "schema": { "type": "integer" } }, { "name": "teacher_id", "in": "query", "schema": { "type": "integer" } }, { "name": "student_id", "in": "query", "schema": { "type": "integer" } }, { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }, { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 20 } } ], "responses": { "200": { "description": "Paginated assignments" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "createAssignment", "tags": [ "Assignments" ], "summary": "Create an assignment", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "title", "due_date", "class_id", "teacher_id" ], "properties": { "title": { "type": "string" }, "due_date": { "type": "string", "format": "date" }, "class_id": { "type": "integer" }, "teacher_id": { "type": "integer" } } } } } }, "responses": { "201": { "description": "Assignment created" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/assignments/{id}": { "get": { "operationId": "getAssignment", "tags": [ "Assignments" ], "summary": "Get a single assignment", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Assignment details" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } }, "patch": { "operationId": "updateAssignment", "tags": [ "Assignments" ], "summary": "Update an assignment", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "title": { "type": "string" }, "due_date": { "type": "string", "format": "date" }, "class_id": { "type": "integer" }, "teacher_id": { "type": "integer" } } } } } }, "responses": { "200": { "description": "Assignment updated" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "delete": { "operationId": "deleteAssignment", "tags": [ "Assignments" ], "summary": "Delete an assignment", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Assignment deleted" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/attendance/{id}": { "get": { "operationId": "getAttendance", "tags": [ "Attendance" ], "summary": "Get a single attendance record", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Attendance record" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } }, "patch": { "operationId": "updateAttendance", "tags": [ "Attendance" ], "summary": "Update an attendance record", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "status": { "type": "string", "enum": [ "present", "absent", "late" ] }, "notes": { "type": "string" } } } } } }, "responses": { "200": { "description": "Attendance record updated" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "delete": { "operationId": "deleteAttendance", "tags": [ "Attendance" ], "summary": "Delete an attendance record", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Attendance record deleted" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/attendance/class/{class_section_id}": { "get": { "operationId": "getClassAttendance", "tags": [ "Attendance" ], "summary": "Get class roster with attendance status", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "class_section_id", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "date", "in": "query", "schema": { "type": "string", "format": "date" } } ], "responses": { "200": { "description": "Class roster with attendance" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/attendance/class/{class_section_id}/record": { "post": { "operationId": "recordClassAttendance", "tags": [ "Attendance" ], "summary": "Record attendance for multiple students in a class", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "class_section_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "date", "records" ], "properties": { "date": { "type": "string", "format": "date" }, "records": { "type": "array", "items": { "type": "object", "required": [ "student_id", "status" ], "properties": { "student_id": { "type": "integer" }, "status": { "type": "string", "enum": [ "present", "absent", "late" ] }, "reason": { "type": "string" } } } } } } } } }, "responses": { "200": { "description": "Attendance recorded" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/classes": { "get": { "operationId": "listClasses", "tags": [ "Classes" ], "summary": "List classes", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "grade", "in": "query", "schema": { "type": "string" } }, { "name": "teacher_id", "in": "query", "schema": { "type": "integer" } }, { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }, { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 20 } } ], "responses": { "200": { "description": "Paginated classes" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/classes/{id}": { "get": { "operationId": "getClass", "tags": [ "Classes" ], "summary": "Get a single class", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Class details" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/classes/{id}/students": { "get": { "operationId": "getClassStudents", "tags": [ "Classes" ], "summary": "Get students in a class", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "List of students" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/calendar": { "get": { "operationId": "listCalendarEvents", "tags": [ "Calendar" ], "summary": "List calendar events", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }, { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 20 } }, { "name": "month", "in": "query", "schema": { "type": "integer" } }, { "name": "year", "in": "query", "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Paginated calendar events" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "createCalendarEvent", "tags": [ "Calendar" ], "summary": "Create a calendar event", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "title", "start_date" ], "properties": { "title": { "type": "string" }, "start_date": { "type": "string", "format": "date" }, "description": { "type": "string" }, "end_date": { "type": "string", "format": "date" }, "location": { "type": "string" } } } } } }, "responses": { "201": { "description": "Event created" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/calendar/{id}": { "get": { "operationId": "getCalendarEvent", "tags": [ "Calendar" ], "summary": "Get a single calendar event", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Event details" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } }, "patch": { "operationId": "updateCalendarEvent", "tags": [ "Calendar" ], "summary": "Update a calendar event", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "title": { "type": "string" }, "start_date": { "type": "string", "format": "date" }, "description": { "type": "string" }, "end_date": { "type": "string", "format": "date" }, "location": { "type": "string" } } } } } }, "responses": { "200": { "description": "Event updated" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "delete": { "operationId": "deleteCalendarEvent", "tags": [ "Calendar" ], "summary": "Delete a calendar event", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Event deleted" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/contact": { "post": { "operationId": "submitContact", "tags": [ "Contact" ], "summary": "Submit contact form", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "name", "email", "subject", "message" ], "properties": { "name": { "type": "string" }, "email": { "type": "string", "format": "email" }, "subject": { "type": "string" }, "message": { "type": "string" } } } } } }, "responses": { "200": { "description": "Contact form submitted" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } }, "500": { "description": "Server error" } }, "security": [] } }, "/api/v1/payments": { "get": { "operationId": "listPayments", "tags": [ "Payments" ], "summary": "List payments with optional filters", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "parent_id", "in": "query", "schema": { "type": "integer" } }, { "name": "status", "in": "query", "schema": { "type": "string" } }, { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }, { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 20 } } ], "responses": { "200": { "description": "Paginated payments" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "createPayment", "tags": [ "Payments" ], "summary": "Create a new payment plan", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "parent_id", "total_amount", "payment_date" ], "properties": { "parent_id": { "type": "integer" }, "total_amount": { "type": "number" }, "payment_date": { "type": "string", "format": "date" }, "number_of_installments": { "type": "integer" }, "payment_type": { "type": "string" }, "semester": { "type": "string" }, "school_year": { "type": "string" } } } } } }, "responses": { "201": { "description": "Payment created" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/payments/{id}": { "get": { "operationId": "getPayment", "tags": [ "Payments" ], "summary": "Get a single payment", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Payment details" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } }, "patch": { "operationId": "updatePayment", "tags": [ "Payments" ], "summary": "Update payment fields", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "paid_amount": { "type": "number" }, "balance": { "type": "number" }, "status": { "type": "string" }, "payment_method": { "type": "string" }, "payment_date": { "type": "string", "format": "date" }, "check_number": { "type": "string" } } } } } }, "responses": { "200": { "description": "Payment updated" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "delete": { "operationId": "deletePayment", "tags": [ "Payments" ], "summary": "Delete a payment", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Payment deleted" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/payments/parent/{id}": { "get": { "operationId": "getPaymentsByParent", "tags": [ "Payments" ], "summary": "Get all payments for a specific parent", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Parent payments" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/payments/manual-pay-search": { "get": { "operationId": "searchManualPayment", "tags": [ "Payments" ], "summary": "Search for parent by email or phone and retrieve payment data", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "search_term", "in": "query", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Payment search results" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/payments/manual-pay-update": { "post": { "operationId": "updateManualPayment", "tags": [ "Payments" ], "summary": "Record a manual payment", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "invoice_id", "amount", "payment_method" ], "properties": { "invoice_id": { "type": "integer" }, "amount": { "type": "number" }, "payment_method": { "type": "string", "enum": [ "cash", "check", "card" ] }, "check_number": { "type": "string" }, "payment_date": { "type": "string", "format": "date" } } } } } }, "responses": { "200": { "description": "Payment recorded" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/users/with-roles": { "get": { "operationId": "listUsersWithRoles", "tags": [ "Users" ], "summary": "List users with their roles", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Users with roles" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/users/{id}": { "patch": { "operationId": "updateUser", "tags": [ "Users" ], "summary": "Update user account/profile", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "firstname": { "type": "string" }, "lastname": { "type": "string" }, "email": { "type": "string", "format": "email" }, "cellphone": { "type": "string" }, "address_street": { "type": "string" }, "city": { "type": "string" }, "state": { "type": "string" }, "zip": { "type": "string" } } } } } }, "responses": { "200": { "description": "User updated" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "delete": { "operationId": "deleteUser", "tags": [ "Users" ], "summary": "Delete a user", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "User deleted" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/users/select-role": { "post": { "operationId": "selectUserRole", "tags": [ "Users" ], "summary": "Select and update the logged-in user's role", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "role" ], "properties": { "role": { "type": "string" } } } } } }, "responses": { "200": { "description": "Role selected" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/user/profile": { "get": { "operationId": "getUserProfile", "tags": [ "Users" ], "summary": "Get the signed-in user's profile", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "User profile" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "patch": { "operationId": "updateUserProfile", "tags": [ "Users" ], "summary": "Update user profile", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "firstname": { "type": "string" }, "lastname": { "type": "string" }, "cellphone": { "type": "string" }, "address_street": { "type": "string" }, "apt": { "type": "string" }, "city": { "type": "string" }, "state": { "type": "string" }, "zip": { "type": "string" }, "gender": { "type": "string" }, "email": { "type": "string", "format": "email" }, "password": { "type": "string" }, "current_password": { "type": "string" } } } } } }, "responses": { "200": { "description": "Profile updated" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/teachers": { "get": { "operationId": "listTeachers", "tags": [ "Teachers" ], "summary": "List teachers and teacher assistants", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }, { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 20 } } ], "responses": { "200": { "description": "Paginated teachers" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/teachers/{id}": { "get": { "operationId": "getTeacher", "tags": [ "Teachers" ], "summary": "Get teacher details with class assignments", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Teacher details" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/teachers/{id}/classes": { "get": { "operationId": "getTeacherClasses", "tags": [ "Teachers" ], "summary": "Get class sections assigned to a teacher", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Teacher classes" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/teachers/class-view": { "get": { "operationId": "getTeacherClassView", "tags": [ "Teachers" ], "summary": "Get comprehensive class view data for logged-in teacher", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Class view data" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/teachers/absence-form": { "get": { "operationId": "getTeacherAbsenceForm", "tags": [ "Teachers" ], "summary": "Get absence form data for logged-in teacher", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Absence form data" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/teachers/absence": { "post": { "operationId": "submitTeacherAbsence", "tags": [ "Teachers" ], "summary": "Submit an absence/vacation request", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "dates", "reason" ], "properties": { "dates": { "type": "array", "items": { "type": "string", "format": "date" } }, "reason": { "type": "string" }, "reason_type": { "type": "string" } } } } } }, "responses": { "200": { "description": "Absence submitted" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/whatsapp": { "get": { "operationId": "getWhatsAppData", "tags": [ "WhatsApp" ], "summary": "Get initial data for WhatsApp management page", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "WhatsApp management data" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/whatsapp/links": { "get": { "operationId": "listWhatsAppLinks", "tags": [ "WhatsApp" ], "summary": "List WhatsApp invite links", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "WhatsApp links" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "saveWhatsAppLink", "tags": [ "WhatsApp" ], "summary": "Create or update invite link for a class section", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "class_section_id", "invite_link" ], "properties": { "class_section_id": { "type": "integer" }, "invite_link": { "type": "string" }, "active": { "type": "integer", "enum": [ 0, 1 ] }, "class_section_name": { "type": "string" } } } } } }, "responses": { "200": { "description": "Link saved" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/whatsapp/send-invites": { "post": { "operationId": "sendWhatsAppInvites", "tags": [ "WhatsApp" ], "summary": "Send WhatsApp invites in three modes", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "mode" ], "properties": { "mode": { "type": "string", "enum": [ "parents", "class", "all" ] }, "parent_ids": { "type": "array", "items": { "type": "integer" } }, "class_section_id": { "type": "integer" } } } } } }, "responses": { "200": { "description": "Invites sent" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/whatsapp/parent-contacts": { "get": { "operationId": "getWhatsAppParentContacts", "tags": [ "WhatsApp" ], "summary": "Get flat list of all parent contacts", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "school_year", "in": "query", "schema": { "type": "string" } }, { "name": "semester", "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Parent contacts" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/whatsapp/parent-contacts-by-class": { "get": { "operationId": "getWhatsAppParentContactsByClass", "tags": [ "WhatsApp" ], "summary": "Get parent contacts grouped by class section", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "school_year", "in": "query", "schema": { "type": "string" } }, { "name": "semester", "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Parent contacts by class" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/whatsapp/memberships": { "post": { "operationId": "updateWhatsAppMembership", "tags": [ "WhatsApp" ], "summary": "Update WhatsApp group membership flags", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "class_section_id" ], "properties": { "class_section_id": { "type": "integer" }, "primary_id": { "type": "integer" }, "second_id": { "type": "integer" }, "primary_member": { "type": [ "string", "integer" ] }, "second_member": { "type": [ "string", "integer" ] }, "school_year": { "type": "string" }, "semester": { "type": "string" } } } } } }, "responses": { "200": { "description": "Membership updated" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/health": { "get": { "operationId": "healthCheck", "tags": [ "Health" ], "summary": "Health check endpoint", "responses": { "200": { "description": "Health status" }, "503": { "description": "Service unavailable" } }, "security": [] } }, "/api/v1/landing": { "get": { "operationId": "getLandingPage", "tags": [ "Landing" ], "summary": "Get role-based dashboard data", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Landing page data" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/landing/data": { "get": { "operationId": "getLandingPageData", "tags": [ "Landing" ], "summary": "Get basic landing page bootstrap data", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Landing page data" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/staff": { "get": { "operationId": "listStaff", "tags": [ "Staff" ], "summary": "List staff members", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }, { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 20 } }, { "name": "role", "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Paginated staff" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "createStaff", "tags": [ "Staff" ], "summary": "Create a new staff member", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "firstname", "lastname", "email", "role_name" ], "properties": { "firstname": { "type": "string" }, "lastname": { "type": "string" }, "email": { "type": "string", "format": "email" }, "phone": { "type": "string" }, "role_name": { "type": "string" }, "school_year": { "type": "string" }, "status": { "type": "string" } } } } } }, "responses": { "201": { "description": "Staff created" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/staff/{id}": { "get": { "operationId": "getStaff", "tags": [ "Staff" ], "summary": "Get a single staff member", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Staff details" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } }, "patch": { "operationId": "updateStaff", "tags": [ "Staff" ], "summary": "Update a staff member", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "firstname": { "type": "string" }, "lastname": { "type": "string" }, "email": { "type": "string", "format": "email" }, "phone": { "type": "string" }, "role_name": { "type": "string" }, "school_year": { "type": "string" }, "status": { "type": "string" } } } } } }, "responses": { "200": { "description": "Staff updated" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "delete": { "operationId": "deleteStaff", "tags": [ "Staff" ], "summary": "Delete a staff member", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Staff deleted" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/suppliers": { "get": { "operationId": "listSuppliers", "tags": [ "Suppliers" ], "summary": "List suppliers", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }, { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 20 } }, { "name": "q", "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Paginated suppliers" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "createSupplier", "tags": [ "Suppliers" ], "summary": "Create a new supplier", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "name" ], "properties": { "name": { "type": "string" }, "email": { "type": "string", "format": "email" }, "phone": { "type": "string" }, "address": { "type": "string" }, "notes": { "type": "string" } } } } } }, "responses": { "201": { "description": "Supplier created" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/suppliers/{id}": { "get": { "operationId": "getSupplier", "tags": [ "Suppliers" ], "summary": "Get a single supplier", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Supplier details" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } }, "patch": { "operationId": "updateSupplier", "tags": [ "Suppliers" ], "summary": "Update a supplier", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string" }, "email": { "type": "string", "format": "email" }, "phone": { "type": "string" }, "address": { "type": "string" }, "notes": { "type": "string" } } } } } }, "responses": { "200": { "description": "Supplier updated" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "delete": { "operationId": "deleteSupplier", "tags": [ "Suppliers" ], "summary": "Delete a supplier", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Supplier deleted" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/communications": { "get": { "operationId": "listCommunications", "tags": [ "Communications" ], "summary": "List communications", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "sender_id", "in": "query", "schema": { "type": "integer" } }, { "name": "receiver_id", "in": "query", "schema": { "type": "integer" } }, { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }, { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 20 } } ], "responses": { "200": { "description": "Paginated communications" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "sendCommunication", "tags": [ "Communications" ], "summary": "Send a communication", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "sender_id", "receiver_id", "subject", "message" ], "properties": { "sender_id": { "type": "integer" }, "receiver_id": { "type": "integer" }, "subject": { "type": "string" }, "message": { "type": "string" } } } } } }, "responses": { "201": { "description": "Communication sent" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/communications/{id}": { "delete": { "operationId": "deleteCommunication", "tags": [ "Communications" ], "summary": "Delete a communication", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Communication deleted" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/configuration": { "get": { "operationId": "listConfiguration", "tags": [ "Configuration" ], "summary": "List configuration entries", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "key", "in": "query", "schema": { "type": "string" } }, { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }, { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 20 } } ], "responses": { "200": { "description": "Paginated configuration" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "createConfiguration", "tags": [ "Configuration" ], "summary": "Create a configuration entry", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "config_key", "config_value" ], "properties": { "config_key": { "type": "string" }, "config_value": { "type": "string" } } } } } }, "responses": { "201": { "description": "Configuration created" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/configuration/{id}": { "get": { "operationId": "getConfiguration", "tags": [ "Configuration" ], "summary": "Get a configuration entry", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Configuration details" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } }, "patch": { "operationId": "updateConfiguration", "tags": [ "Configuration" ], "summary": "Update a configuration entry", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "config_key": { "type": "string" }, "config_value": { "type": "string" } } } } } }, "responses": { "200": { "description": "Configuration updated" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "delete": { "operationId": "deleteConfiguration", "tags": [ "Configuration" ], "summary": "Delete a configuration entry", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Configuration deleted" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/configuration/key/{config_key}": { "get": { "operationId": "getConfigurationByKey", "tags": [ "Configuration" ], "summary": "Get configuration by key", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "config_key", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Configuration value" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/discounts": { "get": { "operationId": "listDiscounts", "tags": [ "Discounts" ], "summary": "List discount vouchers", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "active", "in": "query", "schema": { "type": "boolean" } } ], "responses": { "200": { "description": "List of discounts" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/discounts/{code}": { "get": { "operationId": "getDiscountByCode", "tags": [ "Discounts" ], "summary": "Get discount by code", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "code", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Discount details" }, "400": { "description": "Max usage reached" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found or inactive" } } } }, "/api/v1/discounts/apply": { "post": { "operationId": "applyDiscount", "tags": [ "Discounts" ], "summary": "Apply a discount code to an invoice", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "code", "invoice_id" ], "properties": { "code": { "type": "string" }, "invoice_id": { "type": "integer" } } } } } }, "responses": { "200": { "description": "Discount applied" }, "400": { "description": "Invalid discount or already applied" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "500": { "description": "Server error" } } } }, "/api/v1/emergency-contacts": { "get": { "operationId": "listEmergencyContacts", "tags": [ "Emergency Contacts" ], "summary": "List emergency contacts", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "parent_id", "in": "query", "schema": { "type": "integer" } }, { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }, { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 20 } } ], "responses": { "200": { "description": "Paginated emergency contacts" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "createEmergencyContact", "tags": [ "Emergency Contacts" ], "summary": "Create an emergency contact", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "parent_id", "emergency_contact_name", "cellphone", "relation" ], "properties": { "parent_id": { "type": "integer" }, "emergency_contact_name": { "type": "string" }, "cellphone": { "type": "string" }, "relation": { "type": "string" }, "email": { "type": "string", "format": "email" } } } } } }, "responses": { "201": { "description": "Emergency contact created" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/emergency-contacts/{id}": { "get": { "operationId": "getEmergencyContact", "tags": [ "Emergency Contacts" ], "summary": "Get a single emergency contact", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Emergency contact details" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } }, "patch": { "operationId": "updateEmergencyContact", "tags": [ "Emergency Contacts" ], "summary": "Update an emergency contact", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "emergency_contact_name": { "type": "string" }, "cellphone": { "type": "string" }, "email": { "type": "string", "format": "email" }, "relation": { "type": "string" } } } } } }, "responses": { "200": { "description": "Emergency contact updated" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "delete": { "operationId": "deleteEmergencyContact", "tags": [ "Emergency Contacts" ], "summary": "Delete an emergency contact", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Emergency contact deleted" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/events": { "get": { "operationId": "listEvents", "tags": [ "Events" ], "summary": "List events", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "school_year", "in": "query", "schema": { "type": "string" } }, { "name": "upcoming", "in": "query", "schema": { "type": "boolean" } } ], "responses": { "200": { "description": "List of events" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "createEvent", "tags": [ "Events" ], "summary": "Create a new event", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "event_name", "amount", "expiration_date" ], "properties": { "event_name": { "type": "string" }, "amount": { "type": "number" }, "expiration_date": { "type": "string", "format": "date" }, "description": { "type": "string" }, "semester": { "type": "string" }, "school_year": { "type": "string" } } } } } }, "responses": { "201": { "description": "Event created" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/events/{id}": { "get": { "operationId": "getEvent", "tags": [ "Events" ], "summary": "Get a single event", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Event details" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } }, "patch": { "operationId": "updateEvent", "tags": [ "Events" ], "summary": "Update an event", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "event_name": { "type": "string" }, "description": { "type": "string" }, "amount": { "type": "number" }, "expiration_date": { "type": "string", "format": "date" }, "semester": { "type": "string" }, "school_year": { "type": "string" } } } } } }, "responses": { "200": { "description": "Event updated" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "delete": { "operationId": "deleteEvent", "tags": [ "Events" ], "summary": "Delete an event", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Event deleted" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/expenses": { "get": { "operationId": "listExpenses", "tags": [ "Expenses" ], "summary": "List expenses", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "status", "in": "query", "schema": { "type": "string" } }, { "name": "category", "in": "query", "schema": { "type": "string" } }, { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }, { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 20 } } ], "responses": { "200": { "description": "Paginated expenses" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "createExpense", "tags": [ "Expenses" ], "summary": "Create an expense", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "category", "amount", "description", "date_of_purchase" ], "properties": { "category": { "type": "string" }, "amount": { "type": "number" }, "description": { "type": "string" }, "date_of_purchase": { "type": "string", "format": "date" } } } } } }, "responses": { "201": { "description": "Expense created" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/expenses/{id}": { "get": { "operationId": "getExpense", "tags": [ "Expenses" ], "summary": "Get a single expense", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Expense details" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } }, "patch": { "operationId": "updateExpense", "tags": [ "Expenses" ], "summary": "Update an expense", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "category": { "type": "string" }, "amount": { "type": "number" }, "description": { "type": "string" }, "date_of_purchase": { "type": "string", "format": "date" }, "status": { "type": "string" }, "status_reason": { "type": "string" } } } } } }, "responses": { "200": { "description": "Expense updated" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "delete": { "operationId": "deleteExpense", "tags": [ "Expenses" ], "summary": "Delete an expense", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Expense deleted" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/extra-charges": { "get": { "operationId": "listExtraCharges", "tags": [ "Extra Charges" ], "summary": "List extra charges", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "school_year", "in": "query", "schema": { "type": "string" } }, { "name": "semester", "in": "query", "schema": { "type": "string" } }, { "name": "status", "in": "query", "schema": { "type": "string" } }, { "name": "q", "in": "query", "schema": { "type": "string" } }, { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }, { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 20 } } ], "responses": { "200": { "description": "Paginated extra charges" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "createExtraCharge", "tags": [ "Extra Charges" ], "summary": "Create an extra charge", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "parent_id", "title", "amount", "charge_type" ], "properties": { "parent_id": { "type": "integer" }, "title": { "type": "string" }, "amount": { "type": "number" }, "charge_type": { "type": "string", "enum": [ "add", "deduct" ] }, "due_date": { "type": "string", "format": "date" }, "invoice_id": { "type": "integer" }, "description": { "type": "string" }, "school_year": { "type": "string" }, "semester": { "type": "string" } } } } } }, "responses": { "201": { "description": "Extra charge created" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/extra-charges/{id}": { "get": { "operationId": "getExtraCharge", "tags": [ "Extra Charges" ], "summary": "Get a single extra charge", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Extra charge details" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } }, "patch": { "operationId": "updateExtraCharge", "tags": [ "Extra Charges" ], "summary": "Update an extra charge", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "title": { "type": "string" }, "description": { "type": "string" }, "amount": { "type": "number" }, "due_date": { "type": "string", "format": "date" }, "charge_type": { "type": "string", "enum": [ "add", "deduct" ] } } } } } }, "responses": { "200": { "description": "Extra charge updated" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "delete": { "operationId": "deleteExtraCharge", "tags": [ "Extra Charges" ], "summary": "Delete an extra charge", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Extra charge deleted" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/messages": { "get": { "operationId": "listMessages", "tags": [ "Messages" ], "summary": "List messages", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "type", "in": "query", "schema": { "type": "string", "enum": [ "sent", "inbox" ] } }, { "name": "read", "in": "query", "schema": { "type": "boolean" } } ], "responses": { "200": { "description": "Messages" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "sendMessage", "tags": [ "Messages" ], "summary": "Send a message", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "subject", "message" ], "properties": { "recipient_id": { "type": "integer" }, "recipient_role": { "type": "string" }, "subject": { "type": "string" }, "message": { "type": "string" }, "priority": { "type": "string", "enum": [ "normal", "high", "low" ] }, "status": { "type": "string", "enum": [ "sent", "draft" ] } } } } } }, "responses": { "201": { "description": "Message sent" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/messages/{id}": { "get": { "operationId": "getMessage", "tags": [ "Messages" ], "summary": "Get a single message", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Message details" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/messages/inbox": { "get": { "operationId": "getInboxMessages", "tags": [ "Messages" ], "summary": "Get inbox messages", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Inbox messages" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/messages/sent": { "get": { "operationId": "getSentMessages", "tags": [ "Messages" ], "summary": "Get sent messages", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Sent messages" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/notifications": { "get": { "operationId": "listNotifications", "tags": [ "Notifications" ], "summary": "List notifications", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "read", "in": "query", "schema": { "type": "boolean" } }, { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }, { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 20 } } ], "responses": { "200": { "description": "Paginated notifications" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/notifications/{id}": { "get": { "operationId": "getNotification", "tags": [ "Notifications" ], "summary": "Get a single notification", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Notification details" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/notifications/{id}/read": { "post": { "operationId": "markNotificationRead", "tags": [ "Notifications" ], "summary": "Mark a notification as read", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Notification marked as read" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/settings": { "get": { "operationId": "getSettings", "tags": [ "Settings" ], "summary": "Get grouped configuration values", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Settings" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "patch": { "operationId": "updateSettings", "tags": [ "Settings" ], "summary": "Update settings", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "school_id": { "type": "string" }, "school_year": { "type": "string" }, "firstname": { "type": "string" }, "lastname": { "type": "string" }, "dob": { "type": "string", "format": "date" }, "age": { "type": "integer" }, "gender": { "type": "string" }, "is_active": { "type": "boolean" }, "registration_grade": { "type": "string" }, "is_new": { "type": "boolean" }, "photo_consent": { "type": "boolean" }, "parent_id": { "type": "integer" }, "registration_date": { "type": "string", "format": "date" }, "tuition_paid": { "type": "boolean" }, "semester": { "type": "string" }, "year_of_registration": { "type": "integer" } } } } } }, "responses": { "200": { "description": "Settings updated" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/scores/homework": { "get": { "operationId": "getHomeworkScores", "tags": [ "Scores" ], "summary": "HomeworkController::index", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "class_section_id", "in": "query", "required": true, "schema": { "type": "integer", "minimum": 1 } }, { "name": "semester", "in": "query", "schema": { "type": "string" } }, { "name": "school_year", "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/scores/comments": { "get": { "operationId": "getScoreComments", "tags": [ "Scores" ], "summary": "ScoreCommentController::index", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "class_section_id", "in": "query", "required": true, "schema": { "type": "integer", "minimum": 1 } }, { "name": "semester", "in": "query", "schema": { "type": "string" } }, { "name": "school_year", "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/scores/projects": { "get": { "operationId": "getProjectScores", "tags": [ "Scores" ], "summary": "ProjectController::index", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "class_section_id", "in": "query", "required": true, "schema": { "type": "integer", "minimum": 1 } }, { "name": "semester", "in": "query", "schema": { "type": "string" } }, { "name": "school_year", "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/scores/quizzes": { "get": { "operationId": "getQuizScores", "tags": [ "Scores" ], "summary": "QuizController::index", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "class_section_id", "in": "query", "required": true, "schema": { "type": "integer", "minimum": 1 } }, { "name": "semester", "in": "query", "schema": { "type": "string" } }, { "name": "school_year", "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/scores/midterm": { "get": { "operationId": "getMidtermScores", "tags": [ "Scores" ], "summary": "MidtermController::index", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "class_section_id", "in": "query", "required": true, "schema": { "type": "integer", "minimum": 1 } }, { "name": "semester", "in": "query", "schema": { "type": "string" } }, { "name": "school_year", "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/scores/final": { "get": { "operationId": "getFinalScores", "tags": [ "Scores" ], "summary": "FinalController::index", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "class_section_id", "in": "query", "required": true, "schema": { "type": "integer", "minimum": 1 } }, { "name": "semester", "in": "query", "schema": { "type": "string" } }, { "name": "school_year", "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/scores/participation": { "get": { "operationId": "getParticipationScores", "tags": [ "Scores" ], "summary": "ParticipationController::index", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "class_section_id", "in": "query", "required": true, "schema": { "type": "integer", "minimum": 1 } }, { "name": "semester", "in": "query", "schema": { "type": "string" } }, { "name": "school_year", "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/scores/projects/by-year": { "get": { "operationId": "getProjectScoresByYear", "tags": [ "Scores" ], "summary": "ProjectController::bySchoolYear", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "school_year", "in": "query", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/scores/quizzes/by-year": { "get": { "operationId": "getQuizScoresByYear", "tags": [ "Scores" ], "summary": "QuizController::bySchoolYear", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "school_year", "in": "query", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/scores/homework/by-year": { "get": { "operationId": "getHomeworkScoresByYear", "tags": [ "Scores" ], "summary": "HomeworkController::bySchoolYear", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "school_year", "in": "query", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/scores/midterm/by-year": { "get": { "operationId": "getMidtermScoresByYear", "tags": [ "Scores" ], "summary": "MidtermController::bySchoolYear", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "school_year", "in": "query", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/scores/final/by-year": { "get": { "operationId": "getFinalScoresByYear", "tags": [ "Scores" ], "summary": "FinalController::bySchoolYear", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "school_year", "in": "query", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/scores/participation/by-year": { "get": { "operationId": "getParticipationScoresByYear", "tags": [ "Scores" ], "summary": "ParticipationController::bySchoolYear", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "school_year", "in": "query", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } } }, "/api/v1/students/{studentId}": { "get": { "operationId": "getStudent", "tags": [ "Students" ], "summary": "StudentController::show", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } }, "patch": { "operationId": "updateStudent", "tags": [ "Students" ], "summary": "StudentController::update", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true } } } }, "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } } } }, "delete": { "operationId": "deactivateStudent", "tags": [ "Students" ], "summary": "StudentController::destroy", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/students/{studentId}/classes": { "get": { "operationId": "getStudentClasses", "tags": [ "Students" ], "summary": "StudentController::classes", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "school_year", "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "assignStudentClasses", "tags": [ "Students" ], "summary": "StudentController::assignClassForStudent", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "student_id", "class_section_id" ], "properties": { "student_id": { "type": "integer" }, "class_section_id": { "type": "integer" }, "class_section_ids": { "type": "array", "items": { "type": "integer" } }, "is_event_only": { "type": "boolean" } } } } } }, "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error" } } } }, "/api/v1/students/{studentId}/classes/{classSectionId}": { "delete": { "operationId": "removeStudentClass", "tags": [ "Students" ], "summary": "StudentController::removeClassForStudent", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "classSectionId", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error" } } } }, "/api/v1/students/{studentId}/promote": { "post": { "operationId": "promoteStudent", "tags": [ "Students" ], "summary": "StudentController::promote", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "name", "cellphone" ], "properties": { "name": { "type": "string" }, "cellphone": { "type": "string" }, "email": { "type": "string", "format": "email" }, "relation": { "type": "string" }, "semester": { "type": "string" }, "school_year": { "type": "string" } } } } } }, "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error" } } } }, "/api/v1/students/{studentId}/attendance": { "get": { "operationId": "getStudentAttendance", "tags": [ "Students" ], "summary": "StudentController::attendance", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "school_year", "in": "query", "schema": { "type": "string" } }, { "name": "semester", "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/students/{studentId}/incidents": { "get": { "operationId": "getStudentIncidents", "tags": [ "Students" ], "summary": "StudentController::incidents", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "school_year", "in": "query", "schema": { "type": "string" } }, { "name": "semester", "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/students/{studentId}/scores": { "get": { "operationId": "getStudentScores", "tags": [ "Students" ], "summary": "StudentController::scores", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "school_year", "in": "query", "schema": { "type": "string" } }, { "name": "semester", "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/students/{studentId}/notes": { "get": { "operationId": "getStudentNotes", "tags": [ "Students" ], "summary": "StudentController::notes", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/students/{studentId}/parents": { "get": { "operationId": "getStudentParents", "tags": [ "Students" ], "summary": "StudentController::parents", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } } }, "/api/v1/students/{studentId}/emergency-contacts": { "get": { "operationId": "getStudentEmergencyContacts", "tags": [ "Students" ], "summary": "StudentController::emergencyContacts", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } }, "post": { "operationId": "addStudentEmergencyContact", "tags": [ "Students" ], "summary": "StudentController::addEmergencyContact", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true } } } }, "responses": { "201": { "description": "Created" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error" } } } }, "/api/v1/students/{studentId}/emergency-contacts/{contactId}": { "patch": { "operationId": "updateStudentEmergencyContact", "tags": [ "Students" ], "summary": "StudentController::updateEmergencyContact", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "contactId", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true } } } }, "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error" } } } }, "/api/v1/students/{studentId}/badge_scan": { "post": { "operationId": "updateStudentBadgeScan", "tags": [ "Students" ], "summary": "StudentController::updateBadgeScan", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true } } } }, "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error" } } } }, "/api/v1/students/{studentId}/photo": { "get": { "operationId": "getStudentPhoto", "tags": [ "Students" ], "summary": "StudentController::photo", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "404": { "description": "Not found" } } }, "post": { "operationId": "uploadStudentPhoto", "tags": [ "Students" ], "summary": "StudentController::uploadPhoto", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "multipart/form-data": { "schema": { "type": "object", "properties": { "photo": { "type": "string", "format": "binary" } } } } } }, "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error" } } } }, "/api/v1/students/{studentId}/report-card": { "get": { "operationId": "getStudentReportCard", "tags": [ "Students" ], "summary": "ReportCardsController::studentReport", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error" } } } }, "/api/v1/students/{studentId}/score-card": { "get": { "operationId": "getStudentScoreCard", "tags": [ "Students" ], "summary": "StudentController::scoreCard", "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "studentId", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" } } } }, "/api/v1/students/assign-class": { "post": { "operationId": "assignClass", "tags": [ "Students" ], "summary": "StudentController::assignClass", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "student_id", "class_section_id" ], "properties": { "student_id": { "type": "integer" }, "class_section_id": { "type": "array", "items": { "type": "integer" } }, "is_event_only": { "type": "boolean" } } } } } }, "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error" } } } }, "/api/v1/students/remove-class": { "post": { "operationId": "removeClass", "tags": [ "Students" ], "summary": "StudentController::removeClass", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "student_id", "class_section_id" ], "properties": { "student_id": { "type": "integer" }, "class_section_id": { "type": "integer" } } } } } }, "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error" } } } }, "/api/v1/students/set-active": { "post": { "operationId": "setActive", "tags": [ "Students" ], "summary": "StudentController::setActive", "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "student_id", "is_active" ], "properties": { "student_id": { "type": "integer" }, "is_active": { "type": "boolean" } } } } } }, "responses": { "200": { "description": "OK" }, "401": { "$ref": "#/components/responses/UnauthorizedError" }, "422": { "description": "Validation error" } } } }, "/api/v1/time": { "get": { "operationId": "getServerTime", "tags": [ "Time" ], "summary": "Get server timestamp and timezone", "responses": { "200": { "description": "Server time information" } }, "security": [] } } } }