43 lines
2.5 KiB
JavaScript
43 lines
2.5 KiB
JavaScript
'use strict';
|
|
/* ──────────────────────────────────────────────────────────────────
|
|
Exam Preparation Module — API wrappers
|
|
Thin LS.api wrappers under window.EP.api.*
|
|
────────────────────────────────────────────────────────────────── */
|
|
|
|
(function () {
|
|
const base = (examKey) => `/api/exam-prep/${encodeURIComponent(examKey)}`;
|
|
|
|
const api = {
|
|
/* Track registry / metadata */
|
|
listTracks: () => LS.api('/api/exam-prep/tracks'),
|
|
getInfo: (examKey) => LS.api(`${base(examKey)}/info`),
|
|
|
|
/* Future endpoints (F2-F10) — placeholders so calling code can be written
|
|
against the final shape. Wire them up as routes ship. */
|
|
listVariants: (examKey) => LS.api(`${base(examKey)}/variants`),
|
|
getVariant: (examKey, n) => LS.api(`${base(examKey)}/variants/${n}/tasks`),
|
|
listTopics: (examKey) => LS.api(`${base(examKey)}/topics`),
|
|
getTopicTasks:(examKey, slug, query) => LS.api(`${base(examKey)}/topics/${encodeURIComponent(slug)}/tasks${qs(query)}`),
|
|
getPracticeNext: (examKey, query) => LS.api(`${base(examKey)}/practice/next${qs(query)}`),
|
|
getDashboard: (examKey) => LS.api(`${base(examKey)}/dashboard`),
|
|
getPlan: (examKey) => LS.api(`${base(examKey)}/plan`),
|
|
savePlan: (examKey, body) => LS.api(`${base(examKey)}/plan`, { method: 'PUT', body }),
|
|
saveAttempt: (body) => LS.api(`/api/exam-prep/attempts`, { method: 'POST', body }),
|
|
startMock: (examKey, body) => LS.api(`${base(examKey)}/mock/start`, { method: 'POST', body }),
|
|
mockAnswer: (mockId, body) => LS.api(`/api/exam-prep/mock/${mockId}/answer`, { method: 'POST', body }),
|
|
mockFinish: (mockId) => LS.api(`/api/exam-prep/mock/${mockId}/finish`, { method: 'POST' }),
|
|
mockResult: (mockId) => LS.api(`/api/exam-prep/mock/${mockId}/result`),
|
|
};
|
|
|
|
function qs(obj) {
|
|
if (!obj || typeof obj !== 'object') return '';
|
|
const parts = Object.entries(obj)
|
|
.filter(([, v]) => v !== undefined && v !== null && v !== '')
|
|
.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`);
|
|
return parts.length ? `?${parts.join('&')}` : '';
|
|
}
|
|
|
|
window.EP = window.EP || {};
|
|
window.EP.api = api;
|
|
})();
|