backlinks-api / src /controllers /messages.js
Abhises's picture
added role for the user and notification form the admin to the user
3d52d95
Raw History Blame Contribute Delete
3.09 kB
const prisma = require('../lib/prisma');
const wsManager = require('../lib/ws');
const sendMessage = async (req, res) => {
const { threadId, messageText } = req.body;
if (!threadId || !messageText) {
return res.status(400).json({ error: 'threadId and messageText are required' });
}
try {
const member = await prisma.teamMember.findFirst({
where: { userId: req.user.userId },
});
if (!member) return res.status(404).json({ error: 'No workspace found' });
const thread = await prisma.exchangeThread.findUnique({
where: { id: threadId },
include: { giverWorkspace: true, receiverWorkspace: true }
});
if (!thread) return res.status(404).json({ error: 'Thread not found' });
if (thread.status === 'REJECTED') {
return res.status(403).json({ error: 'This connection was rejected. You cannot send messages.' });
}
if (thread.giverWorkspaceId !== member.workspaceId && thread.receiverWorkspaceId !== member.workspaceId) {
return res.status(403).json({ error: 'Access denied' });
}
const message = await prisma.chatMessage.create({
data: {
threadId,
senderUserId: req.user.userId,
messageText,
},
include: {
sender: { select: { id: true, name: true, email: true } },
},
});
wsManager.broadcastToThread(threadId, message);
const recipientWorkspaceId = thread.giverWorkspaceId === member.workspaceId ? thread.receiverWorkspaceId : thread.giverWorkspaceId;
const senderWorkspace = thread.giverWorkspaceId === member.workspaceId ? thread.giverWorkspace : thread.receiverWorkspace;
wsManager.sendNotification(recipientWorkspaceId, {
type: 'new_message',
threadId,
messageId: message.id,
senderName: req.user.name || 'Partner',
senderWorkspaceDomain: senderWorkspace?.domain || 'Partner',
messageText: message.messageText
});
res.status(201).json({ message });
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Server error' });
}
};
const getMessages = async (req, res) => {
try {
const member = await prisma.teamMember.findFirst({
where: { userId: req.user.userId },
});
if (!member) return res.status(404).json({ error: 'No workspace found' });
const thread = await prisma.exchangeThread.findUnique({ where: { id: req.params.threadId } });
if (!thread) return res.status(404).json({ error: 'Thread not found' });
if (thread.giverWorkspaceId !== member.workspaceId && thread.receiverWorkspaceId !== member.workspaceId) {
return res.status(403).json({ error: 'Access denied' });
}
const messages = await prisma.chatMessage.findMany({
where: { threadId: req.params.threadId },
orderBy: { timestamp: 'asc' },
include: {
sender: { select: { id: true, name: true, email: true } },
},
});
res.json({ messages });
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Server error' });
}
};
module.exports = {
sendMessage,
getMessages,
};