This commit is contained in:
sajjadtalkhabi
2026-05-21 15:51:32 +03:30
parent 8990ceaddd
commit 74227d5021
71 changed files with 2014 additions and 1666 deletions
+10 -7
View File
@@ -7,17 +7,20 @@ export const apiShowAdminAssignment = (id) => http.get(buildUrl(endpoints.showAs
export const apiAddAdminAssignment = (payload) => http.post(endpoints.addNewAssignment, payload)
// Backend uses PATCH /homeworks/:id (not PUT).
export const apiUpdateAdminAssignment = (id, payload) =>
http.put(buildUrl(endpoints.updateAssignment, { id }), payload)
http.patch(buildUrl(endpoints.updateAssignment, { id }), payload)
export const apiDeleteAdminAssignment = (id) =>
http.delete(buildUrl(endpoints.deleteAssignment, { id }))
export const apiGetAdminAssignmentSubmissions = (assignmentId, params) =>
http.get(buildUrl(endpoints.getAssignmentSubmissions, { assignmentId }), { params })
export const apiGetAdminAssignmentSubmissions = (homeworkId, params) =>
http.get(buildUrl(endpoints.getAssignmentSubmissions, { homeworkId }), { params })
export const apiShowAdminAssignmentSubmission = (assignmentId, submissionId) =>
http.get(buildUrl(endpoints.showAssignmentSubmission, { assignmentId, submissionId }))
// Backend exposes submissions flat under /homework-submissions/:submissionId —
// the parent `homeworkId` is not part of the URL, so we ignore it here.
export const apiShowAdminAssignmentSubmission = (_homeworkId, submissionId) =>
http.get(buildUrl(endpoints.showAssignmentSubmission, { submissionId }))
export const apiReviewAdminAssignmentSubmission = (assignmentId, submissionId, payload) =>
http.post(buildUrl(endpoints.reviewAssignmentSubmission, { assignmentId, submissionId }), payload)
export const apiReviewAdminAssignmentSubmission = (_homeworkId, submissionId, payload) =>
http.patch(buildUrl(endpoints.reviewAssignmentSubmission, { submissionId }), payload)
@@ -1,35 +0,0 @@
import { http } from '@/services/api/http'
import { buildUrl, endpoints } from '@/services/api/endpoints'
export const apiGetAdminCourseTemplates = (params) => http.get(endpoints.getCoursesList, { params })
export const apiShowAdminCourseTemplate = (id) => http.get(buildUrl(endpoints.showCourse, { id }))
export const apiAddAdminCourseTemplate = (payload) => http.post(endpoints.addNewCourse, payload)
export const apiUpdateAdminCourseTemplate = (id, payload) =>
http.put(buildUrl(endpoints.updateCourseTemplate, { id }), payload)
export const apiDeleteAdminCourseTemplate = (id) =>
http.delete(buildUrl(endpoints.deleteCourseTemplate, { id }))
export const apiChangeAdminCourseTemplateStatus = (id, payload) =>
http.post(buildUrl(endpoints.changeStatusCourseTemplate, { id }), payload)
export const apiGetAdminTemplateStudents = (templateId, params) =>
http.get(buildUrl(endpoints.listTemplateStudents, { templateId }), { params })
export const apiAddAdminTemplateStudent = (templateId, payload) =>
http.post(buildUrl(endpoints.addTemplateStudent, { templateId }), payload)
export const apiRemoveAdminTemplateStudent = (templateId, userId) =>
http.delete(buildUrl(endpoints.removeTemplateStudent, { templateId, userId }))
export const apiGetAdminTemplateSessions = (templateId, params) =>
http.get(buildUrl(endpoints.listTemplateSessions, { templateId }), { params })
export const apiAttachAdminTemplateSession = (templateId, payload) =>
http.post(buildUrl(endpoints.attachTemplateSession, { templateId }), payload)
export const apiDetachAdminTemplateSession = (templateId, sessionId) =>
http.delete(buildUrl(endpoints.detachTemplateSession, { templateId, sessionId }))
+17 -2
View File
@@ -12,5 +12,20 @@ export const apiUpdateAdminCourse = (id, payload) =>
export const apiDeleteAdminCourse = (id) => http.delete(buildUrl(endpoints.deleteCourse, { id }))
export const apiChangeAdminCourseStatus = (id, payload) =>
http.post(buildUrl(endpoints.changeStatusCourse, { id }), payload)
export const apiGetAdminCourseStudents = (courseId, params) =>
http.get(buildUrl(endpoints.listCourseStudents, { courseId }), { params })
export const apiAddAdminCourseStudent = (courseId, payload) =>
http.post(buildUrl(endpoints.addCourseStudent, { courseId }), payload)
export const apiRemoveAdminCourseStudent = (courseId, userId) =>
http.delete(buildUrl(endpoints.removeCourseStudent, { courseId, userId }))
export const apiGetAdminCourseSessions = (courseId, params) =>
http.get(buildUrl(endpoints.listCourseSessions, { courseId }), { params })
export const apiAttachAdminCourseSession = (courseId, payload) =>
http.post(buildUrl(endpoints.attachCourseSession, { courseId }), payload)
export const apiDetachAdminCourseSession = (courseId, sessionId) =>
http.delete(buildUrl(endpoints.detachCourseSession, { courseId, sessionId }))
+12 -1
View File
@@ -7,11 +7,22 @@ export const apiShowAdminExam = (id) => http.get(buildUrl(endpoints.showExam, {
export const apiAddAdminExam = (payload) => http.post(endpoints.addNewExam, payload)
// Backend uses PATCH /exams/:id (not PUT).
export const apiUpdateAdminExam = (id, payload) =>
http.put(buildUrl(endpoints.updateExam, { id }), payload)
http.patch(buildUrl(endpoints.updateExam, { id }), payload)
export const apiDeleteAdminExam = (id) => http.delete(buildUrl(endpoints.deleteExam, { id }))
// POST /exams/:examId/questions — payload: { questionText, position, options: [{ optionText, isCorrect }] }
// Must include ≥2 options; question + options created atomically.
export const apiAddAdminExamQuestion = (examId, payload) =>
http.post(buildUrl(endpoints.addExamQuestion, { examId }), payload)
// POST /questions/:questionId/options — payload: { optionText, isCorrect }
export const apiAddAdminQuestionOption = (questionId, payload) =>
http.post(buildUrl(endpoints.addQuestionOption, { questionId }), payload)
// Mock-only — backend has no /exams/:id/participants endpoint yet.
export const apiGetAdminExamParticipants = (examId, params) =>
http.get(buildUrl(endpoints.getExamParticipants, { examId }), { params })
-3
View File
@@ -12,8 +12,5 @@ export const apiUpdateAdminSession = (id, payload) =>
export const apiDeleteAdminSession = (id) => http.delete(buildUrl(endpoints.deleteSession, { id }))
export const apiChangeAdminSessionStatus = (id, payload) =>
http.post(buildUrl(endpoints.changeStatusSession, { id }), payload)
export const apiGetSessionAttendance = (sessionId, params) =>
http.get(buildUrl(endpoints.getSessionsAttendance, { sessionId }), { params })
-3
View File
@@ -14,9 +14,6 @@ export const apiDeleteAdminTerm = (id) => http.delete(buildUrl(endpoints.deleteT
export const apiCloneAdminTerm = (id) => http.post(buildUrl(endpoints.cloneTerm, { id }))
export const apiChangeAdminTermStatus = (id, payload) =>
http.post(buildUrl(endpoints.changeStatusTerm, { id }), payload)
export const apiGetAdminTermStudents = (termId, params) =>
http.get(buildUrl(endpoints.listUserTerm, { termId }), { params })
+2 -1
View File
@@ -8,5 +8,6 @@ export const apiShowAdminTicket = (id) => http.get(buildUrl(endpoints.showTicket
export const apiSendAdminTicketMessage = (id, payload) =>
http.post(buildUrl(endpoints.sendTicketMessage, { id }), payload)
// Backend uses PATCH (not POST).
export const apiChangeAdminTicketStatus = (id, payload) =>
http.post(buildUrl(endpoints.changeTicketStatus, { id }), payload)
http.patch(buildUrl(endpoints.changeTicketStatus, { id }), payload)
+71 -48
View File
@@ -1,4 +1,5 @@
export const endpoints = {
// ─── Auth & profile ────────────────────────────────────────────────────────
register: '/register',
resendVerificationCodeForRegister: '/resend-verification-code',
verifyCode: '/verify-code',
@@ -10,13 +11,14 @@ export const endpoints = {
verifyForgotPasswordCode: '/verify-forgot-password-code',
resetPassword: '/reset-password',
logout: '/logout',
uploadMedia: '/media',
me: '/auth/me',
updateProfile: '/profile',
// ─── Geo ───────────────────────────────────────────────────────────────────
provinceList: '/provinces',
citiesList: '/provinces/:provinceId/cities',
me: '/auth/me',
updateProfile: '/profile',
// ─── Student-facing ────────────────────────────────────────────────────────
getStudentCourses: '/student/courses',
showStudentCourse: '/student/courses/:id',
getStudentTerms: '/student/terms',
@@ -45,12 +47,12 @@ export const endpoints = {
getStudentCertificates: '/student/certificates',
downloadStudentCertificate: '/student/certificates/:id/download',
// ─── Admin: users (out of scope of the Terms/Courses backend doc) ──────────
getPendingStudents: '/admin/pending-students',
showPendingStudent: '/admin/pending-students/:id',
changeStatusPendingStudent: '/admin/pending-students/:id/status',
downloadPdfPendingStudentInfo: '/admin/pending-students/:id/pdf',
getApprovedUsers: '/admin/users',
showUserDetails: '/admin/users/:id',
addNewUser: '/admin/users',
updateUser: '/admin/users/:id',
@@ -59,63 +61,92 @@ export const endpoints = {
changeUserStatus: '/admin/users/:id/status',
deleteUser: '/admin/users/:id',
// ─── Backend-aligned: Terms ────────────────────────────────────────────────
getTermsList: '/terms',
addNewTerm: '/terms',
showTerm: '/terms/:id',
updateTerm: '/terms/:id',
deleteTerm: '/terms/:id',
cloneTerm: '/admin/terms/:id/clone',
changeStatusTerm: '/admin/terms/:id/status',
listUserTerm: '/admin/terms/:termId/students',
addUserTerm: '/admin/terms/:termId/students',
removeUserTerm: '/admin/terms/:termId/students/:userId',
changeLeaveStatus: '/admin/terms/:termId/students/:userId/toggle-leave',
listCourseTerm: '/admin/terms/:termId/courses',
addCourseTerm: '/admin/terms/:termId/courses',
removeCourseTerm: '/admin/terms/:termId/courses/:courseId',
// ─── Backend-aligned: Courses ──────────────────────────────────────────────
getCoursesList: '/courses',
addNewCourse: '/courses',
showCourse: '/courses/:id',
updateCourse: '/courses/:id',
deleteCourse: '/courses/:id',
changeStatusCourse: '/admin/courses/:id/toggle-status',
getCourseTemplatesList: '/admin/courses',
addNewCourseTemplate: '/admin/courses',
showCourseTemplate: '/admin/courses/:id',
updateCourseTemplate: '/admin/courses/:id',
deleteCourseTemplate: '/admin/courses/:id',
changeStatusCourseTemplate: '/admin/course-templates/:id/status',
listTemplateStudents: '/admin/course-templates/:templateId/students',
addTemplateStudent: '/admin/course-templates/:templateId/students',
removeTemplateStudent: '/admin/course-templates/:templateId/students/:userId',
listTemplateSessions: '/admin/course-templates/:templateId/sessions',
attachTemplateSession: '/admin/course-templates/:templateId/sessions',
detachTemplateSession: '/admin/course-templates/:templateId/sessions/:sessionId',
// ─── Backend-aligned: Sessions ─────────────────────────────────────────────
getSessionsList: '/sessions',
addNewSession: '/sessions',
showSession: '/sessions/:id',
updateSession: '/sessions/:id',
deleteSession: '/sessions/:id',
changeStatusSession: '/admin/sessions/:id/toggle-status',
// ─── Backend-aligned: Exams ────────────────────────────────────────────────
// `getExamsList` is not yet in the backend Postman doc, but per the user
// the backend will add it at /exams — wired up now so the FE doesn't need
// to change when the endpoint lands.
getExamsList: '/exams',
showExam: '/exams/:id',
addNewExam: '/exams',
updateExam: '/exams/:id',
deleteExam: '/exams/:id',
addExamQuestion: '/exams/:examId/questions',
addQuestionOption: '/questions/:questionId/options',
submitExam: '/exams/:examId/submit',
// ─── Backend-aligned: Homeworks (FE calls them "assignments") ──────────────
addNewAssignment: '/homeworks',
updateAssignment: '/homeworks/:id',
deleteAssignment: '/homeworks/:id',
submitHomework: '/homeworks/:homeworkId/submit',
reviewAssignmentSubmission: '/homework-submissions/:submissionId/review',
// ─── Backend-aligned: Media ────────────────────────────────────────────────
uploadMedia: '/media',
downloadMedia: '/media/:id/download',
deleteMedia: '/media/:id',
// ─── FE mock-only — NOT in backend Postman doc ─────────────────────────────
// Kept so existing UI screens continue to work against the mock layer.
// See docs/backend-vs-ui-gaps.md for the list of decisions pending.
// Terms — clone + status + students-in-term + courses-in-term
cloneTerm: '/admin/terms/:id/clone',
listUserTerm: '/admin/terms/:termId/students',
addUserTerm: '/admin/terms/:termId/students',
removeUserTerm: '/admin/terms/:termId/students/:userId',
changeLeaveStatus: '/admin/terms/:termId/students/:userId/toggle-leave',
listCourseTerm: '/admin/terms/:termId/courses',
addCourseTerm: '/admin/terms/:termId/courses',
removeCourseTerm: '/admin/terms/:termId/courses/:courseId',
// Courses — students-in-course + attach/detach sessions (backend uses 1:N via session.course_id)
listCourseStudents: '/admin/courses/:courseId/students',
addCourseStudent: '/admin/courses/:courseId/students',
removeCourseStudent: '/admin/courses/:courseId/students/:userId',
listCourseSessions: '/admin/courses/:courseId/sessions',
attachCourseSession: '/admin/courses/:courseId/sessions',
detachCourseSession: '/admin/courses/:courseId/sessions/:sessionId',
// Sessions — attendance roster
getSessionsAttendance: '/admin/sessions/:sessionId/attendances',
getAssignmentsList: '/admin/assignments',
addNewAssignment: '/admin/assignments',
showAssignment: '/admin/assignments/:id',
updateAssignment: '/admin/assignments/:id',
deleteAssignment: '/admin/assignments/:id',
getAssignmentSubmissions: '/admin/assignments/:assignmentId/submissions',
showAssignmentSubmission: '/admin/assignments/:assignmentId/submissions/:submissionId',
reviewAssignmentSubmission: '/admin/assignments/:assignmentId/submissions/:submissionId/review',
// Exams — participants only (backend has /exams/:id but no participants endpoints)
getExamParticipants: '/admin/exams/:examId/participants',
showExamParticipant: '/admin/exams/:examId/participants/:participantId',
// Homeworks — list, show, submissions list, show submission
// Paths aligned to backend `/homeworks` and `/homework-submissions`. The
// backend Postman doc currently exposes only create/update/delete/submit/review;
// list + show + submissions list + show-submission stay mock-only until backend
// adds them, but URL shape is locked in.
getAssignmentsList: '/homeworks',
showAssignment: '/homeworks/:id',
getAssignmentSubmissions: '/homeworks/:homeworkId/submissions',
showAssignmentSubmission: '/homework-submissions/:submissionId',
// ─── Tickets / Consultations (out of scope of Terms/Courses backend doc) ───
getTicketsList: '/admin/tickets',
showTicket: '/admin/tickets/:id',
sendTicketMessage: '/admin/tickets/:id/messages',
@@ -125,14 +156,6 @@ export const endpoints = {
showConsultation: '/admin/consultations/:id',
sendConsultationMessage: '/admin/consultations/:id/messages',
changeConsultationStatus: '/admin/consultations/:id/status',
getExamsList: '/admin/exams',
addNewExam: '/admin/exams',
showExam: '/admin/exams/:id',
updateExam: '/admin/exams/:id',
deleteExam: '/admin/exams/:id',
getExamParticipants: '/admin/exams/:examId/participants',
showExamParticipant: '/admin/exams/:examId/participants/:participantId',
}
export const buildUrl = (template, params = {}) =>