This document describes the RegMan HTTP API surface as implemented in the ASP.NET Core controllers.
Canonical local setup instructions live in the docs entry point:
Configured by environment.
- Local: e.g.
http://localhost:5236
Most endpoints require JWT.
- Header:
Authorization: Bearer <accessToken> - Roles are enforced via
[Authorize(Roles = ...)].
Most endpoints return an ApiResponse<T> envelope. The following JSON is the response example used throughout this document (unless an endpoint explicitly returns something else):
{
"success": true,
"statusCode": 200,
"message": "Success",
"data": {},
"errors": null
}Error example:
{
"success": false,
"statusCode": 400,
"message": "Validation failed",
"data": null,
"errors": {
"field": ["error message"]
}
}When running locally, Swagger UI is available at:
GET /swagger
- Auth: No
- Role: Public (server forces
Student) - Description: Create a student account.
- Body:
{
"fullName": "Jane Doe",
"email": "student@demo.local",
"address": "Cairo",
"password": "StrongPassword1!"
}- Response (example):
{
"success": true,
"statusCode": 200,
"message": "Success",
"data": "User registered successfully",
"errors": null
}- Auth: No
- Role: Public
- Description: Login and receive access + refresh tokens.
- Body:
{
"email": "student@demo.local",
"password": "StrongPassword1!"
}- Response (example):
{
"success": true,
"statusCode": 200,
"message": "Success",
"data": {
"accessToken": "<jwt>",
"refreshToken": "<refresh>",
"email": "student@demo.local",
"fullName": "Jane Doe",
"role": "Student",
"userId": "<identity-user-id>",
"instructorTitle": null
},
"errors": null
}- Auth: Yes
- Role: Any authenticated user
- Description: Change password using current password.
- Body:
{
"currentPassword": "OldPassword1!",
"newPassword": "NewPassword1!",
"confirmNewPassword": "NewPassword1!"
}- Response:
ApiResponse<string>
- Auth: Yes
- Role: Any authenticated user
- Description: Returns the current user’s profile info. For students and instructors, includes role-specific
profilepayload. - Response:
ApiResponse<object>
- Auth: No
- Role: Public
- Description: Exchange a refresh token for a new access token + refresh token.
- Body:
{ "refreshToken": "<refresh>" }- Response:
ApiResponse<LoginResponseDTO>
- Auth: Yes
- Role: Any authenticated user
- Description: Revokes the provided refresh token.
- Body:
{ "refreshToken": "<refresh>" }- Response:
ApiResponse<string>
- Auth: Yes
- Role: Admin, Instructor, Student
- Description: Paginated course summaries.
- Query:
page(default 1)pageSize(default 12)- optional filters:
search,courseName,creditHours,courseCode,courseCategoryId
- Response:
ApiResponse<PaginatedResponse<ViewCourseSummaryDTO>>
- Auth: Yes
- Role: Admin, Instructor, Student
- Description: Course details.
- Response:
ApiResponse<ViewCourseDetailsDTO>
- Auth: Yes
- Role: Admin
- Description: Create a course.
- Body:
{
"courseName": "Data Structures",
"creditHours": 3,
"courseCode": "CS201",
"courseCategoryId": 1,
"description": "..."
}- Response:
ApiResponse<ViewCourseDetailsDTO>
- Auth: Yes
- Role: Admin
- Description: Update a course.
- Body:
{
"courseId": 12,
"courseName": "Data Structures",
"creditHours": 3,
"courseCode": "CS201",
"courseCategoryId": 1,
"description": "..."
}- Response:
ApiResponse<ViewCourseDetailsDTO>
- Auth: Yes
- Role: Admin
- Description: Delete a course.
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Any authenticated user
- Description: List course categories.
- Response:
ApiResponse<object> - Data shape (example):
[{ "id": 1, "name": "ComputerScience", "value": "ComputerScience" }]- Auth: Yes
- Role: Any authenticated user
- Description: Get category by id.
- Response:
ApiResponse<object> - Data shape (example):
{ "id": 1, "name": "ComputerScience", "value": "ComputerScience" }All endpoints require:
- Auth: Yes
- Role: Admin
- Description: Create a section.
- Body:
CreateSectionDTO - Response:
ApiResponse<ViewSectionDTO>
- Role: Admin, Instructor, Student
- Description: Get section by id.
- Body: None
- Response:
ApiResponse<ViewSectionDTO>
- Role: Admin, Instructor, Student
- Description: Filter sections.
- Query (all optional):
semesteryear(sent as a date value; only the year component is typically used)instructorIdcourseIdseats
- Response:
ApiResponse<IEnumerable<ViewSectionDTO>>
- Role: Admin
- Description: Update a section.
- Body:
UpdateSectionDTO - Response:
ApiResponse<ViewSectionDTO>
- Role: Admin
- Description: Delete a section.
- Body: None
- Response:
ApiResponse<bool>
- Auth: Yes
- Role: Student
- Description: Add a schedule slot to the current student cart.
- Request body: none
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Student
- Description: Adds the first available section/schedule slot for the course.
- Request body: none
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Student
- Description: Remove cart item.
- Response (example):
{
"success": true,
"statusCode": 200,
"message": "Success",
"data": {
"cartId": 1,
"cartItems": []
},
"errors": null
}- Auth: Yes
- Role: Student
- Description: View current cart.
- Response:
ApiResponse<ViewCartDTO>
- Auth: Yes
- Role: Student
- Description: Validation-only checkout (idempotent).
- Response:
ApiResponse<object>(includes validation details)
- Auth: Yes
- Role: Student
- Description: Enroll all cart items.
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Student
- Description: Returns the student’s current enrollments. On failures, API returns an empty array (UX requirement).
- Response:
ApiResponse<IEnumerable<ViewEnrollmentDTO>>
- Auth: Yes
- Role: Any authenticated user (server enforces ownership unless Admin)
- Description: Get enrollment by id.
- Response:
ApiResponse<ViewEnrollmentDTO>
- Auth: Yes
- Role: Admin, Instructor (instructors limited to their own sections)
- Description: Update grade and (admin-only) status.
- Body (example):
{
"grade": "A",
"status": 3,
"declineReason": null
}- Response:
ApiResponse<string>
- Auth: Yes
- Role: Admin
- Description: Delete enrollment and return seat.
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Student (own enrollment) or Admin
- Description: Drop/withdraw an enrollment if within registration or withdraw windows.
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Admin
- Description: Approve pending enrollment.
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Admin
- Description: Decline pending enrollment (returns seat).
- Body:
{ "reason": "Missing prerequisite" }- Response:
ApiResponse<string>
- Auth: Yes
- Role: Student
- Description: Returns student GPA summary and enrollment list.
CurrentGPAis calculated;StoredGPAis the persisted value. - Response:
ApiResponse<object>
- Auth: Yes
- Role: Admin
- Description: Returns GPA summary for a student.
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Admin, Instructor (instructors limited to their own sections)
- Description: Update a grade for an enrollment and recalculate GPA.
- Body:
{ "grade": "B+" }- Response:
ApiResponse<object>
- Auth: Yes
- Role: Student (self) or Admin/Instructor (must provide
studentId) - Description: What-if GPA calculator.
- Body:
{
"studentId": 123,
"simulatedCourses": [
{ "transcriptId": 10, "grade": "A" },
{ "creditHours": 3, "grade": "B+" }
]
}- Response:
ApiResponse<SimulateGpaResponseDTO>
- Auth: Yes
- Role: Student
- Description: Returns student transcript summary.
- Response:
ApiResponse<StudentTranscriptSummaryDTO>
- Auth: Yes
- Role: Admin, Instructor
- Description: Full transcript for a student by identity user id.
- Response:
ApiResponse<StudentTranscriptSummaryDTO>
- Auth: Yes
- Role: Admin, Instructor
- Description: Transcript entry by id.
- Response:
ApiResponse<ViewTranscriptDTO>
- Auth: Yes
- Role: Admin, Instructor
- Description: Transcript entries by student numeric id.
- Response:
ApiResponse<IEnumerable<ViewTranscriptDTO>>
- Auth: Yes
- Role: Admin, Instructor
- Description: Transcript entries for a term.
- Response:
ApiResponse<IEnumerable<ViewTranscriptDTO>>
- Auth: Yes
- Role: Admin
- Description: Filter transcripts.
- Query: optional
studentId,courseId,semester,year,grade - Response:
ApiResponse<IEnumerable<ViewTranscriptDTO>>
- Auth: Yes
- Role: Admin
- Description: Search students for transcript operations.
- Response:
ApiResponse<IEnumerable<StudentLookupDTO>>
- Auth: Yes
- Role: Admin, Instructor
- Description: Create a transcript entry.
- Body:
{
"studentId": 123,
"courseId": 12,
"sectionId": 5,
"grade": "A-",
"semester": "Fall",
"year": 2025
}- Response:
ApiResponse<ViewTranscriptDTO>
- Auth: Yes
- Role: Admin, Instructor
- Description: Update grade for a transcript entry.
- Body:
{ "transcriptId": 10, "grade": "B" }- Response:
ApiResponse<ViewTranscriptDTO>
- Auth: Yes
- Role: Admin
- Description: Delete transcript entry.
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Admin, Instructor
- Description: Calculate cumulative GPA.
- Response:
ApiResponse<double>
- Auth: Yes
- Role: Admin, Instructor
- Description: Calculate term GPA.
- Response:
ApiResponse<double>
- Auth: Yes
- Role: Admin
- Description: Forces GPA recalculation and persisted updates.
- Response:
ApiResponse<string>
- Auth: No
- Role: Public
- Description: Returns configured registration and withdraw window dates + computed status.
- Response:
ApiResponse<object>
- Auth: No
- Role: Public
- Description: Timeline window view (read-only).
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Any authenticated user
- Description:
- Students: global academic events + enrolled class meetings + office hour bookings
- Instructors: global events + teaching schedule + office hours
- Admins: global academic events only
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Any authenticated user
- Description: Convenience wrapper for today’s events.
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Any authenticated user
- Description: Convenience wrapper for next 7 days.
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Any authenticated user
- Description: Unified role-aware calendar view (recommended endpoint for the calendar page). Returns events + conflict information.
- Notes:
- Also accepts legacy query names
fromDate/toDate.
- Also accepts legacy query names
- Response:
ApiResponse<object>(data includes{ viewRole, dateRange, events, conflicts })
- Auth: Yes
- Role: Any authenticated user
- Description: Get the current user's calendar UI/preferences.
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Any authenticated user
- Description: Upsert the current user's calendar UI/preferences.
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Any authenticated user
- Description: Get in-app reminder rules (used by the scheduled reminder dispatcher).
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Any authenticated user
- Description: Replace in-app reminder rules.
- Response:
ApiResponse<object>
All endpoints in this section require:
- Auth: Yes (except the OAuth callback)
- Role: Any authenticated user
- Description: Returns whether the current user is connected. Never returns tokens.
- Response:
ApiResponse<object>(data:{ connected, email })
- Description: Returns an authorization URL. Frontend should navigate the browser to the returned URL.
- Security:
returnUrlmust be a local-relative path starting with/. - Response:
ApiResponse<object>(data:{ url })
- Description: Disconnect current user (removes stored tokens and event mappings). Best-effort.
- Response:
ApiResponse<string>
- Auth: No (Google redirects the browser)
- Description: OAuth callback endpoint configured in Google Cloud Console.
- Response:
text/plainor redirect
- Auth: Yes
- Role: Any authenticated user
- Description: List user conversations.
- Response:
ApiResponse<ViewConversationsDTO>
- Auth: Yes
- Role: Any authenticated user
- Description: Search chat users.
- Response:
ApiResponse<List<ChatUserSearchResultDTO>>
- Auth: Yes
- Role: Any authenticated user
- Description: Get or create a direct conversation and optionally return first page of messages.
- Body (example):
{
"otherUserId": "<identity-user-id>",
"page": 1,
"pageSize": 20
}- Response:
ApiResponse<ViewConversationDTO>
- Auth: Yes
- Role: Any authenticated user
- Description: Conversation messages.
- Notes:
- Supports page-based paging (
page/pageSize) and cursor paging (beforeMessageId+pageSize).
- Supports page-based paging (
- Response:
ApiResponse<ViewConversationDTO>
- Auth: Yes
- Role: Any authenticated user
- Description: Delete a message for the current user only.
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Any authenticated user
- Description: Delete a message for everyone in the conversation (redacts content).
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Any authenticated user
- Description: Marks conversation messages as read and notifies senders via SignalR.
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Any authenticated user
- Description: Send a message. Requires either
receiverId(new conversation) orconversationId(existing). - Request body: none (query params)
- Response:
ApiResponse<ViewConversationDTO>
SignalR hubs:
GET/WS /hubs/chat- Client events used in API flows:
ReceiveMessageConversationCreatedMessageReadUserTypingUserPresenceChangedMessageDeletedForMeMessageDeletedForEveryone
All endpoints in this section require:
- Auth: Yes
- Role: Any authenticated user
- Description: Get notifications for the current user.
- Query:
unreadOnly(optional)page(default 1)pageSize(default 20)
- Response:
ApiResponse<object> - Data shape (example):
{
"notifications": [
{
"notificationId": 1,
"type": "Enrollment",
"title": "Enrollment approved",
"message": "Your enrollment was approved",
"entityType": "Enrollment",
"entityId": 123,
"isRead": false,
"readAt": null,
"createdAt": "2026-01-01T10:00:00Z"
}
],
"totalCount": 10,
"unreadCount": 3,
"page": 1,
"pageSize": 20,
"totalPages": 1
}- Description: Get unread notifications count.
- Response:
ApiResponse<object>(data:{ count })
- Description: Mark a notification as read.
- Body: None
- Response:
ApiResponse<string>
- Description: Mark all notifications as read.
- Body: None
- Response:
ApiResponse<string>
- Description: Delete a notification.
- Body: None
- Response:
ApiResponse<string>
- Description: Delete all read notifications.
- Body: None
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Instructor
- Description: List office hour slots for the current instructor.
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Instructor
- Description: Create an office hour.
- Body (example):
{
"date": "2025-12-31T00:00:00Z",
"startTime": "10:00",
"endTime": "10:30",
"roomId": 1,
"isRecurring": false,
"notes": "Bring your draft"
}- Response:
ApiResponse<object>(containsofficeHourId)
- Auth: Yes
- Role: Instructor
- Description: Batch create office hours.
- Body: array of the create DTO
- Response:
ApiResponse<object>(containscreatedIds,errors)
- Auth: Yes
- Role: Instructor
- Description: Update office hour.
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Instructor
- Description: Delete office hour.
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Instructor
- Description: Confirm booking.
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Instructor
- Description: Add instructor notes.
- Body:
{ "notes": "Reviewed syllabus" }- Response:
ApiResponse<string>
- Auth: Yes
- Role: Instructor
- Description: Mark booking completed.
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Instructor
- Description: Mark booking no-show.
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Student
- Description: List available office hours.
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Student
- Description: Instructors + availability counts.
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Student
- Description: Book an office hour.
- Body:
{ "purpose": "Exam review", "studentNotes": "Need help with Q3" }- Response:
ApiResponse<object>(containsbookingId)
- Auth: Yes
- Role: Student
- Description: Student bookings.
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Student, Instructor
- Description: Cancel a booking.
- Body:
{ "reason": "Schedule conflict" }- Response:
ApiResponse<string>
- Auth: Yes
- Role: Admin
- Description: Admin query of all office hours.
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Any authenticated user
- Description: Returns a Google authorization URL. The frontend should navigate to the returned
url. - Response (example):
{
"success": true,
"statusCode": 200,
"message": "Success",
"data": { "url": "https://accounts.google.com/o/oauth2/v2/auth?..." },
"errors": null
}- Auth: Yes
- Role: Any authenticated user
- Description: Legacy redirect endpoint. Prefer
connect-urlbecause normal browser navigation won’t attach JWT. - Response:
302 Redirect
- Auth: Yes
- Role: Any authenticated user
- Description: Returns
{ connected, email }and never returns tokens. - Response:
ApiResponse<object>
- Auth: No
- Role: Public (OAuth callback)
- Description: OAuth callback configured in Google Console; stores tokens and redirects to safe return URL.
- Response:
302 Redirectortext/plain
All endpoints in this section require:
- Auth: Yes
- Role: Admin
- Description: Admin dashboard stats summary (users and enrollments).
- Body: None
- Response:
ApiResponse<object>(see Response envelope example above)
- Description: Paginated list of users.
- Query:
email(optional)role(optional)pageNumber(default 1)pageSize(default 10)
- Body: None
- Response:
ApiResponse<object>(items + paging fields)
- Description: Get a user by id.
- Body: None
- Response:
ApiResponse<object>
- Description: Update basic user fields.
- Body (example):
{
"fullName": "Jane Doe",
"email": "jane.doe@example.com",
"address": "Cairo"
}- Response:
ApiResponse<object>
- Description: Delete a user.
- Body: None
- Response:
ApiResponse<string>
- Description: Change a user role (Admin/Student/Instructor).
- Body (example):
{ "newRole": "Instructor" }- Response:
ApiResponse<string>
- Description: Create a user with an explicit role (Admin/Student/Instructor). Also creates the role-specific profile.
- Body:
CreateUserDTO(shape depends on role; includesfullName,email,password,role, and optional profile fields) - Response:
ApiResponse<object>
- Description: Paginated list of student users.
- Query:
search(optional)page(default 1)pageSize(default 10)
- Body: None
- Response:
ApiResponse<object>
- Description: Get a student user by id.
- Body: None
- Response:
ApiResponse<object>
- Description: Update a student user and selected student profile fields.
- Body:
UpdateStudentDTO - Response:
ApiResponse<object>
- Description: Delete a student user.
- Body: None
- Response:
ApiResponse<string>
- Description: Paginated enrollments list for admin review.
- Query:
search(optional)status(optional)page(default 1)pageSize(default 10)
- Body: None
- Response:
ApiResponse<object>
- Description: Get enrollments for a specific student user id.
- Body: None
- Response:
ApiResponse<IEnumerable<ViewEnrollmentDTO>>
- Description: Get a student cart by student user id.
- Body: None
- Response:
ApiResponse<ViewCartDTO>
- Description: Alias for viewing a student cart.
- Body: None
- Response:
ApiResponse<ViewCartDTO>
- Description: Force-enroll a student in a section (admin override).
- Body (example):
{ "sectionId": 123 }- Response:
ApiResponse<string>
- Description: Get the configured academic timeline dates.
- Body: None
- Response:
ApiResponse<object>
- Description: Set the academic timeline dates (registration/withdraw windows).
- Body (example):
{
"registrationStartDate": "2026-01-05",
"registrationEndDate": "2026-01-20",
"withdrawStartDate": "2026-01-21",
"withdrawEndDate": "2026-02-05"
}- Response:
ApiResponse<string>
- Description: Convenience endpoint to set registration end + withdraw end (withdraw start is set to registration end).
- Body (example):
{
"registrationEndDate": "2026-01-20",
"withdrawEndDate": "2026-02-05"
}- Response:
ApiResponse<string>
All endpoints in this section require:
- Auth: Yes
- Role: Admin
- Description: High-level dashboard overview (counts and status breakdowns).
- Body: None
- Response:
ApiResponse<object>
- Description: Enrollment trend series for the last 30 days (chart-ready).
- Body: None
- Response:
ApiResponse<object>
- Description: Top course stats by enrollments.
- Body: None
- Response:
ApiResponse<object>
- Description: GPA distribution summary + chart data.
- Body: None
- Response:
ApiResponse<object>
- Description: Completed credits distribution summary + chart data.
- Body: None
- Response:
ApiResponse<object>
- Description: Instructor-level stats (sections and student counts).
- Body: None
- Response:
ApiResponse<object>
- Description: Recent activity payload for admin dashboard.
- Query:
limit(default 20) - Body: None
- Response:
ApiResponse<object>
- Description: Capacity/utilization stats for sections.
- Body: None
- Response:
ApiResponse<object>
- Description: Aggregated system summary for admin.
- Body: None
- Response:
ApiResponse<object>
All endpoints in this section require:
- Auth: Yes
- Role: Instructor or Admin
- Description: Paginated list of pending enrollment requests.
- Query:
search(optional),page(default 1),pageSize(default 10) - Body: None
- Response:
ApiResponse<object>
- Description: Approve a pending enrollment request.
- Body: None
- Response:
ApiResponse<string>
- Description: Decline a pending enrollment request.
- Body (example):
{ "reason": "Prerequisite not met" }- Response:
ApiResponse<string>
- Description: Paginated enrollments list for advisors.
- Query:
status(optional),search(optional),page(default 1),pageSize(default 10) - Body: None
- Response:
ApiResponse<object>
- Description: Summary counts (pending/approved/declined/today).
- Body: None
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Student
- Description: Get the current student's academic progress.
- Body: None
- Response:
ApiResponse<StudentAcademicProgressDTO>
- Auth: Yes
- Role: Admin, Instructor
- Description: Get academic progress for a student (by Identity user id).
- Body: None
- Response:
ApiResponse<StudentAcademicProgressDTO>
- Auth: Yes
- Role: Admin, Instructor, Student
- Description: List academic plans.
- Body: None
- Response:
ApiResponse<IEnumerable<ViewAcademicPlanSummaryDTO>>
- Auth: Yes
- Role: Admin, Instructor, Student
- Description: Get an academic plan by id.
- Body: None
- Response:
ApiResponse<ViewAcademicPlanDTO>
- Auth: Yes
- Role: Admin, Instructor, Student
- Description: List courses in an academic plan.
- Body: None
- Response:
ApiResponse<IEnumerable<AcademicPlanCourseDTO>>
- Auth: Yes
- Role: Admin
- Description: Create an academic plan.
- Body:
CreateAcademicPlanDTO - Response:
ApiResponse<ViewAcademicPlanDTO>
- Auth: Yes
- Role: Admin
- Description: Update an academic plan.
- Body:
UpdateAcademicPlanDTO - Response:
ApiResponse<ViewAcademicPlanDTO>
- Auth: Yes
- Role: Admin
- Description: Delete an academic plan.
- Body: None
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Admin
- Description: Add a course to an academic plan.
- Body:
AddCourseToAcademicPlanDTO - Response:
ApiResponse<AcademicPlanCourseDTO>
- Auth: Yes
- Role: Admin
- Description: Remove a course from an academic plan.
- Body: None
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Admin
- Description: Assign a student to an academic plan. Supports JSON body or query-string payload.
- Body (example):
{ "studentId": 123, "academicPlanId": "default" }- Response:
ApiResponse<string>
All endpoints require Auth: Yes.
- Role: Admin
- Description: Create a student profile.
- Body:
CreateStudentDTO - Response:
ApiResponse<ViewStudentProfileDTO>
- Role: Any authenticated user
- Description: Get a student profile by numeric student id.
- Body: None
- Response:
ApiResponse<ViewStudentProfileDTO>
- Role: Any authenticated user
- Description: Get the current student's profile.
- Body: None
- Response:
ApiResponse<ViewStudentProfileDTO>
- Role: Any authenticated user
- Description: Filtered list of students.
- Query:
GPA(optional),CompletedCredits(optional),AcademicPlanId(optional) - Body: None
- Response:
ApiResponse<List<ViewStudentProfileDTO>>
- Role: Admin, Student
- Description: Update a student profile (admin path).
- Body:
UpdateStudentProfileDTO - Response:
ApiResponse<ViewStudentProfileDTO>
- Role: Student
- Description: Change the current student's password (email is enforced from JWT).
- Body:
ChangePasswordDTO - Response:
ApiResponse<string>
All endpoints require Auth: Yes.
- Role: Admin
- Description: Create an instructor profile.
- Body:
CreateInstructorDTO - Response:
ApiResponse<object>
- Role: Admin, Student, Instructor
- Description: List instructors.
- Body: None
- Response:
ApiResponse<object>
- Role: Admin, Student, Instructor
- Description: Get instructor by id.
- Body: None
- Response:
ApiResponse<object>
- Role: Admin
- Description: Update instructor fields.
- Body:
UpdateInstructorDTO - Response:
ApiResponse<object>
- Role: Admin
- Description: Delete instructor.
- Body: None
- Response:
ApiResponse<string>
- Role: Admin, Instructor
- Description: Get instructor schedule.
- Body: None
- Response:
ApiResponse<object>
- Role: Instructor
- Description: Get schedule for the logged-in instructor.
- Body: None
- Response:
ApiResponse<object>
All endpoints require Auth: Yes.
- Role: Admin, Instructor, Student
- Description: List rooms.
- Body: None
- Response:
ApiResponse<IEnumerable<ViewRoomDTO>>
- Role: Admin, Instructor, Student
- Description: Get room by id.
- Body: None
- Response:
ApiResponse<ViewRoomDTO>
- Role: Admin
- Description: Create a room (also auto-creates standard time slots for the week).
- Body:
CreateRoomDTO - Response:
ApiResponse<ViewRoomDTO>
- Role: Admin
- Description: Update a room.
- Body:
UpdateRoomDTO - Response:
ApiResponse<ViewRoomDTO>
- Role: Admin
- Description: Delete a room.
- Body: None
- Response:
ApiResponse<string>
All endpoints require Auth: Yes.
- Role: Admin, Instructor, Student
- Description: List time slots.
- Body: None
- Response:
ApiResponse<IEnumerable<ViewTimeSlotDTO>>
- Role: Admin, Instructor, Student
- Description: List time slots for a room.
- Body: None
- Response:
ApiResponse<IEnumerable<ViewTimeSlotDTO>>
- Role: Admin
- Description: Create a time slot.
- Body:
CreateTimeSlotDTO - Response:
ApiResponse<ViewTimeSlotDTO>
- Role: Admin
- Description: Update a time slot.
- Body:
UpdateTimeSlotDTO(must match URL id) - Response:
ApiResponse<ViewTimeSlotDTO>
- Role: Admin
- Description: Delete a time slot.
- Body: None
- Response:
ApiResponse<string>
All endpoints require Auth: Yes.
- Role: Admin
- Description: Create a schedule slot.
- Body:
CreateScheduleSlotDTO - Response:
ApiResponse<object>
- Role: Admin, Instructor, Student
- Description: List schedule slots.
- Body: None
- Response:
ApiResponse<object>
- Role: Admin, Instructor, Student
- Description: List schedule slots for a section.
- Body: None
- Response:
ApiResponse<object>
- Role: Admin, Instructor
- Description: List schedule slots for an instructor.
- Body: None
- Response:
ApiResponse<object>
- Role: Admin, Instructor, Student
- Description: List schedule slots for a room.
- Body: None
- Response:
ApiResponse<object>
- Role: Admin
- Description: Delete a schedule slot.
- Body: None
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Student, Admin
- Description: Recommend a non-conflicting set of sections for the selected course ids.
- Body:
SmartScheduleRequestDTO - Response:
ApiResponse<object>(returns recommended sections, unscheduled courses, and explanation)
These endpoints are intended for local development. They only work when the backend environment is Development.
- Auth: No (but only available in Development)
- Role: Development only
- Description: Seed demo data (idempotent).
- Body: None
- Response:
ApiResponse<SeedResultDto>
- Auth: No (but only available in Development)
- Role: Development only
- Description: Reset DB (ensure deleted + migrate) then seed demo data.
- Body: None
- Response:
ApiResponse<SeedResultDto>
- Auth: No (but only available in Development)
- Role: Development only
- Description: Get demo users list.
- Body: None
- Response:
ApiResponse<List<DemoUserInfoDto>>
- Auth: No (but only available in Development)
- Role: Development only
- Description: Issue tokens for a demo user by email (dev helper).
- Body (example):
{ "email": "student@demo.local" }- Response:
ApiResponse<LoginResponseDTO>
- Auth: Yes
- Role: Student
- Description: Submit a withdraw request for an enrollment (only during withdraw window).
- Body:
{ "enrollmentId": 123, "reason": "Medical" }- Response:
ApiResponse<string>
- Auth: Yes
- Role: Student
- Description: List current student’s withdraw requests.
- Response:
ApiResponse<object>
- Auth: Yes
- Role: Admin
- Description: List all withdraw requests.
- Response:
ApiResponse<List<WithdrawRequestDTO>>
- Auth: Yes
- Role: Admin
- Description: Approve withdraw request and drop enrollment.
- Response:
ApiResponse<string>
- Auth: Yes
- Role: Admin
- Description: Deny withdraw request.
- Response:
ApiResponse<string>