212 lines
7.6 KiB
JavaScript
212 lines
7.6 KiB
JavaScript
const router = require('express').Router()
|
||
const fs = require('node:fs')
|
||
const path = require('node:path')
|
||
|
||
// Функция для чтения JSON файла и случайной модификации содержимого
|
||
function readAndModifyJson(filePath) {
|
||
try {
|
||
// Используем fs.readFileSync вместо require для избежания кэширования
|
||
const fullPath = path.resolve(__dirname, filePath);
|
||
const fileContent = fs.readFileSync(fullPath, 'utf8');
|
||
const jsonContent = JSON.parse(fileContent);
|
||
|
||
// Если это список учеников, немного перемешаем их
|
||
if (jsonContent.body && Array.isArray(jsonContent.body.students)) {
|
||
jsonContent.body.students.sort(() => 0.5 - Math.random());
|
||
}
|
||
|
||
// Если это список реакций, обновим время создания и слегка перемешаем
|
||
if (jsonContent.body && Array.isArray(jsonContent.body.reactions)) {
|
||
const now = Date.now();
|
||
jsonContent.body.reactions.forEach((reaction, index) => {
|
||
// Интервал от 10 секунд до 2 минут назад
|
||
const randomTime = now - Math.floor(Math.random() * (120000 - 10000) + 10000);
|
||
reaction.created = new Date(randomTime).toISOString();
|
||
});
|
||
|
||
// Сортируем реакции по времени создания (новые сверху)
|
||
jsonContent.body.reactions.sort((a, b) =>
|
||
new Date(b.created) - new Date(a.created)
|
||
);
|
||
}
|
||
|
||
// Если это список уроков, обновим даты
|
||
if (jsonContent.body && Array.isArray(jsonContent.body) && jsonContent.body[0] && jsonContent.body[0].name) {
|
||
jsonContent.body.forEach((lesson) => {
|
||
// Случайная дата в пределах последних 3 месяцев
|
||
const randomDate = new Date();
|
||
randomDate.setMonth(randomDate.getMonth() - Math.random() * 3);
|
||
lesson.date = randomDate.toISOString();
|
||
lesson.created = new Date(randomDate.getTime() - 86400000).toISOString(); // Создан за день до даты
|
||
});
|
||
}
|
||
|
||
// Если это список курсов, добавим случайные данные
|
||
if (jsonContent.body && Array.isArray(jsonContent.body) && jsonContent.body[0] && jsonContent.body[0].id) {
|
||
jsonContent.body.forEach((course) => {
|
||
course.startDt = new Date(new Date().getTime() - Math.random() * 31536000000).toISOString(); // В пределах года
|
||
course.created = new Date(new Date(course.startDt).getTime() - 604800000).toISOString(); // Создан за неделю до начала
|
||
});
|
||
}
|
||
|
||
return jsonContent;
|
||
} catch (error) {
|
||
console.error(`Error reading/modifying file ${filePath}:`, error);
|
||
return { success: false, error: "Failed to read file" };
|
||
}
|
||
}
|
||
|
||
// Функция для чтения JSON без модификации
|
||
function readJsonFile(filePath) {
|
||
try {
|
||
const fullPath = path.resolve(__dirname, filePath);
|
||
const fileContent = fs.readFileSync(fullPath, 'utf8');
|
||
return JSON.parse(fileContent);
|
||
} catch (error) {
|
||
console.error(`Error reading file ${filePath}:`, error);
|
||
return { success: false, error: "Failed to read file" };
|
||
}
|
||
}
|
||
|
||
const timer =
|
||
(time = 1000) =>
|
||
(_req, _res, next) =>
|
||
setTimeout(next, time)
|
||
|
||
// Небольшая задержка для имитации реальной сети
|
||
router.use(timer(100));
|
||
|
||
const config = {
|
||
examCreated: false
|
||
}
|
||
|
||
router.get('/course/list', (req, res) => {
|
||
const modifiedData = readAndModifyJson('../mocks/courses/list/success.json');
|
||
res.send(modifiedData);
|
||
})
|
||
|
||
router.get('/course/:id', (req, res) => {
|
||
if(req.params.id === 'undefined')
|
||
return res.status(400).send({ success: false, error: 'Invalid course id' })
|
||
|
||
if (config.examCreated) {
|
||
config.examCreated = false;
|
||
const modifiedData = readAndModifyJson('../mocks/courses/by-id/with-exam.json');
|
||
return res.send(modifiedData);
|
||
}
|
||
|
||
const modifiedData = readAndModifyJson('../mocks/courses/by-id/success.json');
|
||
res.send(modifiedData);
|
||
})
|
||
|
||
router.get('/course/students/:courseId', (req, res) => {
|
||
const modifiedData = readAndModifyJson('../mocks/courses/all-students/success.json');
|
||
res.send(modifiedData);
|
||
})
|
||
|
||
router.post('/course', (req, res) => {
|
||
const baseData = readJsonFile('../mocks/courses/create/success.json');
|
||
|
||
// Добавляем данные из запроса
|
||
if (baseData.body) {
|
||
baseData.body.name = req.body.name || baseData.body.name;
|
||
baseData.body.created = new Date().toISOString();
|
||
}
|
||
|
||
res.send(baseData);
|
||
})
|
||
|
||
router.post('/course/toggle-exam-with-jury/:id', (req, res) => {
|
||
config.examCreated = true;
|
||
res.send({ success: true })
|
||
})
|
||
|
||
router.get('/lesson/list/:courseId', (req, res) => {
|
||
const modifiedData = readAndModifyJson('../mocks/lessons/list/success.json');
|
||
res.send(modifiedData);
|
||
})
|
||
|
||
router.get('/lesson/:courseId/ai/generate-lessons', timer(3000), (req, res) => {
|
||
const modifiedData = readAndModifyJson('../mocks/lessons/generate/success.json');
|
||
res.send(modifiedData);
|
||
})
|
||
|
||
router.post('/lesson', (req, res) => {
|
||
const baseData = readJsonFile('../mocks/lessons/create/success.json');
|
||
|
||
// Добавляем данные из запроса
|
||
if (baseData.body) {
|
||
baseData.body.name = req.body.name || baseData.body.name;
|
||
baseData.body.date = req.body.date || new Date().toISOString();
|
||
baseData.body.created = new Date().toISOString();
|
||
}
|
||
|
||
res.send(baseData);
|
||
})
|
||
|
||
router.post('/lesson/access-code', (req, res) => {
|
||
const modifiedData = readAndModifyJson('../mocks/lessons/access-code/create/success.json');
|
||
|
||
// Обновляем дату истечения через час от текущего времени
|
||
if (modifiedData.body) {
|
||
modifiedData.body.expires = new Date(Date.now() + 60 * 60 * 1000).toISOString();
|
||
modifiedData.body.created = new Date().toISOString();
|
||
}
|
||
|
||
res.send(modifiedData);
|
||
})
|
||
|
||
router.get('/lesson/access-code/:accessCode', (req, res) => {
|
||
const modifiedData = readAndModifyJson('../mocks/lessons/access-code/get/success.json');
|
||
|
||
// Обновляем дату истечения через час от текущего времени
|
||
if (modifiedData.body && modifiedData.body.accessCode) {
|
||
modifiedData.body.accessCode.expires = new Date(Date.now() + 60 * 60 * 1000).toISOString();
|
||
modifiedData.body.accessCode.created = new Date().toISOString();
|
||
}
|
||
|
||
res.send(modifiedData);
|
||
})
|
||
|
||
router.get('/lesson/:lessonId', (req, res) => {
|
||
const modifiedData = readAndModifyJson('../mocks/lessons/byid/success.json');
|
||
|
||
// Обновляем даты
|
||
if (modifiedData.body) {
|
||
modifiedData.body.date = new Date().toISOString();
|
||
modifiedData.body.created = new Date(Date.now() - 86400000).toISOString(); // Создан день назад
|
||
}
|
||
|
||
res.send(modifiedData);
|
||
})
|
||
|
||
router.delete('/lesson/:lessonId', (req, res) => {
|
||
res.send({ success: true, body: { ok: true }})
|
||
})
|
||
|
||
router.put('/lesson', (req, res) => {
|
||
res.send({ success: true, body: req.body })
|
||
})
|
||
|
||
router.post('/lesson/reaction/:lessonId', (req, res) => {
|
||
// Simulate processing a new reaction
|
||
const { reaction } = req.body;
|
||
const lessonId = req.params.lessonId;
|
||
|
||
// Log the reaction for debugging
|
||
console.log(`Received reaction "${reaction}" for lesson ${lessonId}`);
|
||
|
||
// Return success response
|
||
res.send({
|
||
success: true,
|
||
body: {
|
||
_id: `r-${Date.now()}-${Math.floor(Math.random() * 1000)}`,
|
||
reaction,
|
||
lessonId,
|
||
created: new Date().toISOString()
|
||
}
|
||
});
|
||
});
|
||
|
||
module.exports = router
|