146 lines
4.5 KiB
JavaScript
146 lines
4.5 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
const { verifyToken } = require('../middleware/auth');
|
|
const Review = require('../models/Review');
|
|
const Company = require('../models/Company');
|
|
|
|
// Функция для логирования с проверкой DEV переменной
|
|
const log = (message, data = '') => {
|
|
if (process.env.DEV === 'true') {
|
|
if (data) {
|
|
console.log(message, data);
|
|
} else {
|
|
console.log(message);
|
|
}
|
|
}
|
|
};
|
|
|
|
// Функция для пересчета рейтинга компании
|
|
const updateCompanyRating = async (companyId) => {
|
|
try {
|
|
const reviews = await Review.find({ companyId });
|
|
|
|
if (reviews.length === 0) {
|
|
await Company.findByIdAndUpdate(companyId, {
|
|
rating: 0,
|
|
reviews: 0,
|
|
updatedAt: new Date()
|
|
});
|
|
return;
|
|
}
|
|
|
|
const totalRating = reviews.reduce((sum, review) => sum + review.rating, 0);
|
|
const averageRating = totalRating / reviews.length;
|
|
|
|
await Company.findByIdAndUpdate(companyId, {
|
|
rating: averageRating,
|
|
reviews: reviews.length,
|
|
updatedAt: new Date()
|
|
});
|
|
|
|
log('[Reviews] Updated company rating:', companyId, 'New rating:', averageRating);
|
|
} catch (error) {
|
|
console.error('[Reviews] Error updating company rating:', error.message);
|
|
}
|
|
};
|
|
|
|
// GET /reviews/company/:companyId - получить отзывы компании
|
|
router.get('/company/:companyId', verifyToken, async (req, res) => {
|
|
try {
|
|
const { companyId } = req.params;
|
|
|
|
const companyReviews = await Review.find({ companyId })
|
|
.sort({ createdAt: -1 })
|
|
.exec();
|
|
|
|
log('[Reviews] Returned', companyReviews.length, 'reviews for company', companyId);
|
|
|
|
res.json(companyReviews);
|
|
} catch (error) {
|
|
console.error('[Reviews] Error fetching reviews:', error.message);
|
|
res.status(500).json({
|
|
error: 'Internal server error',
|
|
message: error.message,
|
|
});
|
|
}
|
|
});
|
|
|
|
// POST /reviews - создать новый отзыв
|
|
router.post('/', verifyToken, async (req, res) => {
|
|
try {
|
|
const { companyId, rating, comment } = req.body;
|
|
|
|
if (!companyId || !rating || !comment) {
|
|
return res.status(400).json({
|
|
error: 'Заполните все обязательные поля: компания, рейтинг и комментарий',
|
|
});
|
|
}
|
|
|
|
if (rating < 1 || rating > 5) {
|
|
return res.status(400).json({
|
|
error: 'Рейтинг должен быть от 1 до 5',
|
|
});
|
|
}
|
|
|
|
const trimmedComment = comment.trim();
|
|
if (trimmedComment.length < 10) {
|
|
return res.status(400).json({
|
|
error: 'Отзыв должен содержать минимум 10 символов',
|
|
});
|
|
}
|
|
|
|
if (trimmedComment.length > 1000) {
|
|
return res.status(400).json({
|
|
error: 'Отзыв не должен превышать 1000 символов',
|
|
});
|
|
}
|
|
|
|
// Получить данные пользователя из БД для актуальной информации
|
|
const User = require('../models/User');
|
|
const Company = require('../models/Company');
|
|
|
|
const user = await User.findById(req.userId);
|
|
const userCompany = user && user.companyId ? await Company.findById(user.companyId) : null;
|
|
|
|
if (!user) {
|
|
return res.status(404).json({
|
|
error: 'Пользователь не найден',
|
|
});
|
|
}
|
|
|
|
// Создать новый отзыв
|
|
const newReview = new Review({
|
|
companyId,
|
|
authorCompanyId: user.companyId || req.companyId,
|
|
authorName: user.firstName && user.lastName
|
|
? `${user.firstName} ${user.lastName}`
|
|
: req.user?.firstName && req.user?.lastName
|
|
? `${req.user.firstName} ${req.user.lastName}`
|
|
: 'Аноним',
|
|
authorCompany: userCompany?.fullName || userCompany?.shortName || req.user?.companyName || 'Компания',
|
|
rating: parseInt(rating),
|
|
comment: trimmedComment,
|
|
verified: true,
|
|
createdAt: new Date(),
|
|
updatedAt: new Date()
|
|
});
|
|
|
|
const savedReview = await newReview.save();
|
|
|
|
log('[Reviews] New review created:', savedReview._id);
|
|
|
|
// Пересчитываем рейтинг компании
|
|
await updateCompanyRating(companyId);
|
|
|
|
res.status(201).json(savedReview);
|
|
} catch (error) {
|
|
console.error('[Reviews] Error creating review:', error.message);
|
|
res.status(500).json({
|
|
error: 'Ошибка при сохранении отзыва',
|
|
message: error.message,
|
|
});
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|