Files
mailadmin/backend/src/routes/domains.ts
2026-04-26 13:47:35 -05:00

34 lines
1.2 KiB
TypeScript

import { Router } from 'express';
import { pool } from '../db.js';
import { config } from '../config.js';
import { requireAuth, canAccessDomain } from '../middleware/auth.js';
import { SyncService } from '../services/sync.js';
import { audit } from '../services/audit.js';
export const domainsRouter = Router();
domainsRouter.use(requireAuth);
const sync = new SyncService();
domainsRouter.post('/resync', async (req, res) => {
const result = await sync.syncFromDms();
await audit(req.user!.email, 'domains.resync', 'node', config.nodeName, result, req.ip);
res.json(result);
});
domainsRouter.get('/', async (req, res) => {
if (req.query.resync === 'true') await sync.syncFromDms();
const result = await pool.query(
`SELECT d.*, COUNT(m.email_address) FILTER (WHERE m.status='active')::int AS active_mailboxes,
COALESCE(SUM(m.used_bytes) FILTER (WHERE m.status='active'),0)::bigint AS used_bytes
FROM domains d
LEFT JOIN mailboxes m ON m.domain=d.domain
WHERE d.current_node=$1
GROUP BY d.id
ORDER BY d.domain`,
[config.nodeName],
);
const rows = result.rows.filter((r) => canAccessDomain(req.user!, r.domain));
res.json(rows);
});