Files
mercado.clube67.com/backend/controllers/groupChatController.js
T

141 lines
4.5 KiB
JavaScript

'use strict'
const GroupChat = require('../models/GroupChat')
const { sseSend } = require('../services/sse')
function extractAuth(req) {
const accountId = req.teamAccount?.accountId || req.admin?.id || null
const tenantId = req.tenantId || req.teamAccount?.tenantId || req.admin?.tenant_id || null
return { accountId, tenantId }
}
class GroupChatController {
/**
* GET /api/admin/inbox/groups
* Lista grupos do colaborador (via team_members) ou todos (owner/manager)
*/
async list(req, res) {
try {
const { accountId, tenantId } = extractAuth(req)
if (!tenantId) return res.status(401).json({ error: 'Não autenticado' })
const role = req.admin?.role || req.teamAccount?.role
const isManager = role === 'owner' || role === 'manager'
const groups = isManager
? await GroupChat.listAll(tenantId, accountId)
: await GroupChat.listForAccount(tenantId, accountId)
res.json(groups)
} catch (err) {
console.error('[groupChat.list]', err.message)
res.status(500).json({ error: 'Erro ao listar grupos' })
}
}
/**
* GET /api/admin/inbox/groups/:id/messages
* Histórico de mensagens de um grupo
*/
async getMessages(req, res) {
try {
const { tenantId } = extractAuth(req)
if (!tenantId) return res.status(401).json({ error: 'Não autenticado' })
const groupChatId = Number(req.params.id)
const limit = Math.min(Number(req.query.limit) || 50, 200)
const before = req.query.before || null
const group = await GroupChat.findById(tenantId, groupChatId)
if (!group) return res.status(404).json({ error: 'Grupo não encontrado' })
const msgs = await GroupChat.getMessages(tenantId, groupChatId, limit, before)
res.json(msgs)
} catch (err) {
console.error('[groupChat.getMessages]', err.message)
res.status(500).json({ error: 'Erro ao buscar mensagens' })
}
}
/**
* POST /api/admin/inbox/groups/:id/message
* Enviar mensagem em um grupo
*/
async sendMessage(req, res) {
try {
const { accountId, tenantId } = extractAuth(req)
if (!accountId || !tenantId) return res.status(401).json({ error: 'Não autenticado' })
const groupChatId = Number(req.params.id)
const { content } = req.body
if (!content?.trim()) return res.status(400).json({ error: 'content obrigatório' })
const group = await GroupChat.findById(tenantId, groupChatId)
if (!group) return res.status(404).json({ error: 'Grupo não encontrado' })
const msg = await GroupChat.sendMessage(tenantId, groupChatId, accountId, content.trim())
res.json(msg)
// Notificar membros do grupo via SSE (exceto o remetente)
const memberIds = await GroupChat.getMemberIds(groupChatId)
const payload = {
id: msg.id,
group_chat_id: groupChatId,
group_name: group.name,
from: accountId,
content: content.trim(),
created_at: msg.created_at,
}
for (const memberId of memberIds) {
if (memberId !== accountId) {
sseSend(memberId, 'group_message.new', payload)
}
}
} catch (err) {
console.error('[groupChat.sendMessage]', err.message)
res.status(500).json({ error: 'Erro ao enviar mensagem' })
}
}
/**
* GET /api/admin/inbox/groups/:id/members
* Listar membros de um grupo
*/
async getMembers(req, res) {
try {
const { tenantId } = extractAuth(req)
if (!tenantId) return res.status(401).json({ error: 'Não autenticado' })
const groupChatId = Number(req.params.id)
const group = await GroupChat.findById(tenantId, groupChatId)
if (!group) return res.status(404).json({ error: 'Grupo não encontrado' })
const members = await GroupChat.getMembers(tenantId, groupChatId)
res.json(members)
} catch (err) {
console.error('[groupChat.getMembers]', err.message)
res.status(500).json({ error: 'Erro ao buscar membros' })
}
}
/**
* POST /api/admin/inbox/groups/:id/read
* Marcar grupo como lido
*/
async markRead(req, res) {
try {
const { accountId } = extractAuth(req)
if (!accountId) return res.status(401).json({ error: 'Não autenticado' })
await GroupChat.markRead(accountId, Number(req.params.id))
res.json({ ok: true })
} catch (err) {
console.error('[groupChat.markRead]', err.message)
res.status(500).json({ error: 'Erro ao marcar como lido' })
}
}
}
module.exports = new GroupChatController()