84 lines
2.7 KiB
JavaScript
84 lines
2.7 KiB
JavaScript
'use strict'
|
|
|
|
const Broadcast = require('../models/Broadcast')
|
|
const { sseBroadcastTenant } = 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
|
|
const role = req.admin?.role || req.teamAccount?.role || null
|
|
return { accountId, tenantId, role }
|
|
}
|
|
|
|
class BroadcastController {
|
|
/**
|
|
* POST /api/admin/inbox/broadcast
|
|
* Enviar broadcast para todos os colaboradores do tenant.
|
|
* Restrito a owner e manager.
|
|
*/
|
|
async send(req, res) {
|
|
try {
|
|
const { accountId, tenantId, role } = extractAuth(req)
|
|
|
|
if (!accountId || !tenantId) return res.status(401).json({ error: 'Não autenticado' })
|
|
if (role !== 'owner' && role !== 'manager') {
|
|
return res.status(403).json({ error: 'Apenas owner ou manager podem enviar broadcasts' })
|
|
}
|
|
|
|
const { content } = req.body
|
|
if (!content?.trim()) return res.status(400).json({ error: 'content obrigatório' })
|
|
|
|
const bc = await Broadcast.send(tenantId, accountId, content.trim())
|
|
res.json(bc)
|
|
|
|
sseBroadcastTenant(tenantId, 'broadcast.sent', {
|
|
id: bc.id,
|
|
from: accountId,
|
|
content: content.trim(),
|
|
created_at: bc.created_at,
|
|
})
|
|
} catch (err) {
|
|
console.error('[broadcast.send]', err.message)
|
|
res.status(500).json({ error: 'Erro ao enviar broadcast' })
|
|
}
|
|
}
|
|
|
|
/**
|
|
* GET /api/admin/inbox/broadcasts
|
|
* Histórico de broadcasts + unread_count do colaborador
|
|
*/
|
|
async list(req, res) {
|
|
try {
|
|
const { accountId, tenantId } = extractAuth(req)
|
|
if (!tenantId) return res.status(401).json({ error: 'Não autenticado' })
|
|
|
|
const [items, unread] = await Promise.all([
|
|
Broadcast.list(tenantId),
|
|
accountId ? Broadcast.unreadCount(tenantId, accountId) : Promise.resolve(0),
|
|
])
|
|
res.json({ items, unread_count: unread })
|
|
} catch (err) {
|
|
console.error('[broadcast.list]', err.message)
|
|
res.status(500).json({ error: 'Erro ao listar broadcasts' })
|
|
}
|
|
}
|
|
|
|
/**
|
|
* POST /api/admin/inbox/broadcasts/seen
|
|
* Marcar todos os broadcasts como vistos
|
|
*/
|
|
async markSeen(req, res) {
|
|
try {
|
|
const { accountId, tenantId } = extractAuth(req)
|
|
if (!accountId || !tenantId) return res.status(401).json({ error: 'Não autenticado' })
|
|
await Broadcast.markSeen(tenantId, accountId)
|
|
res.json({ ok: true })
|
|
} catch (err) {
|
|
console.error('[broadcast.markSeen]', err.message)
|
|
res.status(500).json({ error: 'Erro ao marcar como visto' })
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = new BroadcastController()
|