improve event processing by adding asynchronous handling for better performance

This commit is contained in:
ImBenji
2026-04-21 13:03:00 +01:00
parent 07cabf43e3
commit 81bcf40a8d
5 changed files with 79 additions and 36 deletions
+53 -22
View File
@@ -1,36 +1,67 @@
const db = require('../db');
function parseLimit(value) {
const n = Number.parseInt(value, 10);
return Number.isFinite(n) && n > 0 ? Math.min(n, 100) : 20;
}
function parseOffset(value) {
const n = Number.parseInt(value, 10);
return Number.isFinite(n) && n >= 0 ? n : 0;
}
async function eventRoutes(fastify) {
fastify.get('/events', async (request, reply) => {
const query = request.query || {};
if (!query.id) {
reply.code(400);
return { error: 'id is required' };
if (query.id) {
const id = Number.parseInt(query.id, 10);
if (!Number.isFinite(id)) {
reply.code(400);
return { error: 'id must be a number' };
}
const event = db.prepare(`SELECT id, title, created_at FROM events WHERE id = ?`).get(id);
if (!event) {
reply.code(404);
return { error: 'Event not found' };
}
const articles = db.prepare(`
SELECT id, title, description, content, url, normalized_title, source, pub_date, ingested_at
FROM articles
WHERE event_id = ?
AND content IS NOT NULL AND content != ''
AND is_index_page = 0
ORDER BY pub_date_effective DESC, id DESC
`).all(id);
return { ...event, articles };
}
const id = Number.parseInt(query.id, 10);
if (!Number.isFinite(id)) {
reply.code(400);
return { error: 'id must be a number' };
}
const limit = parseLimit(query.limit);
const offset = parseOffset(query.offset);
const event = db.prepare(`SELECT id, title, created_at FROM events WHERE id = ?`).get(id);
if (!event) {
reply.code(404);
return { error: 'Event not found' };
}
const SORT_COLUMNS = {
created_at: 'e.created_at',
id: 'e.id',
article_count: 'article_count',
};
const articles = db.prepare(`
SELECT id, title, description, content, url, normalized_title, source, pub_date, ingested_at
FROM articles
WHERE event_id = ?
AND content IS NOT NULL AND content != ''
AND is_index_page = 0
ORDER BY pub_date_effective DESC, id DESC
`).all(id);
const sortBy = SORT_COLUMNS[query.sort_by] || SORT_COLUMNS.created_at;
const order = String(query.order || '').toLowerCase() === 'asc' ? 'ASC' : 'DESC';
return { ...event, articles };
return db.prepare(`
SELECT e.id, e.title, e.created_at,
COUNT(a.id) AS article_count
FROM events e
LEFT JOIN articles a ON a.event_id = e.id
AND a.content IS NOT NULL AND a.content != ''
AND a.is_index_page = 0
GROUP BY e.id
ORDER BY ${sortBy} ${order}, e.id ${order}
LIMIT ? OFFSET ?
`).all(limit, offset);
});
}