diff --git a/backend/controllers/userController.js b/backend/controllers/userController.js index 7e955c9..b10e5b1 100644 --- a/backend/controllers/userController.js +++ b/backend/controllers/userController.js @@ -393,11 +393,69 @@ const getUserById = async (req, res, next) => { } }; +// @desc Получить статистику пользователя для главной страницы +// @route GET /api/users/stats +// @access Private +const getUserStats = async (req, res, next) => { + try { + const currentUserId = req.user._id; + + // 1. Получаем количество лайков (кто лайкнул текущего пользователя) + const likesCount = await User.countDocuments({ + liked: currentUserId + }); + + // 2. Получаем количество совпадений (matches) + const matchesCount = await User.findById(currentUserId) + .select('matches') + .then(user => user?.matches?.length || 0); + + // 3. Получаем количество непрочитанных сообщений + const Conversation = require('../models/Conversation'); + const Message = require('../models/Message'); + + // Находим все диалоги пользователя + const userConversations = await Conversation.find({ + participants: currentUserId + }).select('_id'); + + const conversationIds = userConversations.map(conv => conv._id); + + // Считаем непрочитанные сообщения в этих диалогах + const unreadMessagesCount = await Message.countDocuments({ + conversationId: { $in: conversationIds }, + sender: { $ne: currentUserId }, // Сообщения от других пользователей + readBy: { $ne: currentUserId } // Которые текущий пользователь не читал + }); + + // 4. Для просмотров профиля пока возвращаем заглушку, + // так как у нас нет модели для отслеживания просмотров + // В будущем можно добавить отдельную коллекцию ProfileViews + const profileViewsCount = 0; // TODO: Реализовать отслеживание просмотров + + const stats = { + profileViews: profileViewsCount, + likes: likesCount, + matches: matchesCount, + unreadMessages: unreadMessagesCount + }; + + console.log(`[USER_CTRL] Статистика пользователя ${currentUserId}:`, stats); + + res.status(200).json(stats); + + } catch (error) { + console.error('[USER_CTRL] Ошибка при получении статистики пользователя:', error.message); + next(error); + } +}; + module.exports = { updateUserProfile, getUsersForSwiping, uploadUserProfilePhoto, - setMainPhoto, // <--- Добавлено - deletePhoto, // <--- Добавлено - getUserById, // <--- Добавлено + setMainPhoto, + deletePhoto, + getUserById, + getUserStats, // <--- Добавляем новую функцию }; \ No newline at end of file diff --git a/backend/routes/userRoutes.js b/backend/routes/userRoutes.js index c23051c..9dc29d7 100644 --- a/backend/routes/userRoutes.js +++ b/backend/routes/userRoutes.js @@ -1,6 +1,6 @@ const express = require('express'); const router = express.Router(); -const { updateUserProfile, getUsersForSwiping, uploadUserProfilePhoto, setMainPhoto, deletePhoto, getUserById } = require('../controllers/userController'); +const { updateUserProfile, getUsersForSwiping, uploadUserProfilePhoto, setMainPhoto, deletePhoto, getUserById, getUserStats } = require('../controllers/userController'); const { protect } = require('../middleware/authMiddleware'); // Нам нужен protect для защиты маршрута const multer = require('multer'); // 1. Импортируем multer const path = require('path'); // Может понадобиться для фильтрации файлов @@ -36,6 +36,10 @@ const upload = multer({ router.put('/profile', protect, updateUserProfile); router.get('/suggestions', protect, getUsersForSwiping); // <--- НОВЫЙ МАРШРУТ +// Маршрут для получения статистики пользователя +// GET /api/users/stats +router.get('/stats', protect, getUserStats); // <--- НОВЫЙ МАРШРУТ + // Маршрут для загрузки фотографии профиля // POST /api/users/profile/photo router.post('/profile/photo', protect, upload.single('profilePhoto'), uploadUserProfilePhoto); diff --git a/src/services/api.js b/src/services/api.js index 99fa792..9a7dcaa 100644 --- a/src/services/api.js +++ b/src/services/api.js @@ -111,5 +111,10 @@ export default { // Новый метод для получения профиля пользователя по ID getUserById(userId) { return apiClient.get(`/users/${userId}`); + }, + + // Новый метод для получения статистики пользователя + getUserStats() { + return apiClient.get('/users/stats'); } }; \ No newline at end of file diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 6324436..1be8ef4 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -104,7 +104,7 @@
Просмотров профиля
Лайков
Новых сообщения