fix: logs bug where it was repeating due to flaw in most recent id query

This commit is contained in:
HRG @ SCExC 2025-01-09 15:59:21 -05:00
parent 7a5a1a5e9d
commit 38b9c0e538
4 changed files with 36 additions and 31 deletions

55
db.js
View file

@ -54,7 +54,6 @@ function getUser(db, username) {
return db.prepare("SELECT * from users where username = ?").get(username); return db.prepare("SELECT * from users where username = ?").get(username);
} }
// _ _ _______ ______ ___ _ _______ __ __ _______ _______ // _ _ _______ ______ ___ _ _______ __ __ _______ _______
// | | _ | || || _ | | | | || || | | || || | // | | _ | || || _ | | | | || || | | || || |
// | || || || _ || | || | |_| || _____|| |_| || _ || _ | // | || || || _ || | || | |_| || _____|| |_| || _ || _ |
@ -63,7 +62,6 @@ function getUser(db, username) {
// | _ || || | | || _ | _____| || _ || || | // | _ || || | | || _ | _____| || _ || || |
// |__| |__||_______||___| |_||___| |_||_______||__| |__||_______||___| // |__| |__||_______||___| |_||___| |_||_______||__| |__||_______||___|
const dbCache = new LRUCache({ max: 25 }); const dbCache = new LRUCache({ max: 25 });
function getDbInstance(dbId) { function getDbInstance(dbId) {
@ -86,7 +84,7 @@ function getAllRoutes(db) {
FROM routes FROM routes
JOIN structures ON routes.structure_id = structures.id JOIN structures ON routes.structure_id = structures.id
ORDER BY routes.updated_at DESC; ORDER BY routes.updated_at DESC;
` `,
) )
.all(); .all();
} }
@ -110,8 +108,6 @@ function getTemplater(structId) {
return etaInstance; return etaInstance;
} }
function getStructures(db) { function getStructures(db) {
return db.prepare("SELECT * from structures").all(); return db.prepare("SELECT * from structures").all();
} }
@ -122,17 +118,17 @@ function getStructure(db, id) {
function createStructure(db, name, userId) { function createStructure(db, name, userId) {
const stmt = db.prepare( const stmt = db.prepare(
"INSERT INTO structures (name, user_id) VALUES (?, ?)" "INSERT INTO structures (name, user_id) VALUES (?, ?)",
); );
const info = stmt.run(name, userId); const info = stmt.run(name, userId);
return info.lastInsertRowid; // Returns the structure_id of the newly created structure return info.lastInsertRowid; // Returns the structure_id of the newly created structure
} }
function createRoute(db, verb, path, structureId, handler) { function createRoute(db, verb, path, structureId, handler) {
path = encodeURI(path) path = encodeURI(path);
// add default handler here // add default handler here
const stmt = db.prepare( const stmt = db.prepare(
"INSERT INTO routes (verb, path, structure_id, handler) VALUES (?, ?, ?, ?)" "INSERT INTO routes (verb, path, structure_id, handler) VALUES (?, ?, ?, ?)",
); );
const info = stmt.run(verb, path, structureId, handler); const info = stmt.run(verb, path, structureId, handler);
return info.lastInsertRowid; // Returns the route_id of the newly created route return info.lastInsertRowid; // Returns the route_id of the newly created route
@ -208,7 +204,7 @@ function getTemplate(db, templateId) {
function getTemplateContentByName(db, structId, name) { function getTemplateContentByName(db, structId, name) {
return db return db
.prepare( .prepare(
"SELECT content from templates where structure_id = ? AND name = ?" "SELECT content from templates where structure_id = ? AND name = ?",
) )
.get(structId, name); .get(structId, name);
} }
@ -216,7 +212,7 @@ function getTemplateContentByName(db, structId, name) {
function createTemplate(db, structureId, name, content, testObjectString) { function createTemplate(db, structureId, name, content, testObjectString) {
return db return db
.prepare( .prepare(
"INSERT INTO templates (structure_id, name, content, test_object) VALUES (?, ?, ?, ?)" "INSERT INTO templates (structure_id, name, content, test_object) VALUES (?, ?, ?, ?)",
) )
.run(structureId, name, content, testObjectString).lastInsertRowid; .run(structureId, name, content, testObjectString).lastInsertRowid;
} }
@ -236,7 +232,7 @@ function getDbsForStructure(db, structureId) {
INNER JOIN dbs ON structure_dbs.db_id = dbs.id INNER JOIN dbs ON structure_dbs.db_id = dbs.id
WHERE structure_dbs.structure_id = ? WHERE structure_dbs.structure_id = ?
ORDER BY structure_dbs.created_at, is_aliased ASC; ORDER BY structure_dbs.created_at, is_aliased ASC;
` `,
) )
.all(structureId); .all(structureId);
} }
@ -247,7 +243,7 @@ function getDb(db, dbId) {
`SELECT * `SELECT *
FROM dbs FROM dbs
WHERE id = ?; WHERE id = ?;
` `,
) )
.get(dbId); .get(dbId);
} }
@ -260,7 +256,7 @@ function getDbForStructure(db, structureId, dbId) {
INNER JOIN dbs ON structure_dbs.db_id = dbs.id INNER JOIN dbs ON structure_dbs.db_id = dbs.id
WHERE structure_dbs.structure_id = ? WHERE structure_dbs.structure_id = ?
AND structure_dbs.db_id = ?; AND structure_dbs.db_id = ?;
` `,
) )
.get(structureId, dbId); .get(structureId, dbId);
} }
@ -312,7 +308,7 @@ function getFile(db, fileId) {
function createFile(db, structure_id, name, filePath, mime_type, mime_subtype) { function createFile(db, structure_id, name, filePath, mime_type, mime_subtype) {
return db return db
.prepare( .prepare(
"INSERT INTO files (structure_id, name, path, mime_type, mime_subtype) VALUES (?, ?, ?, ?, ?)" "INSERT INTO files (structure_id, name, path, mime_type, mime_subtype) VALUES (?, ?, ?, ?, ?)",
) )
.run(structure_id, name, filePath, mime_type, mime_subtype).lastInsertRowid; .run(structure_id, name, filePath, mime_type, mime_subtype).lastInsertRowid;
} }
@ -322,7 +318,7 @@ function cloneStructure(
newStructureName, newStructureName,
userId, userId,
routePrefix = "", routePrefix = "",
cloneDbs = [] cloneDbs = [],
) { ) {
const transaction = db.transaction(() => { const transaction = db.transaction(() => {
const cloneStructure = db.prepare(` const cloneStructure = db.prepare(`
@ -334,7 +330,7 @@ function cloneStructure(
newStructureName, newStructureName,
userId, userId,
routePrefix, routePrefix,
structId structId,
).lastInsertRowid; ).lastInsertRowid;
const dbIds = db const dbIds = db
@ -356,7 +352,7 @@ function cloneStructure(
` `
INSERT INTO dbs (name, structure_id, library) INSERT INTO dbs (name, structure_id, library)
SELECT name, ?, library FROM dbs WHERE id = ?; SELECT name, ?, library FROM dbs WHERE id = ?;
` `,
) )
.run(newStructId, db_id).lastInsertRowid; .run(newStructId, db_id).lastInsertRowid;
@ -364,7 +360,7 @@ function cloneStructure(
` `
INSERT INTO structure_dbs (db_id, structure_id, alias) INSERT INTO structure_dbs (db_id, structure_id, alias)
SELECT ?, ?, alias FROM structure_dbs WHERE db_id = ? AND structure_id = ?; SELECT ?, ?, alias FROM structure_dbs WHERE db_id = ? AND structure_id = ?;
` `,
).run(newDb, newStructId, db_id, structId); ).run(newDb, newStructId, db_id, structId);
db.prepare(`select id from dbs where structure_id = ?`) db.prepare(`select id from dbs where structure_id = ?`)
@ -382,7 +378,7 @@ function cloneStructure(
` `
INSERT INTO structure_dbs (db_id, structure_id, alias) INSERT INTO structure_dbs (db_id, structure_id, alias)
SELECT db_id, ?, alias FROM structure_dbs WHERE structure_id = ? AND db_id = ?; SELECT db_id, ?, alias FROM structure_dbs WHERE structure_id = ? AND db_id = ?;
` `,
).run(newStructId, structId, db_id); ).run(newStructId, structId, db_id);
} }
@ -406,23 +402,32 @@ function cloneStructure(
function createLog(db, structureId, routeId, content, error = false) { function createLog(db, structureId, routeId, content, error = false) {
const stmt = db.prepare( const stmt = db.prepare(
"INSERT INTO logs (error, structure_id, route_id, content) VALUES (?, ?, ?, ?)" "INSERT INTO logs (error, structure_id, route_id, content) VALUES (?, ?, ?, ?)",
); );
const info = stmt.run(error ? 1 : 0, structureId, routeId, content); const info = stmt.run(error ? 1 : 0, structureId, routeId, content);
return info.lastInsertRowid; // Returns the log_id of the newly created log return info.lastInsertRowid; // Returns the log_id of the newly created log
} }
function getLogsByRoute(db, routeId) { function getLogsByRoute(db, routeId) {
return db.prepare("SELECT * FROM logs WHERE route_id = ? ORDER BY created_at DESC LIMIT 50").all(routeId).reverse(); return db
.prepare(
"SELECT * FROM logs WHERE route_id = ? ORDER BY created_at DESC LIMIT 50",
)
.all(routeId)
.reverse();
} }
function getNewLogsByRoute(db, routeId, since) { function getNewLogsByRoute(db, routeId, since) {
return db.prepare("SELECT * FROM logs WHERE route_id = ? AND id > ? ORDER BY created_at DESC").all(routeId, since); return db
.prepare(
"SELECT * FROM logs WHERE route_id = ? AND id > ? ORDER BY created_at DESC",
)
.all(routeId, since);
} }
function getMostRecentLogIdByRoute(db, routeId) { function getMostRecentLogIdByRoute(db, routeId) {
const result = db const result = db
.prepare("SELECT id FROM logs WHERE route_id = ? ORDER BY created_at DESC LIMIT 1") .prepare("SELECT MAX(id) AS id FROM logs WHERE route_id = ?")
.get(routeId); .get(routeId);
return result ? result.id : 0; return result ? result.id : 0;
} }
@ -461,5 +466,5 @@ module.exports = {
createLog, createLog,
getLogsByRoute, getLogsByRoute,
getNewLogsByRoute, getNewLogsByRoute,
getMostRecentLogIdByRoute getMostRecentLogIdByRoute,
} };

View file

@ -571,10 +571,11 @@ app.get("/workshop/:structure_id/route/:route_id/logs", (req, res) => {
const lastId = model.getMostRecentLogIdByRoute(db, req.params.route_id); const lastId = model.getMostRecentLogIdByRoute(db, req.params.route_id);
console.log(since, logs, lastId)
return res.send( return res.send(
bootstrapTemplateWithHTMXetc( bootstrapTemplateWithHTMXetc(
eta.render("workshop/logs", { eta.render("workshop/logs", {
logs: logs.reverse(), logs: logs,
structId: req.params.structure_id, structId: req.params.structure_id,
routeId: req.params.route_id, routeId: req.params.route_id,
since: lastId, since: lastId,

View file

@ -1,6 +1,6 @@
<div hx-swap="outerHTML" hx-get="/workshop/<%= it.structId %>/route/<%= it.routeId %>/logs?since=<%= it.since || 0 %>" hx-trigger="every 2s" class="hidden"></div>
<% it.logs.forEach((log) => { %> <% it.logs.forEach((log) => { %>
<div class="<% if (log.error) { %>bg-red-800 text-white <% } %>"> <!-- <div class="<% if (log.error) { %>bg-red-800 text-white <% } %>"> -->
<%= log.content %> <%= log.content %>
</div> <!-- </div> -->
<% }) %> <% }) %>
<div hx-swap="outerHTML" hx-get="/workshop/<%= it.structId %>/route/<%= it.routeId %>/logs?since=<%= it.since || 0 %>" hx-trigger="every 5s" class="hidden"></div>

View file

@ -22,8 +22,7 @@
<button id="save-btn" type="submit">Save</button> <button id="save-btn" type="submit">Save</button>
<button id="save-btn" type="submit" _="on click toggle .hidden on #logs">Logs</button> <button id="save-btn" type="submit" _="on click toggle .hidden on #logs">Logs</button>
</div> </div>
<pre id="logs" class="max-h-[50vh] overflow-scroll hidden"> <pre id="logs" class="max-h-[50vh] overflow-scroll flex hidden" hx-get="/workshop/<%= it.structure.id %>/route/<%= it.route.id %>/logs" hx-trigger="load">
<ul hx-get="/workshop/<%= it.structure.id %>/route/<%= it.route.id %>/logs" hx-trigger="load" class="flex flex-col-reverse"></ul>
</pre> </pre>
</div> </div>
<div id="preview-area" class="w-1/2 h-full flex flex-col"> <div id="preview-area" class="w-1/2 h-full flex flex-col">