diff --git a/backend/controllers/reportController.js b/backend/controllers/reportController.js index dfd7169..dd6a62e 100644 --- a/backend/controllers/reportController.js +++ b/backend/controllers/reportController.js @@ -108,22 +108,41 @@ const getReportById = async (req, res, next) => { try { const { id } = req.params; + // Валидация ObjectId + if (!id || !id.match(/^[0-9a-fA-F]{24}$/)) { + const error = new Error('Неверный ID жалобы'); + error.statusCode = 400; + return next(error); + } + + console.log(`[REPORT_CTRL] Поиск жалобы с ID: ${id}`); + const report = await Report.findById(id) .populate('reporter', 'name email photos') .populate('reportedUser', 'name email photos isActive') .populate('reviewedBy', 'name email'); if (!report) { + console.log(`[REPORT_CTRL] Жалоба с ID ${id} не найдена`); const error = new Error('Жалоба не найдена'); error.statusCode = 404; return next(error); } - // Преобразуем adminComment в adminNotes для фронтенда + console.log(`[REPORT_CTRL] Жалоба найдена: ${report._id}, статус: ${report.status}`); + + // Преобразуем поля для совместимости с фронтендом const reportResponse = report.toObject(); + + // Преобразуем adminComment в adminNotes if (reportResponse.adminComment) { reportResponse.adminNotes = reportResponse.adminComment; } + + // Преобразуем reviewedAt в resolvedAt + if (reportResponse.reviewedAt) { + reportResponse.resolvedAt = reportResponse.reviewedAt; + } res.json(reportResponse); @@ -142,8 +161,26 @@ const updateReportStatus = async (req, res, next) => { const { status, adminNotes } = req.body; const adminId = req.user._id; + // Валидация ObjectId + if (!id || !id.match(/^[0-9a-fA-F]{24}$/)) { + const error = new Error('Неверный ID жалобы'); + error.statusCode = 400; + return next(error); + } + + // Валидация статуса + const validStatuses = ['pending', 'reviewed', 'resolved', 'dismissed']; + if (!status || !validStatuses.includes(status)) { + const error = new Error('Неверный статус жалобы'); + error.statusCode = 400; + return next(error); + } + + console.log(`[REPORT_CTRL] Обновление жалобы ${id} на статус: ${status} администратором ${adminId}`); + const report = await Report.findById(id); if (!report) { + console.log(`[REPORT_CTRL] Жалоба с ID ${id} не найдена для обновления`); const error = new Error('Жалоба не найдена'); error.statusCode = 404; return next(error); @@ -163,7 +200,7 @@ const updateReportStatus = async (req, res, next) => { await report.save(); - console.log(`[REPORT_CTRL] Жалоба ${id} обновлена администратором ${adminId}, статус: ${status}`); + console.log(`[REPORT_CTRL] Жалоба ${id} успешно обновлена администратором ${adminId}, новый статус: ${status}`); // Возвращаем обновленную жалобу с заполненными связями const updatedReport = await Report.findById(id) @@ -171,11 +208,18 @@ const updateReportStatus = async (req, res, next) => { .populate('reportedUser', 'name email isActive') .populate('reviewedBy', 'name email'); - // Преобразуем adminComment в adminNotes для фронтенда + // Преобразуем поля для совместимости с фронтендом const reportResponse = updatedReport.toObject(); + + // Преобразуем adminComment в adminNotes if (reportResponse.adminComment) { reportResponse.adminNotes = reportResponse.adminComment; } + + // Преобразуем reviewedAt в resolvedAt + if (reportResponse.reviewedAt) { + reportResponse.resolvedAt = reportResponse.reviewedAt; + } res.json(reportResponse); diff --git a/src/views/admin/AdminReportDetail.vue b/src/views/admin/AdminReportDetail.vue index 13ae11c..5572c8e 100644 --- a/src/views/admin/AdminReportDetail.vue +++ b/src/views/admin/AdminReportDetail.vue @@ -136,7 +136,7 @@