34 lines
1.2 KiB
TypeScript
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);
|
|
});
|