Files
alrahma_sunday_school/public/docs/openapi_parent_controller.yaml
2026-02-10 22:11:06 -05:00

840 lines
23 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
openapi: 3.0.3
info:
title: Parent API - Al Rahma Sunday School
version: 1.1.0
description: >
REST API for parent-related functionality in the Al Rahma Sunday School system.
All endpoints require JWT authentication using a Bearer token, unless otherwise noted.
Each response follows the standard format:
```json
{
"status": "success|error",
"message": "string",
"data": {}
}
```
servers:
- url: https://alrahmaisgl.org/api/v1
security:
- BearerAuth: []
tags:
- name: Parents
description: Manage parent profiles and accounts
- name: Students
description: Access and manage parents student data
- name: Attendance
description: View attendance history for a parent's children
- name: Enrollment
description: Manage enrollments and student registration
- name: Payments
description: Retrieve invoices and payment details
- name: Events
description: Manage student participation in school events
paths:
/parents:
get:
tags: [Parents]
summary: List all parents (admin use)
security:
- BearerAuth: []
parameters:
- name: page
in: query
schema: { type: integer, example: 1 }
- name: per_page
in: query
schema: { type: integer, example: 20 }
responses:
200:
description: Paginated list of parents
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedParentsResponse'
401:
description: Unauthorized
/parents/{id}:
get:
tags: [Parents]
summary: Get parent details by ID
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
responses:
200:
description: Parent details
content:
application/json:
schema:
$ref: '#/components/schemas/Parent'
404:
description: Parent not found
401:
description: Unauthorized
/parents/{id}/profile:
get:
tags: [Parents]
summary: Get parent profile
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
responses:
200:
description: Parent profile details
content:
application/json:
schema:
$ref: '#/components/schemas/Parent'
put:
tags: [Parents]
summary: Update parent profile
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ParentUpdateRequest'
responses:
200:
description: Profile updated successfully
content:
application/json:
schema:
$ref: '#/components/schemas/BasicSuccess'
/parents/{id}/students:
get:
tags: [Students]
summary: Get all students for a parent
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
responses:
200:
description: Student list with details
content:
application/json:
schema:
$ref: '#/components/schemas/StudentsResponse'
post:
tags: [Students]
summary: Register a new student for this parent
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateStudentRequest'
responses:
200:
description: Student created
content:
application/json:
schema:
$ref: '#/components/schemas/BasicSuccess'
/parents/{id}/students/{studentId}:
put:
tags: [Students]
summary: Update a student's info
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
- name: studentId
in: path
required: true
schema: { type: integer }
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateStudentRequest'
responses:
200:
description: Student updated
content:
application/json:
schema:
$ref: '#/components/schemas/BasicSuccess'
delete:
tags: [Students]
summary: Delete a student
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
- name: studentId
in: path
required: true
schema: { type: integer }
responses:
200:
description: Student deleted
content:
application/json:
schema:
$ref: '#/components/schemas/BasicSuccess'
/parents/{id}/attendance:
get:
tags: [Attendance]
summary: Get student attendance records
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
- name: school_year
in: query
schema: { type: string, example: "2024-2025" }
responses:
200:
description: Attendance records retrieved
content:
application/json:
schema:
$ref: '#/components/schemas/AttendanceList'
examples:
sample:
value:
status: success
message: Attendance data retrieved successfully
data:
- firstname: Ali
lastname: Ahmad
date: "2024-10-06"
status: present
reason: null
- firstname: Aisha
lastname: Ahmad
date: "2024-10-13"
status: absent
reason: Sick
/parents/{id}/payments:
get:
tags: [Payments]
summary: Retrieve invoices/payments for parent
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
responses:
200:
description: Payment history
content:
application/json:
schema:
$ref: '#/components/schemas/InvoiceList'
examples:
sample:
value:
status: success
message: Payments retrieved successfully
data:
- id: 101
invoice_number: INV-2025-0001
parent_id: 55
amount: 550
status: unpaid
created_at: "2025-08-20 12:00:00"
/parents/{id}/enrollments:
get:
tags: [Enrollment]
summary: Get enrollment data for parents students
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
- name: school_year
in: query
schema: { type: string, example: "2024-2025" }
responses:
200:
description: Enrollment info
content:
application/json:
schema:
$ref: '#/components/schemas/EnrollmentResponse'
/parents/{id}/enroll-classes:
get:
tags: [Enrollment]
summary: Get data for the enroll classes page
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
- name: school_year
in: query
schema: { type: string, example: "2024-2025" }
responses:
200:
description: Enroll classes data
content:
application/json:
schema:
$ref: '#/components/schemas/ParentEnrollClassesData'
post:
tags: [Enrollment]
summary: Update enrollments (enroll/withdraw)
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateParentEnrollmentsRequest'
responses:
200:
description: Enrollment updates processed
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateParentEnrollmentsResponse'
/parents/{id}/emergency-contacts:
get:
tags: [Parents]
summary: List emergency contacts for parent
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
responses:
200:
description: Emergency contacts
content:
application/json:
schema:
$ref: '#/components/schemas/EmergencyContactsList'
post:
tags: [Parents]
summary: Create or update an emergency contact
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SaveEmergencyContactRequest'
responses:
200:
description: Saved
content:
application/json:
schema:
$ref: '#/components/schemas/BasicSuccess'
/parents/{id}/authorized-users:
get:
tags: [Parents]
summary: List authorized users (second parents/guardians)
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
responses:
200:
description: Authorized users
content:
application/json:
schema:
$ref: '#/components/schemas/AuthorizedUsersList'
post:
tags: [Parents]
summary: Add an authorized user (pending)
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AddAuthorizedUserRequest'
responses:
200:
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/BasicSuccess'
/parents/{id}/enroll:
post:
tags: [Enrollment]
summary: Enroll one or more students
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
student_ids:
type: array
items: { type: integer }
example: [5, 6]
responses:
200:
description: Enrollment submitted successfully
content:
application/json:
schema:
$ref: '#/components/schemas/BasicSuccess'
/parents/{id}/events:
get:
tags: [Events]
summary: Get events and participation data
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
responses:
200:
description: Events and participation data
content:
application/json:
schema:
$ref: '#/components/schemas/EventParticipationResponse'
examples:
sample:
value:
status: success
message: Event participation data retrieved
data:
events:
- id: 1
name: Field Trip
amount: 25
start_date: "2025-10-20"
end_date: "2025-10-20"
charges:
"12:1":
student_id: 12
event_id: 1
participation: yes
charged: 25
date: "2025-09-30 10:00:00"
/parents/{id}/events/update:
post:
tags: [Events]
summary: Update student event participation
security:
- BearerAuth: []
parameters:
- name: id
in: path
required: true
schema: { type: integer }
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
participation:
type: object
example:
"3:1": "yes"
"3:2": "no"
responses:
200:
description: Participation updated successfully
content:
application/json:
schema:
$ref: '#/components/schemas/BasicSuccess'
components:
securitySchemes:
BearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
description: >
Enter your JSON Web Token here.
Example:
```
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6...
```
schemas:
BasicSuccess:
type: object
properties:
status: { type: string, example: "success" }
message: { type: string, example: "Operation completed successfully" }
data: { nullable: true }
Parent:
type: object
properties:
id: { type: integer }
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 }
ParentUpdateRequest:
type: object
properties:
firstname: { type: string }
lastname: { type: string }
cellphone: { type: string }
address_street: { type: string }
city: { type: string }
state: { type: string }
zip: { type: string }
PaginatedParentsResponse:
type: object
properties:
status: { type: string, example: "success" }
message: { type: string }
data:
type: object
properties:
page: { type: integer }
per_page: { type: integer }
total: { type: integer }
data:
type: array
items:
$ref: '#/components/schemas/Parent'
StudentsResponse:
type: object
properties:
status: { type: string }
message: { type: string }
data:
type: array
items:
type: object
properties:
id: { type: integer }
firstname: { type: string }
lastname: { type: string }
gender: { type: string }
dob: { type: string }
current_class:
type: object
properties:
class_name: { type: string }
section_name: { type: string }
medical_conditions:
type: array
items: { type: string }
allergies:
type: array
items: { type: string }
AttendanceList:
type: object
properties:
status: { type: string }
message: { type: string }
data:
type: array
items:
type: object
properties:
firstname: { type: string }
lastname: { type: string }
date: { type: string, format: date }
status: { type: string, enum: [present, absent, late] }
reason: { type: string, nullable: true }
InvoiceList:
type: object
properties:
status: { type: string }
message: { type: string }
data:
type: array
items:
type: object
properties:
id: { type: integer }
invoice_number: { type: string }
parent_id: { type: integer }
amount: { type: number }
status: { type: string }
created_at: { type: string }
EnrollmentResponse:
type: object
properties:
status: { type: string }
message: { type: string }
data:
type: array
items:
type: object
properties:
id: { type: integer }
firstname: { type: string }
lastname: { type: string }
enrollment:
type: object
properties:
enrollment_status: { type: string }
admission_status: { type: string, nullable: true }
EventParticipationResponse:
type: object
properties:
status: { type: string }
message: { type: string }
data:
type: object
properties:
events:
type: array
items:
type: object
properties:
id: { type: integer }
name: { type: string }
amount: { type: number }
start_date: { type: string }
end_date: { type: string }
charges:
type: object
additionalProperties:
type: object
properties:
student_id: { type: integer }
event_id: { type: integer }
participation: { type: string, enum: [yes, no] }
charged: { type: number }
date: { type: string, format: date-time }
CreateStudentRequest:
type: object
properties:
firstname: { type: string }
lastname: { type: string }
dob: { type: string, format: date }
age: { type: integer }
gender: { type: string }
registration_grade: { type: string }
photo_consent: { type: integer, enum: [0,1] }
rfid_tag: { type: string }
is_new: { type: integer, enum: [0,1], default: 1 }
UpdateStudentRequest:
allOf:
- $ref: '#/components/schemas/CreateStudentRequest'
EmergencyContactsList:
type: object
properties:
status: { type: string }
message: { type: string }
data:
type: array
items:
type: object
properties:
id: { type: integer }
parent_id: { type: integer }
emergency_contact_name: { type: string }
cellphone: { type: string }
email: { type: string }
relation: { type: string }
SaveEmergencyContactRequest:
type: object
properties:
id: { type: integer, nullable: true }
emergency_contact_name: { type: string }
cellphone: { type: string }
email: { type: string, nullable: true }
relation: { type: string, nullable: true }
AuthorizedUsersList:
type: object
properties:
status: { type: string }
message: { type: string }
data:
type: array
items:
type: object
properties:
id: { type: integer }
user_id: { type: integer }
firstname: { type: string }
lastname: { type: string }
email: { type: string }
phone_number: { type: string }
relation_to_user: { type: string }
status: { type: string }
AddAuthorizedUserRequest:
type: object
required: [firstname, lastname, email, phone_number]
properties:
firstname: { type: string }
lastname: { type: string }
email: { type: string }
phone_number: { type: string }
relation_to_user: { type: string }
ParentEnrollClassesData:
type: object
properties:
status: { type: string }
message: { type: string }
data:
type: object
properties:
students:
type: array
items:
type: object
properties:
id: { type: integer }
firstname: { type: string }
lastname: { type: string }
class_section: { type: string }
admission_status: { type: string, nullable: true }
enrollment_status: { type: string }
disable_enroll: { type: boolean }
schoolYears:
type: array
items:
type: object
properties:
school_year: { type: string }
selectedYear: { type: string }
isEditable: { type: boolean }
withdrawalDeadline: { type: string, format: date }
lastDayOfRegistration: { type: string, format: date }
schoolStartDate: { type: string, format: date }
UpdateParentEnrollmentsRequest:
type: object
properties:
enroll:
type: array
items: { type: integer }
example: [101, 102]
withdraw:
type: array
items: { type: integer }
example: [103]
UpdateParentEnrollmentsResponse:
type: object
properties:
status: { type: string }
message: { type: string }
data:
type: object
properties:
enrolled:
type: array
items: { type: integer }
withdrawn:
type: array
items: { type: integer }
messages:
type: array
items: { type: string }