openapi: 3.0.3 info: { title: Attendance API, version: 1.0.0 } servers: [ { url: https://your-domain.com/api/v1 } ] tags: [ { name: Attendance } ] security: [ { bearerAuth: [] } ] paths: /attendance: get: tags: [Attendance] summary: List attendance records parameters: - in: query name: page schema: { type: integer, default: 1 } - in: query name: per_page schema: { type: integer, default: 20 } - in: query name: student_id schema: { type: integer } - in: query name: date schema: { type: string, format: date } responses: "200": { description: Attendance records retrieved successfully } post: tags: [Attendance] summary: Create new attendance record requestBody: required: true content: application/json: schema: { $ref: '#/components/schemas/AttendanceCreate' } responses: "201": { description: Record created } "409": { description: Duplicate record } "422": { description: Validation error } /attendance/{id}: get: tags: [Attendance] summary: Get attendance by ID parameters: - in: path name: id required: true schema: { type: integer } responses: "200": { description: Record retrieved } "404": { description: Not found } put: tags: [Attendance] summary: Update attendance record parameters: - in: path name: id required: true schema: { type: integer } requestBody: required: true content: application/json: schema: { $ref: '#/components/schemas/AttendanceUpdate' } responses: "200": { description: Record updated } "422": { description: Validation error } "404": { description: Not found } delete: tags: [Attendance] summary: Delete attendance record parameters: - in: path name: id required: true schema: { type: integer } responses: "200": { description: Record deleted } "404": { description: Not found } /attendance/student/{id}: get: tags: [Attendance] summary: Get all attendance records for a student parameters: - in: path name: id required: true schema: { type: integer } responses: "200": { description: Student attendance list } /attendance/class/{class_section_id}: get: tags: [Attendance] summary: Get class roster attendance for a date parameters: - in: path name: class_section_id required: true schema: { type: integer } - in: query name: date schema: { type: string, format: date } responses: "200": description: Roster with attendance status content: application/json: schema: type: object properties: status: { type: string } message: { type: string } data: type: object properties: class_section_id: { type: integer } date: { type: string, format: date } students: type: array items: type: object properties: student_id: { type: integer } firstname: { type: string } lastname: { type: string } status: { type: string, nullable: true, enum: [present, absent, late] } reason: { type: string, nullable: true } /attendance/class/{class_section_id}/record: post: tags: [Attendance] summary: Record class attendance for a date parameters: - in: path name: class_section_id 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, nullable: true } responses: "200": { description: Attendance rows saved } components: schemas: AttendanceCreate: type: object required: [student_id, date, status] properties: student_id: { type: integer } date: { type: string, format: date } status: { type: string, enum: [present, absent, late] } notes: { type: string } AttendanceUpdate: type: object properties: status: { type: string, enum: [present, absent, late] } notes: { type: string }