From c04306a8712a7e269add54a8c081d3725a8a2d34 Mon Sep 17 00:00:00 2001 From: Professional Date: Mon, 26 May 2025 00:57:20 +0700 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/controllers/reportController.js | 55 +-- src/router/index.js | 13 + src/views/admin/AdminDashboard.vue | 9 + src/views/admin/AdminReportDetail.vue | 627 ++++++++++++++++++++++++ src/views/admin/AdminReports.vue | 488 ++++++++++++++++++ 5 files changed, 1162 insertions(+), 30 deletions(-) create mode 100644 src/views/admin/AdminReportDetail.vue create mode 100644 src/views/admin/AdminReports.vue diff --git a/backend/controllers/reportController.js b/backend/controllers/reportController.js index 0c2d557..dfd7169 100644 --- a/backend/controllers/reportController.js +++ b/backend/controllers/reportController.js @@ -119,7 +119,13 @@ const getReportById = async (req, res, next) => { return next(error); } - res.json(report); + // Преобразуем adminComment в adminNotes для фронтенда + const reportResponse = report.toObject(); + if (reportResponse.adminComment) { + reportResponse.adminNotes = reportResponse.adminComment; + } + + res.json(reportResponse); } catch (error) { console.error('[REPORT_CTRL] Ошибка при получении деталей жалобы:', error.message); @@ -133,7 +139,7 @@ const getReportById = async (req, res, next) => { const updateReportStatus = async (req, res, next) => { try { const { id } = req.params; - const { status, adminComment, actionTaken } = req.body; + const { status, adminNotes } = req.body; const adminId = req.user._id; const report = await Report.findById(id); @@ -146,43 +152,32 @@ const updateReportStatus = async (req, res, next) => { // Обновляем жалобу report.status = status; report.reviewedBy = adminId; - report.reviewedAt = new Date(); - if (adminComment) { - report.adminComment = adminComment; + if (status === 'resolved' || status === 'dismissed') { + report.reviewedAt = new Date(); } - if (actionTaken) { - report.actionTaken = actionTaken; + if (adminNotes) { + report.adminComment = adminNotes; // В модели поле называется adminComment } await report.save(); - // Если было предпринято действие, применяем его к пользователю - if (actionTaken && actionTaken !== 'none') { - const reportedUser = await User.findById(report.reportedUser); - if (reportedUser) { - switch (actionTaken) { - case 'temporary_ban': - case 'permanent_ban': - case 'profile_removal': - reportedUser.isActive = false; - await reportedUser.save(); - console.log(`[REPORT_CTRL] Пользователь ${reportedUser._id} заблокирован по жалобе ${id}`); - break; - } - } + console.log(`[REPORT_CTRL] Жалоба ${id} обновлена администратором ${adminId}, статус: ${status}`); + + // Возвращаем обновленную жалобу с заполненными связями + const updatedReport = await Report.findById(id) + .populate('reporter', 'name email') + .populate('reportedUser', 'name email isActive') + .populate('reviewedBy', 'name email'); + + // Преобразуем adminComment в adminNotes для фронтенда + const reportResponse = updatedReport.toObject(); + if (reportResponse.adminComment) { + reportResponse.adminNotes = reportResponse.adminComment; } - console.log(`[REPORT_CTRL] Жалоба ${id} обновлена администратором ${adminId}`); - - res.json({ - message: 'Жалоба успешно обновлена', - report: await Report.findById(id) - .populate('reporter', 'name email') - .populate('reportedUser', 'name email isActive') - .populate('reviewedBy', 'name email') - }); + res.json(reportResponse); } catch (error) { console.error('[REPORT_CTRL] Ошибка при обновлении жалобы:', error.message); diff --git a/src/router/index.js b/src/router/index.js index c9811df..aa98b8d 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -96,6 +96,19 @@ const routes = [ name: 'AdminStatistics', component: () => import('../views/admin/AdminStatistics.vue'), meta: { requiresAuth: true, requiresAdmin: true } + }, + { + path: 'reports', + name: 'AdminReports', + component: () => import('../views/admin/AdminReports.vue'), + meta: { requiresAuth: true, requiresAdmin: true } + }, + { + path: 'reports/:id', + name: 'AdminReportDetail', + component: () => import('../views/admin/AdminReportDetail.vue'), + meta: { requiresAuth: true, requiresAdmin: true }, + props: true } ] } diff --git a/src/views/admin/AdminDashboard.vue b/src/views/admin/AdminDashboard.vue index 12f8e00..9f6becc 100644 --- a/src/views/admin/AdminDashboard.vue +++ b/src/views/admin/AdminDashboard.vue @@ -23,6 +23,9 @@ Диалоги + + Жалобы + Статистика @@ -48,6 +51,12 @@ Диалоги + + + Жалобы +