fix: logs bug where it was repeating due to flaw in most recent id query
This commit is contained in:
parent
7a5a1a5e9d
commit
38b9c0e538
4 changed files with 36 additions and 31 deletions
55
db.js
55
db.js
|
|
@ -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,
|
||||||
}
|
};
|
||||||
|
|
|
||||||
3
index.js
3
index.js
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue