118 lines
3.8 KiB
JavaScript
118 lines
3.8 KiB
JavaScript
const router = require('express').Router();
|
|
const { Expert } = require('../models');
|
|
|
|
// GET /api/experts - список экспертов
|
|
router.get('/', async (req, res) => {
|
|
try {
|
|
const { eventId } = req.query;
|
|
const filter = {};
|
|
if (eventId) filter.eventId = eventId;
|
|
const experts = await Expert.find(filter).sort({ createdAt: -1 });
|
|
res.json(experts);
|
|
} catch (error) {
|
|
res.status(500).json({ error: error.message });
|
|
}
|
|
});
|
|
|
|
// GET /api/experts/by-token/:token - получить данные эксперта по токену
|
|
router.get('/by-token/:token', async (req, res) => {
|
|
try {
|
|
const expert = await Expert.findOne({ token: req.params.token });
|
|
if (!expert) {
|
|
return res.status(404).json({ error: 'Expert not found' });
|
|
}
|
|
res.json(expert);
|
|
} catch (error) {
|
|
res.status(500).json({ error: error.message });
|
|
}
|
|
});
|
|
|
|
// GET /api/experts/:id - получить эксперта по ID
|
|
router.get('/:id', async (req, res) => {
|
|
try {
|
|
const expert = await Expert.findById(req.params.id);
|
|
if (!expert) {
|
|
return res.status(404).json({ error: 'Expert not found' });
|
|
}
|
|
res.json(expert);
|
|
} catch (error) {
|
|
res.status(500).json({ error: error.message });
|
|
}
|
|
});
|
|
|
|
// POST /api/experts - создать эксперта (с генерацией уникальной ссылки)
|
|
router.post('/', async (req, res) => {
|
|
try {
|
|
const { eventId, fullName } = req.body;
|
|
|
|
if (!eventId || !fullName) {
|
|
return res.status(400).json({ error: 'EventId and full name are required' });
|
|
}
|
|
|
|
// Создаем нового эксперта
|
|
const expert = new Expert({
|
|
eventId,
|
|
fullName
|
|
});
|
|
|
|
// Сохраняем эксперта (токен генерируется в pre-save хуке)
|
|
await expert.save();
|
|
|
|
// Формируем URL для QR кода ПОСЛЕ сохранения, когда токен уже сгенерирован
|
|
// Приоритеты:
|
|
// 1) Явная переменная окружения FRONTEND_BASE_URL (например, https://platform.brojs.ru)
|
|
// 2) Проксируемые заголовки x-forwarded-proto / x-forwarded-host
|
|
// 3) Локальные req.protocol + req.get('host')
|
|
const forwardedProto = req.get('x-forwarded-proto');
|
|
const forwardedHost = req.get('x-forwarded-host');
|
|
const protocol = forwardedProto || req.protocol;
|
|
const host = forwardedHost || req.get('host');
|
|
const baseUrl = process.env.FRONTEND_BASE_URL || `${protocol}://${host}`;
|
|
|
|
expert.qrCodeUrl = `${baseUrl}/assessment-tools/expert/${expert.token}`;
|
|
|
|
// Сохраняем еще раз с обновленным qrCodeUrl
|
|
await expert.save();
|
|
|
|
res.status(201).json(expert);
|
|
} catch (error) {
|
|
console.error('Error creating expert:', error);
|
|
res.status(500).json({ error: error.message });
|
|
}
|
|
});
|
|
|
|
// PUT /api/experts/:id - редактировать эксперта
|
|
router.put('/:id', async (req, res) => {
|
|
try {
|
|
const { fullName } = req.body;
|
|
|
|
const expert = await Expert.findById(req.params.id);
|
|
if (!expert) {
|
|
return res.status(404).json({ error: 'Expert not found' });
|
|
}
|
|
|
|
if (fullName !== undefined) expert.fullName = fullName;
|
|
|
|
await expert.save();
|
|
res.json(expert);
|
|
} catch (error) {
|
|
res.status(500).json({ error: error.message });
|
|
}
|
|
});
|
|
|
|
// DELETE /api/experts/:id - удалить эксперта
|
|
router.delete('/:id', async (req, res) => {
|
|
try {
|
|
const expert = await Expert.findByIdAndDelete(req.params.id);
|
|
if (!expert) {
|
|
return res.status(404).json({ error: 'Expert not found' });
|
|
}
|
|
res.json({ message: 'Expert deleted successfully', expert });
|
|
} catch (error) {
|
|
res.status(500).json({ error: error.message });
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|
|
|