fix
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import { register } from '@/services/mock/registry'
|
||||
import { endpoints } from '@/services/api/endpoints'
|
||||
import { adminCourses } from '@/services/mock/fixtures/admin-courses'
|
||||
import { adminSessions } from '@/services/mock/fixtures/admin-sessions'
|
||||
import { adminCourseTemplates } from '@/services/mock/fixtures/admin-courses'
|
||||
import { adminExams, examParticipants } from '@/services/mock/fixtures/admin-exams'
|
||||
import {
|
||||
filterDateRange,
|
||||
@@ -14,74 +14,139 @@ import {
|
||||
updateById,
|
||||
} from '@/services/mock/helpers'
|
||||
|
||||
const resolveCourseFromSession = (session) => {
|
||||
const courseId = session?.course?.id ?? session?.courseId
|
||||
if (courseId == null) return null
|
||||
return adminCourses.find((c) => c.id === Number(courseId)) || null
|
||||
}
|
||||
|
||||
const sessionSnapshot = (session) => (session ? { id: session.id, title: session.title } : null)
|
||||
|
||||
const courseSnapshot = (course) => (course ? { id: course.id, title: course.title } : null)
|
||||
|
||||
register('GET', endpoints.getExamsList, ({ query }) => {
|
||||
let list = filterItems(adminExams, query, {
|
||||
title: 'includes',
|
||||
courseTemplateId: (item, v) => String(item.courseTemplate?.id) === String(v),
|
||||
courseId: (item, v) => String(item.course?.id) === String(v),
|
||||
sessionId: (item, v) => String(item.sessionId) === String(v),
|
||||
})
|
||||
list = filterDateRange(list, query)
|
||||
return paginate(list, query)
|
||||
const { data: items, meta } = paginate(list, query)
|
||||
return {
|
||||
success: true,
|
||||
message: 'OK',
|
||||
data: items,
|
||||
meta,
|
||||
}
|
||||
})
|
||||
|
||||
register('GET', endpoints.showExam, ({ params }) => ({
|
||||
success: true,
|
||||
message: 'OK',
|
||||
data: findOrThrow(adminExams, params.id),
|
||||
}))
|
||||
|
||||
register('POST', endpoints.addNewExam, ({ data }) => {
|
||||
const session = adminSessions.find((s) => s.id === Number(data.sessionId))
|
||||
const template = session?.courseTemplate
|
||||
? adminCourseTemplates.find((c) => c.id === Number(session.courseTemplate.id))
|
||||
: null
|
||||
const course = resolveCourseFromSession(session)
|
||||
const item = {
|
||||
id: makeId(),
|
||||
sessionId: session?.id ?? Number(data.sessionId) ?? null,
|
||||
title: data.title || '',
|
||||
description: data.description || '',
|
||||
session: session ? { id: session.id, title: session.title } : null,
|
||||
passScore: Number(data.passingScore ?? data.passScore) || 0,
|
||||
isActive: data.isActive ?? true,
|
||||
questions: [],
|
||||
// UI-only fallbacks for ExamItem / ExamDetailsModal.
|
||||
session: sessionSnapshot(session),
|
||||
sessionTitle: session?.title || '',
|
||||
courseTemplate: template ? { id: template.id, title: template.title } : null,
|
||||
courseTemplateTitle: template?.title || '',
|
||||
durationMinutes: Number(data.durationMinutes) || 0,
|
||||
passingScore: Number(data.passingScore) || 0,
|
||||
questionsCount: data.questions?.length || 0,
|
||||
randomize: !!data.randomize,
|
||||
endDate: data.endDate || '',
|
||||
startDate: isoNow(),
|
||||
course: courseSnapshot(course),
|
||||
courseTitle: course?.title || '',
|
||||
questionsCount: 0,
|
||||
createdAt: isoNow(),
|
||||
questions: data.questions || [],
|
||||
usedInTerms: [],
|
||||
}
|
||||
adminExams.unshift(item)
|
||||
return { data: item }
|
||||
return {
|
||||
success: true,
|
||||
message: 'Exam created.',
|
||||
data: item,
|
||||
}
|
||||
})
|
||||
|
||||
register('PUT', endpoints.updateExam, ({ params, data }) => {
|
||||
const session = adminSessions.find((s) => s.id === Number(data.sessionId))
|
||||
const template = session?.courseTemplate
|
||||
? adminCourseTemplates.find((c) => c.id === Number(session.courseTemplate.id))
|
||||
: null
|
||||
register('PATCH', endpoints.updateExam, ({ params, data }) => {
|
||||
const patch = {}
|
||||
if (data.title !== undefined) patch.title = data.title
|
||||
if (data.description !== undefined) patch.description = data.description
|
||||
if (data.passingScore !== undefined) patch.passScore = Number(data.passingScore) || 0
|
||||
if (data.passScore !== undefined) patch.passScore = Number(data.passScore) || 0
|
||||
if (data.isActive !== undefined) patch.isActive = !!data.isActive
|
||||
if (data.sessionId !== undefined) {
|
||||
const session = adminSessions.find((s) => s.id === Number(data.sessionId))
|
||||
const course = resolveCourseFromSession(session)
|
||||
patch.sessionId = session?.id ?? Number(data.sessionId) ?? null
|
||||
patch.session = sessionSnapshot(session)
|
||||
patch.sessionTitle = session?.title ?? ''
|
||||
patch.course = courseSnapshot(course)
|
||||
patch.courseTitle = course?.title ?? ''
|
||||
}
|
||||
return {
|
||||
data: updateById(adminExams, params.id, {
|
||||
title: data.title,
|
||||
description: data.description,
|
||||
session: session ? { id: session.id, title: session.title } : undefined,
|
||||
sessionTitle: session?.title,
|
||||
courseTemplate: template ? { id: template.id, title: template.title } : undefined,
|
||||
courseTemplateTitle: template?.title,
|
||||
durationMinutes: Number(data.durationMinutes) || 0,
|
||||
passingScore: Number(data.passingScore) || 0,
|
||||
questionsCount: data.questions?.length || 0,
|
||||
randomize: !!data.randomize,
|
||||
endDate: data.endDate,
|
||||
questions: data.questions || [],
|
||||
}),
|
||||
success: true,
|
||||
message: 'Exam updated.',
|
||||
data: updateById(adminExams, params.id, patch),
|
||||
}
|
||||
})
|
||||
|
||||
register('DELETE', endpoints.deleteExam, ({ params }) => {
|
||||
removeById(adminExams, params.id)
|
||||
return { data: { message: 'حذف موفق' } }
|
||||
return { success: true, message: 'Exam deleted.', data: null }
|
||||
})
|
||||
|
||||
// POST /exams/:examId/questions — atomic question + options create.
|
||||
register('POST', endpoints.addExamQuestion, ({ params, data }) => {
|
||||
const exam = findOrThrow(adminExams, params.examId)
|
||||
const questionId = makeId()
|
||||
const options = Array.isArray(data.options) ? data.options : []
|
||||
const question = {
|
||||
id: questionId,
|
||||
questionText: data.questionText || '',
|
||||
position: data.position ?? (exam.questions?.length ?? 0) + 1,
|
||||
options: options.map((opt, idx) => ({
|
||||
id: questionId * 100 + idx + 1,
|
||||
optionText: opt.optionText || '',
|
||||
isCorrect: !!opt.isCorrect,
|
||||
})),
|
||||
}
|
||||
exam.questions = [...(exam.questions || []), question]
|
||||
exam.questionsCount = exam.questions.length
|
||||
return {
|
||||
success: true,
|
||||
message: 'Question added.',
|
||||
data: question,
|
||||
}
|
||||
})
|
||||
|
||||
// POST /questions/:questionId/options — single option append.
|
||||
register('POST', endpoints.addQuestionOption, ({ params, data }) => {
|
||||
for (const exam of adminExams) {
|
||||
const question = (exam.questions || []).find((q) => String(q.id) === String(params.questionId))
|
||||
if (question) {
|
||||
const option = {
|
||||
id: makeId(),
|
||||
optionText: data.optionText || '',
|
||||
isCorrect: !!data.isCorrect,
|
||||
}
|
||||
question.options = [...(question.options || []), option]
|
||||
return {
|
||||
success: true,
|
||||
message: 'Option added.',
|
||||
data: option,
|
||||
}
|
||||
}
|
||||
}
|
||||
return { success: false, message: 'Question not found.', data: null }
|
||||
})
|
||||
|
||||
// FE-mock-only.
|
||||
register('GET', endpoints.getExamParticipants, ({ params, query }) => {
|
||||
const list = examParticipants.get(Number(params.examId)) || []
|
||||
return paginate(list, query)
|
||||
|
||||
Reference in New Issue
Block a user