From 52a2b2caabb48c06c5129218ef1d3cad4f89718f Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Thu, 29 Feb 2024 22:10:32 -0500 Subject: [PATCH] Cleaned up the way you make controllers and started working on the API vs. pages organization. --- api/todo_alpine.js | 17 +++++++++++ commands/app.js | 44 ++++++++++++++++----------- controllers/todo.js | 29 ------------------ controllers/todo_alpine.js | 30 ------------------ {templates => pages}/footer.html | 0 {templates => pages}/header.html | 0 {templates => pages}/todo.html | 0 pages/todo.js | 23 ++++++++++++++ {templates => pages}/todo_alpine.html | 0 9 files changed, 66 insertions(+), 77 deletions(-) create mode 100644 api/todo_alpine.js delete mode 100644 controllers/todo.js delete mode 100644 controllers/todo_alpine.js rename {templates => pages}/footer.html (100%) rename {templates => pages}/header.html (100%) rename {templates => pages}/todo.html (100%) create mode 100644 pages/todo.js rename {templates => pages}/todo_alpine.html (100%) diff --git a/api/todo_alpine.js b/api/todo_alpine.js new file mode 100644 index 0000000..856765f --- /dev/null +++ b/api/todo_alpine.js @@ -0,0 +1,17 @@ +import { ToDo } from "../lib/models.js"; +import nunjucks from "nunjucks"; + +export const get = async (req, rep) => { + const todo_list = await ToDo.all({}); + rep.code(200).send(todo_list); +} + +export const post = async (req, rep) => { + if(req.query.todo_id !== undefined) { + await ToDo.delete({id: req.query.todo_id}); + } else { + await ToDo.insert({task: req.body.task}); + } + + await get(req, rep); +} diff --git a/commands/app.js b/commands/app.js index 5a3a523..df2f8c6 100644 --- a/commands/app.js +++ b/commands/app.js @@ -23,30 +23,38 @@ const configure = async (fastify, opts) => { const app = fastify(opts); // forces reload of the modules - for(let mod of fg.sync("controllers/*.js")) { - const control_mod = await import(`../${mod}?update=${new Date()}`); - // TODO: mappings are very simple for now - for(let [url, controller] of Object.entries(control_mod.default)) { - const handler = new controller(); - // this goes through all the allowed verbs - for(let verb of ["get", "post", "put", "delete"]) { - if(verb in handler) { - app[verb](`/${url}`, async (req, rep) => { - try { - await handler[verb](req, rep); - } catch(error) { - console.error(error); - console.error(error.stack); - console.error(error.source); - } - }); - } + for(let mod of fg.sync("{api,pages}/*.js")) { + const control_mod = await import(`../${mod}?update=${Date.now()}`); + const pf = path.parse(mod); + const url = `/${pf.name}`; + + console.log("URL IS", url); + + for(let verb of ["get", "post", "put", "delete"]) { + const handler = control_mod[verb]; + + if(handler !== undefined) { + console.log("ADDING VERB", verb); + app[verb](url, async (req, rep) => { + try { + await handler(req, rep); + } catch(error) { + console.error(error); + console.error(error.stack); + console.error(error.source); + } + }); } } } app.register(Formbody); + app.get("/pages/todo_alpine.html", (req, rep) => { + const result = nunjucks.render("todo_alpine.html"); + rep.code(200).type("text/html").send(result); + }); + app.register(FastifyStatic, { root: path.join(path.resolve("."), 'static'), prefix: '/', // optional: default '/' diff --git a/controllers/todo.js b/controllers/todo.js deleted file mode 100644 index fe05e30..0000000 --- a/controllers/todo.js +++ /dev/null @@ -1,29 +0,0 @@ -import { ToDo } from "../lib/models.js"; -import nunjucks from "nunjucks"; - -export class Todo { - async get(req, rep) { - const todo_list = await ToDo.all({}); - - const result = nunjucks.render("todo.html", - {todo_list, name: "Zed"}); - - rep.code(200).type("text/html").send(result); - } - - async post(req, rep) { - if(req.query.todo_id !== undefined) { - await ToDo.delete({id: req.query.todo_id}); - } else { - console.log("ADDING TASK", req.body.task); - await ToDo.insert({task: req.body.task}); - } - - // this is how you can prevent the annoying double submit - rep.redirect("/todo"); - } -} - -// you use the export default to set the route URL? -// I mean, it works not sure if I like it though -export default { todo: Todo }; diff --git a/controllers/todo_alpine.js b/controllers/todo_alpine.js deleted file mode 100644 index dea9fc4..0000000 --- a/controllers/todo_alpine.js +++ /dev/null @@ -1,30 +0,0 @@ -import { ToDo } from "../lib/models.js"; -import nunjucks from "nunjucks"; - -export class Todo { - async get(req, rep) { - if(req.headers.accept === "application/json") { - const todo_list = await ToDo.all({}); - rep.code(200).send(todo_list); - } else { - const result = nunjucks.render("todo_alpine.html", {name: "Zed"}); - rep.code(200).type("text/html").send(result); - } - } - - async post(req, rep) { - if(req.query.todo_id !== undefined) { - await ToDo.delete({id: req.query.todo_id}); - } else { - await ToDo.insert({task: req.body.task}); - } - - await this.get(req, rep); - } -} - -// you use the export default to set the route URL? -// I mean, it works not sure if I like it though -export default { - todo_alpine: Todo, -}; diff --git a/templates/footer.html b/pages/footer.html similarity index 100% rename from templates/footer.html rename to pages/footer.html diff --git a/templates/header.html b/pages/header.html similarity index 100% rename from templates/header.html rename to pages/header.html diff --git a/templates/todo.html b/pages/todo.html similarity index 100% rename from templates/todo.html rename to pages/todo.html diff --git a/pages/todo.js b/pages/todo.js new file mode 100644 index 0000000..50cd8a3 --- /dev/null +++ b/pages/todo.js @@ -0,0 +1,23 @@ +import { ToDo } from "../lib/models.js"; +import nunjucks from "nunjucks"; + +export const get = async (req, rep) => { + const todo_list = await ToDo.all({}); + + const result = nunjucks.render("todo.html", + {todo_list, name: "Zed"}); + + rep.code(200).type("text/html").send(result); +} + +export const post = async (req, rep) => { + if(req.query.todo_id !== undefined) { + await ToDo.delete({id: req.query.todo_id}); + } else { + console.log("ADDING TASK", req.body.task); + await ToDo.insert({task: req.body.task}); + } + + // this is how you can prevent the annoying double submit + rep.redirect("/todo"); +} diff --git a/templates/todo_alpine.html b/pages/todo_alpine.html similarity index 100% rename from templates/todo_alpine.html rename to pages/todo_alpine.html