const express = require('express'); const { Message, User } = require('../models'); const { authenticateToken } = require('../middleware/auth'); const router = express.Router(); // Get all messages for the current user (inbox) router.get('/', authenticateToken, async (req, res) => { try { const messages = await Message.findAll({ where: { receiverId: req.user.id }, include: [ { model: User, as: 'sender', attributes: ['id', 'firstName', 'lastName', 'profileImage'] } ], order: [['createdAt', 'DESC']] }); res.json(messages); } catch (error) { res.status(500).json({ error: error.message }); } }); // Get sent messages router.get('/sent', authenticateToken, async (req, res) => { try { const messages = await Message.findAll({ where: { senderId: req.user.id }, include: [ { model: User, as: 'receiver', attributes: ['id', 'firstName', 'lastName', 'profileImage'] } ], order: [['createdAt', 'DESC']] }); res.json(messages); } catch (error) { res.status(500).json({ error: error.message }); } }); // Get a single message with replies router.get('/:id', authenticateToken, async (req, res) => { try { const message = await Message.findOne({ where: { id: req.params.id, [require('sequelize').Op.or]: [ { senderId: req.user.id }, { receiverId: req.user.id } ] }, include: [ { model: User, as: 'sender', attributes: ['id', 'firstName', 'lastName', 'profileImage'] }, { model: User, as: 'receiver', attributes: ['id', 'firstName', 'lastName', 'profileImage'] }, { model: Message, as: 'replies', include: [{ model: User, as: 'sender', attributes: ['id', 'firstName', 'lastName', 'profileImage'] }] } ] }); if (!message) { return res.status(404).json({ error: 'Message not found' }); } // Mark as read if user is the receiver if (message.receiverId === req.user.id && !message.isRead) { await message.update({ isRead: true }); } res.json(message); } catch (error) { res.status(500).json({ error: error.message }); } }); // Send a new message router.post('/', authenticateToken, async (req, res) => { try { const { receiverId, subject, content, parentMessageId } = req.body; // Check if receiver exists const receiver = await User.findByPk(receiverId); if (!receiver) { return res.status(404).json({ error: 'Receiver not found' }); } // Prevent sending messages to self if (receiverId === req.user.id) { return res.status(400).json({ error: 'Cannot send messages to yourself' }); } const message = await Message.create({ senderId: req.user.id, receiverId, subject, content, parentMessageId }); const messageWithSender = await Message.findByPk(message.id, { include: [{ model: User, as: 'sender', attributes: ['id', 'firstName', 'lastName', 'profileImage'] }] }); res.status(201).json(messageWithSender); } catch (error) { res.status(500).json({ error: error.message }); } }); // Mark message as read router.put('/:id/read', authenticateToken, async (req, res) => { try { const message = await Message.findOne({ where: { id: req.params.id, receiverId: req.user.id } }); if (!message) { return res.status(404).json({ error: 'Message not found' }); } await message.update({ isRead: true }); res.json(message); } catch (error) { res.status(500).json({ error: error.message }); } }); // Get unread message count router.get('/unread/count', authenticateToken, async (req, res) => { try { const count = await Message.count({ where: { receiverId: req.user.id, isRead: false } }); res.json({ count }); } catch (error) { res.status(500).json({ error: error.message }); } }); module.exports = router;