chore: cleanup of code

This commit is contained in:
Your Name 2026-08-02 22:06:42 -04:00
parent 28a441d98a
commit ae51fc763c
3 changed files with 264 additions and 275 deletions

321
index.js
View file

@ -28,6 +28,11 @@ let routes = { GET: [], POST: [], PUT: [], DELETE: [] };
const wsRoutes = {}
const wsConnections = {}
const INSPECT_OPTS = { showHidden: false, depth: null, colors: false, compact: false };
function inspectArgs(args) {
return args.map((v) => util.inspect(v, INSPECT_OPTS)).join(" ");
}
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(express.static("public"));
@ -64,7 +69,6 @@ async function saveFile(structureId, req, uploadedFile, asset=false) {
await uploadedFile.mv(path.join(uploadPath, name));
let id = model.createFile(
db,
structureId,
name,
storedPath,
@ -73,13 +77,13 @@ async function saveFile(structureId, req, uploadedFile, asset=false) {
asset,
);
let file = model.getFile(db, id);
let file = model.getFile(id);
file.url = prefixUrlWithHost(req, file.path);
return file
}
function bootstrapContext(db, structureId, routeId, initContext) {
function bootstrapContext(structureId, routeId, initContext) {
const allDbInstances = {};
function getDb(alias) {
return allDbInstances[alias];
@ -88,12 +92,12 @@ function bootstrapContext(db, structureId, routeId, initContext) {
// todo wrap template in data-bliss-edit-template thing since ws can't take us to the editor on a component basis?? maybe...
// for now just designing with component approach
const eta = model.getTemplater(structureId);
const structure = model.getStructure(db, structureId)
const structure = model.getStructure(structureId)
const __urlPrefix = structure.route_prefix;
const libs = { eta, db: getDb, push: webPush, files: { saveFile: (...args) => saveFile(structureId, ...args) } };
let dbs = model.getDbsForStructure(db, structureId);
let dbs = model.getDbsForStructure(structureId);
let context = vm.createContext({
...initContext,
require: function (str) {
@ -102,21 +106,8 @@ function bootstrapContext(db, structureId, routeId, initContext) {
module: { exports: null },
console: {
log: function (...content) {
const s = content.reduce((acc, curr) => {
console.log(curr);
return (
acc +
(acc ? " " : "") +
`${util.inspect(curr, {
showHidden: false,
depth: null, // `null` lets you see the full depth of the object
colors: false, // Setting this to true uses ANSI color codes
compact: false,
})}`
);
}, "");
model.createLog(db, structureId, routeId, s);
content.forEach((c) => console.log(c));
model.createLog(structureId, routeId, inspectArgs(content));
},
},
vapidPublicKey: vapidPublicKey,
@ -124,7 +115,7 @@ function bootstrapContext(db, structureId, routeId, initContext) {
clearTimeout: clearTimeout,
setTimeout: setTimeout,
route: function (url) {
return __urlPrefix ? path.join(__urlPrefix, url) : url;
return withPrefix(__urlPrefix, url);
},
});
for (let appDb of dbs) {
@ -141,9 +132,12 @@ function bootstrapContext(db, structureId, routeId, initContext) {
return context;
}
function withPrefix(prefix, url) {
return prefix ? path.join(prefix, url) : url;
}
function routeWithPrefix(route) {
const prefix = route.route_prefix;
return prefix ? path.join(prefix, route.path) : route.path;
return withPrefix(route.route_prefix, route.path);
}
@ -151,7 +145,7 @@ function bootstrapWebsocketHandler(route) {
// todo only expose app when running the handler, should not be available to the handler itself
// need to move to runscript or whatever...or remove app because we can just call it using the handler?
try {
const context = bootstrapContext(db, route.structure_id, route.id, { app });
const context = bootstrapContext(route.structure_id, route.id, { app });
let handler = vm.runInContext(`${route.handler}\n\nhandler;`, context);
if (!wsRoutes[routeWithPrefix(route)]) {
@ -167,17 +161,17 @@ function bootstrapWebsocketHandler(route) {
}
catch (e) {
const error = e.stack ? `${e}\n\n${e.stack}` : `${e}`;
model.createLog(db, route.structure_id, route.id, error, true);
model.createLog(route.structure_id, route.id, error, true);
}
})
}
ws.render = (template, context) => {
context = context || {};
context.route = function (url) {
return __urlPrefix ? path.join(__urlPrefix, url) : url;
};
const eta = model.getTemplater(route.structure_id);
const structure = model.getStructure(db, route.structure_id);
const structure = model.getStructure(route.structure_id);
context.route = function (url) {
return withPrefix(structure.route_prefix, url);
};
ws.send(
bootstrapTemplateWithHTMXetc(
@ -202,14 +196,14 @@ function bootstrapWebsocketHandler(route) {
return handler(ws, req)
} catch (e) {
const error = e.stack ? `${e}\n\n${e.stack}` : `${e}`;
model.createLog(db, route.structure_id, route.id, error, true);
model.createLog(route.structure_id, route.id, error, true);
}
}
model.updateRoute(db, { ...route, error: null });
model.updateRoute({ ...route, error: null });
} catch (e) {
const error = e.stack ? `${e}\n\n${e.stack}` : `${e}`;
model.createLog(db, route.structure_id, route.id, error, true);
model.updateRoute(db, { ...route, error: e.stack });
model.createLog(route.structure_id, route.id, error, true);
model.updateRoute({ ...route, error: e.stack });
}
}
@ -221,7 +215,7 @@ function buildRoutes() {
DELETE: [],
};
for (let route of model.getAllRoutes(db)) {
for (let route of model.getAllRoutes()) {
const p = routeWithPrefix(route);
if (route.verb == "WS") {
bootstrapWebsocketHandler(route);
@ -251,7 +245,7 @@ app.post("/register", async (req, res) => {
try {
const { username, password } = req.body;
const hashedPassword = await bcrypt.hash(password, 10); // 10 is the saltRounds
userId = model.createUser(db, username, hashedPassword);
const userId = model.createUser(username, hashedPassword);
req.session.userId = userId;
res.redirect("/workshop");
} catch (e) {
@ -261,7 +255,7 @@ app.post("/register", async (req, res) => {
app.post("/login", async (req, res) => {
const { username, password } = req.body;
const user = model.getUser(db, username);
const user = model.getUser(username);
if (user && (await bcrypt.compare(password, user.password))) {
req.session.userId = user.id;
@ -386,20 +380,20 @@ function bootstrapTemplateWithHTMXetc(
}
app.post("/workshop", (req, res) => {
let structId = model.createStructure(db, req.body.name);
let structId = model.createStructure(req.body.name);
return res.redirect("/workshop/" + structId);
});
app.get("/workshop", (req, res) => {
return res.send(
bootstrapTemplateWithHTMXetc(
eta.render("workshop/index", {
structures: model.getStructures(db),
}),
),
);
return renderWorkshop(res, "workshop/index", {
structures: model.getStructures(),
});
});
function renderWorkshop(res, template, context) {
res.send(bootstrapTemplateWithHTMXetc(eta.render(template, context)));
}
function smartRedirect(req, res, redirectUrl) {
if (req.headers["hx-request"]) {
res.set("HX-Redirect", redirectUrl);
@ -409,21 +403,17 @@ function smartRedirect(req, res, redirectUrl) {
}
}
function sidebarStuff(db, structId) {
function sidebarStuff(structId) {
return {
structure: model.getStructure(db, structId),
routes: model.getRoutes(db, structId),
templates: model.getTemplates(db, structId),
dbs: model.getDbsForStructure(db, structId),
structure: model.getStructure(structId),
routes: model.getRoutes(structId),
templates: model.getTemplates(structId),
dbs: model.getDbsForStructure(structId),
};
}
app.get("/workshop/:structure_id", (req, res) => {
return res.send(
bootstrapTemplateWithHTMXetc(
eta.render("workshop/editor", sidebarStuff(db, req.params.structure_id)),
),
);
return renderWorkshop(res, "workshop/editor", sidebarStuff(req.params.structure_id));
});
app.post("/workshop/:structure_id/clone", (req, res) => {
@ -447,34 +437,29 @@ app.post("/workshop/:structure_id/clone", (req, res) => {
});
app.post("/workshop/:structure_id/db", (req, res) => {
const dbId = model.createDb(db, req.params.structure_id, req.body.name);
const dbId = model.createDb(req.params.structure_id, req.body.name);
const redirectUrl = `/workshop/${req.params.structure_id}/db/${dbId}`;
return smartRedirect(req, res, redirectUrl);
});
app.post("/workshop/:structure_id/db/attach", (req, res) => {
model.attachDb(db, req.params.structure_id, req.body.db_id, req.body.alias);
model.attachDb(req.params.structure_id, req.body.db_id, req.body.alias);
const redirectUrl = `/workshop/${req.params.structure_id}/db/${req.body.db_id}`;
return smartRedirect(req, res, redirectUrl);
});
app.get("/workshop/:structure_id/db/:db_id", (req, res) => {
const structdb = model.getDbForStructure(
db,
req.params.structure_id,
req.params.db_id,
);
if (!structdb) {
return res.send("uh oh");
}
return res.send(
bootstrapTemplateWithHTMXetc(
eta.render("workshop/db_garden", {
db: structdb,
...sidebarStuff(db, req.params.structure_id),
}),
),
);
return renderWorkshop(res, "workshop/db_garden", {
db: structdb,
...sidebarStuff(req.params.structure_id),
});
});
app.post("/workshop/:structure_id/route", (req, res) => {
@ -494,7 +479,6 @@ app.post("/workshop/:structure_id/route", (req, res) => {
p = p.substring(0, p.length - 1);
}
const route = model.createRoute(
db,
req.body.verb,
p[0] == "/" ? p.substring(1) : "/" + p,
req.params.structure_id,
@ -510,12 +494,12 @@ app.post("/workshop/:structure_id/route", (req, res) => {
});
app.put("/workshop/:structure_id/route/:route_id", (req, res) => {
const route = model.getRoute(db, req.params.route_id);
model.updateRoute(db, { ...route, ...req.body });
const route = model.getRoute(req.params.route_id);
model.updateRoute({ ...route, ...req.body });
if (req.body.scaffold_page) {
// TODO: make this send over scaffold page id too someday
const latestPage = model.getLatestScaffoldPage(db, req.params.route_id)
model.updateScaffoldPage(db, { ...latestPage, content: req.body.scaffold_page })
const latestPage = model.getLatestScaffoldPage(req.params.route_id)
model.updateScaffoldPage({ ...latestPage, content: req.body.scaffold_page })
}
if (route.verb == "WS") {
bootstrapWebsocketHandler({ ...route, ...req.body })
@ -526,9 +510,9 @@ app.put("/workshop/:structure_id/route/:route_id", (req, res) => {
app.put("/workshop/:structure_id/db/:db_id/library", (req, res) => {
try {
let dbId = req.params.db_id;
let appDb = model.getDb(db, dbId);
model.updateDb(db, { ...appDb, library: req.body.library });
appDb = model.getDb(db, dbId);
let appDb = model.getDb(dbId);
model.updateDb({ ...appDb, library: req.body.library });
appDb = model.getDb(dbId);
let dbInstance = model.getDbInstance(dbId);
let capturedOutput = [];
@ -536,20 +520,11 @@ app.put("/workshop/:structure_id/db/:db_id/library", (req, res) => {
module: { exports: null },
sql: dbInstance,
console: {
log: (...args) => capturedOutput.push(args.join(" ")),
log: (...args) => capturedOutput.push(inspectArgs(args)),
},
});
let evaledCode = vm.runInContext(appDb.library, context);
let stdout = capturedOutput
.map((v) => {
return util.inspect(v, {
showHidden: false,
depth: null, // `null` lets you see the full depth of the object
colors: false, // Setting this to true uses ANSI color codes
compact: false,
});
})
.join("\n");
let stdout = capturedOutput.join("\n");
return res.send(`${stdout}\n\n> ${evaledCode}`.trim());
} catch (e) {
return res.send(`${e}\n\n${e.stack}`);
@ -559,26 +534,14 @@ app.put("/workshop/:structure_id/db/:db_id/library", (req, res) => {
app.post("/workshop/:structure_id/db/:db_id/repl", (req, res) => {
try {
let dbId = req.params.db_id;
let appDb = model.getDb(db, dbId);
let appDb = model.getDb(dbId);
let dbInstance = model.getDbInstance(dbId);
let capturedOutput = [];
let context = vm.createContext({
module: { exports: null },
sql: dbInstance,
console: {
log: (...args) =>
capturedOutput.push(
args
.map((v) => {
return util.inspect(v, {
showHidden: false,
depth: null, // `null` lets you see the full depth of the object
colors: false, // Setting this to true uses ANSI color codes
compact: false,
});
})
.join(" "),
),
log: (...args) => capturedOutput.push(inspectArgs(args)),
},
});
const libraryScript = new vm.Script(appDb.library);
@ -597,7 +560,6 @@ app.post("/workshop/:structure_id/template", (req, res) => {
let name = req.body.name;
const template = model.createTemplate(
db,
req.params.structure_id,
name,
"<div>henlo <%= it.name %></div>",
@ -616,8 +578,8 @@ app.put("/workshop/:structure_id/template/:template_id", (req, res) => {
let content = req.body.content;
let test_object = req.body.test_object;
model.updateTemplate(db, {
...model.getTemplate(db, id),
model.updateTemplate({
...model.getTemplate(id),
content,
test_object,
});
@ -626,28 +588,24 @@ app.put("/workshop/:structure_id/template/:template_id", (req, res) => {
});
app.get("/workshop/:structure_id/template/:template_id", (req, res) => {
const template = model.getTemplate(db, req.params.template_id);
const template = model.getTemplate(req.params.template_id);
return res.send(
bootstrapTemplateWithHTMXetc(
eta.render("workshop/template", {
template: template,
...sidebarStuff(db, req.params.structure_id),
}),
),
);
return renderWorkshop(res, "workshop/template", {
template: template,
...sidebarStuff(req.params.structure_id),
});
});
app.get("/workshop/:structure_id/template/:template_id/preview", (req, res) => {
const template = model.getTemplate(db, req.params.template_id);
const struct = model.getStructure(db, req.params.structure_id);
const template = model.getTemplate(req.params.template_id);
const struct = model.getStructure(req.params.structure_id);
const eta = model.getTemplater(req.params.structure_id);
const context = vm.createContext({ it: null });
vm.runInContext(template.test_object, context);
context.it.route = function (url) {
return struct.route_prefix ? path.join(struct.route_prefix, url) : url;
return withPrefix(struct.route_prefix, url);
};
return res.send(
@ -663,11 +621,8 @@ app.get("/workshop/:structure_id/template/:template_id/preview", (req, res) => {
});
app.get("/workshop/:structure_id/route/:id", (req, res) => {
const route = model.getRoute(db, req.params.id);
let routePrefix = model.getStructure(
db,
req.params.structure_id,
).route_prefix;
const route = model.getRoute(req.params.id);
let routePrefix = model.getStructure(req.params.structure_id).route_prefix;
let previewUrl = null;
if (route["verb"] == "GET" ) {
@ -679,26 +634,22 @@ app.get("/workshop/:structure_id/route/:id", (req, res) => {
previewUrl = `/workshop/${req.params.structure_id}/route/${req.params.id}/preview`;
}
template = route["verb"] == "GET" ? "workshop/route" : "workshop/cud_route";
const template = route["verb"] == "GET" ? "workshop/route" : "workshop/cud_route";
return res.send(
bootstrapTemplateWithHTMXetc(
eta.render(template, {
route: route,
previewUrl: previewUrl,
...sidebarStuff(db, req.params.structure_id),
}),
),
);
return renderWorkshop(res, template, {
route: route,
previewUrl: previewUrl,
...sidebarStuff(req.params.structure_id),
});
});
app.get("/workshop/:structure_id/route/:route_id/preview", (req, res) => {
const route = model.getRoute(db, req.params.route_id);
const struct = model.getStructure(db, req.params.structure_id);
const route = model.getRoute(req.params.route_id);
const struct = model.getStructure(req.params.structure_id);
const it = {
route: function (url) {
return struct.route_prefix ? path.join(struct.route_prefix, url) : url;
return withPrefix(struct.route_prefix, url);
}
}
@ -718,23 +669,19 @@ app.get("/workshop/:structure_id/route/:route_id/logs", (req, res) => {
const since = req.query.since;
let logs = [];
if (since != undefined) {
logs = model.getNewLogsByRoute(db, req.params.route_id, since);
logs = model.getNewLogsByRoute(req.params.route_id, since);
} else {
logs = model.getLogsByRoute(db, req.params.route_id);
logs = model.getLogsByRoute(req.params.route_id);
}
const lastId = model.getMostRecentLogIdByRoute(db, req.params.route_id);
const lastId = model.getMostRecentLogIdByRoute(req.params.route_id);
return res.send(
bootstrapTemplateWithHTMXetc(
eta.render("workshop/logs", {
logs: logs,
structId: req.params.structure_id,
routeId: req.params.route_id,
since: lastId,
}),
),
);
return renderWorkshop(res, "workshop/logs", {
logs: logs,
structId: req.params.structure_id,
routeId: req.params.route_id,
since: lastId,
});
});
// POST route to handle file upload
@ -766,34 +713,26 @@ function prefixUrlWithHost(req, path) {
app.get("/workshop/:structure_id/files", (req, res) => {
const { structure_id } = req.params;
const files = model.getFilesForStruct(db, structure_id);
const files = model.getFilesForStruct(structure_id);
files.map((it) => {
it.url = prefixUrlWithHost(req, it.path);
});
return res.send(
bootstrapTemplateWithHTMXetc(
eta.render("workshop/files", {
files,
...sidebarStuff(db, structure_id),
}),
),
);
return renderWorkshop(res, "workshop/files", {
files,
...sidebarStuff(structure_id),
});
});
app.get("/workshop/:structure_id/settings", (req, res) => {
return res.send(
bootstrapTemplateWithHTMXetc(
eta.render("workshop/settings", {
...sidebarStuff(db, req.params.structure_id),
}),
),
);
return renderWorkshop(res, "workshop/settings", {
...sidebarStuff(req.params.structure_id),
});
});
app.put("/workshop/:structure_id/settings", (req, res) => {
let structId = req.params.structure_id;
let struct = model.getStructure(db, structId);
let struct = model.getStructure(structId);
let routePrefix = req.body.route_prefix;
if (routePrefix[0] != "/") {
@ -803,59 +742,43 @@ app.put("/workshop/:structure_id/settings", (req, res) => {
routePrefix = routePrefix.substring(0, routePrefix.length - 1);
}
model.updateStruct(db, {
model.updateStruct({
...struct,
route_prefix: routePrefix,
head_injection: req.body.head_injection,
});
struct = model.getStructure(db, structId);
struct = model.getStructure(structId);
res.send("success!");
});
app.get("/workshop/:structure_id/new_template_modal", (req, res) => {
return res.send(
bootstrapTemplateWithHTMXetc(
eta.render("workshop/new_template_modal", {
structure: model.getStructure(db, req.params.structure_id),
}),
),
);
return renderWorkshop(res, "workshop/new_template_modal", {
structure: model.getStructure(req.params.structure_id),
});
});
app.get("/workshop/:structure_id/new_route_modal", (req, res) => {
return res.send(
bootstrapTemplateWithHTMXetc(
eta.render("workshop/new_route_modal", {
structure: model.getStructure(db, req.params.structure_id),
}),
),
);
return renderWorkshop(res, "workshop/new_route_modal", {
structure: model.getStructure(req.params.structure_id),
});
});
app.get("/workshop/:structure_id/new_db_modal", (req, res) => {
return res.send(
bootstrapTemplateWithHTMXetc(
eta.render("workshop/new_db_modal", {
structure: model.getStructure(db, req.params.structure_id),
}),
),
);
return renderWorkshop(res, "workshop/new_db_modal", {
structure: model.getStructure(req.params.structure_id),
});
});
app.get("/workshop/:structure_id/clone_modal", (req, res) => {
const structure = model.getStructure(db, req.params.structure_id);
const dbs = model.getDbsForStructure(db, req.params.structure_id);
const structure = model.getStructure(req.params.structure_id);
const dbs = model.getDbsForStructure(req.params.structure_id);
return res.send(
bootstrapTemplateWithHTMXetc(
eta.render("workshop/clone_structure_modal", {
structure,
dbs,
defaultRoutePrefix: path.join(structure.route_prefix || "", "clone"),
}),
),
);
return renderWorkshop(res, "workshop/clone_structure_modal", {
structure,
dbs,
defaultRoutePrefix: path.join(structure.route_prefix || "", "clone"),
});
});
function embedHTML(url) {
@ -882,13 +805,13 @@ app.all("*", async (req, res) => {
.prepare("SELECT * FROM routes WHERE id = ?")
.get(routeMatch.id);
const structure = model.getStructure(db, route.structure_id);
const structure = model.getStructure(route.structure_id);
const __urlPrefix = structure.route_prefix;
try {
// todo: only add req res to contexst when running the handler()
// which means moving to runscript instead of runincontext for that
let context = bootstrapContext(db, route.structure_id, route.id, {
let context = bootstrapContext(route.structure_id, route.id, {
req,
res,
eta,
@ -897,7 +820,7 @@ app.all("*", async (req, res) => {
res.render = (template, context) => {
context = context || {};
context.route = function (url) {
return __urlPrefix ? path.join(__urlPrefix, url) : url;
return withPrefix(__urlPrefix, url);
};
const eta = model.getTemplater(route.structure_id);
res.send(
@ -918,7 +841,7 @@ app.all("*", async (req, res) => {
const result = await executionScript.runInContext(context);
} catch (e) {
const error = e.stack ? `${e}\n\n${e.stack}` : `${e}`;
model.createLog(db, structure.id, route.id, error, true);
model.createLog(structure.id, route.id, error, true);
return res.status(500).send(error);
}
} else {