141 lines
4.5 KiB
JavaScript
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()
|