live updates and file organization
This commit is contained in:
@@ -273,7 +273,8 @@ console.log('Postgres enabled for persistence');
|
||||
// Simple Server-Sent Events (SSE) broadcaster
|
||||
const sseClients = new Map(); // key: guildId or '*' -> array of res
|
||||
function publishEvent(guildId, type, payload) {
|
||||
const msg = `event: ${type}\ndata: ${JSON.stringify(payload)}\n\n`;
|
||||
const enriched = Object.assign({}, payload || {}, { guildId });
|
||||
const msg = `event: ${type}\ndata: ${JSON.stringify(enriched)}\n\n`;
|
||||
// send to guild-specific subscribers
|
||||
const list = sseClients.get(guildId) || [];
|
||||
for (const res of list.slice()) {
|
||||
@@ -303,6 +304,31 @@ app.get('/api/events', (req, res) => {
|
||||
});
|
||||
});
|
||||
|
||||
// Health endpoint used by frontend to detect backend availability
|
||||
app.get('/api/servers/health', async (req, res) => {
|
||||
try {
|
||||
// Basic checks: server is running; optionally check DB connectivity
|
||||
const health = { ok: true, db: null, bot: null };
|
||||
try {
|
||||
// if pgClient is available, attempt a simple query
|
||||
if (pgClient && typeof pgClient.query === 'function') {
|
||||
await pgClient.query('SELECT 1');
|
||||
health.db = true;
|
||||
}
|
||||
} catch (e) {
|
||||
health.db = false;
|
||||
}
|
||||
try {
|
||||
health.bot = (bot && bot.client && bot.client.user) ? true : false;
|
||||
} catch (e) {
|
||||
health.bot = false;
|
||||
}
|
||||
res.json(health);
|
||||
} catch (e) {
|
||||
res.status(500).json({ ok: false });
|
||||
}
|
||||
});
|
||||
|
||||
app.get('/api/servers/:guildId/settings', async (req, res) => {
|
||||
const { guildId } = req.params;
|
||||
try {
|
||||
@@ -612,6 +638,21 @@ app.get('/', (req, res) => {
|
||||
res.send('Hello from the backend!');
|
||||
});
|
||||
|
||||
// Debug helper: publish an arbitrary SSE event for a guild (guarded by DEBUG_SSE env var)
|
||||
app.post('/api/servers/:guildId/debug/publish', express.json(), (req, res) => {
|
||||
if (!process.env.DEBUG_SSE || process.env.DEBUG_SSE === '0') return res.status(404).json({ success: false, message: 'Not found' });
|
||||
try {
|
||||
const { guildId } = req.params;
|
||||
const { type, payload } = req.body || {};
|
||||
if (!type) return res.status(400).json({ success: false, message: 'Missing event type' });
|
||||
publishEvent(guildId, type, payload || {});
|
||||
return res.json({ success: true });
|
||||
} catch (e) {
|
||||
console.error('Debug publish failed:', e);
|
||||
return res.status(500).json({ success: false });
|
||||
}
|
||||
});
|
||||
|
||||
// Return list of bot commands and per-guild enabled/disabled status
|
||||
app.get('/api/servers/:guildId/commands', async (req, res) => {
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user