journal.pl/stubs/api/index.js
2025-03-25 19:23:01 +03:00

212 lines
7.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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