Files
alrahma_sunday_school_api/resources/docs/openapi.json
T
2026-06-08 22:06:30 -04:00

8916 lines
215 KiB
JSON

{
"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": []
}
}
}
}