diff --git a/index.js b/index.js deleted file mode 100644 index 17be340..0000000 --- a/index.js +++ /dev/null @@ -1,78 +0,0 @@ -const figlet = require("figlet"); -const express = require("express"); - -const app = express(); -const port = 3000; - -const defaultFontOptions = { - font: "Larry 3D", - horizontalLayout: "default", - verticalLayout: "default", - width: 80, - whitespaceBreak: true, -}; - -function generateLarryMessage(message) { - return new Promise((resolve, reject) => { - figlet.text( - message, - { - ...defaultFontOptions, - }, - (err, data) => { - if (err) { - console.error("error from figlet:", error); - return reject(err); - } - - resolve(data.replaceAll("L", "_")); - } - ); - }); -} - -function generateCatOutput(ascii) { - return `#!/bin/bash -cat << 'EOF' - -${ascii} - -EOF -`; -} - -const asciiFontController = (req, res) => { - const { message } = req.query; - console.log(`generating ascii for: ${message}`); - - return generateLarryMessage(message) - .then((ascii) => res.send(ascii)) - .catch((error) => - res.status(500).send({ - success: false, - message: "Unexpected error from font generation", - }) - ); -}; - -const modtFontController = (req, res) => { - const { message } = req.query; - console.log(`generating motd for: ${message}`); - - return generateLarryMessage(message) - .then((ascii) => generateCatOutput(ascii)) - .then((motd) => res.send(motd)) - .catch((error) => { - return res.status(500).send({ - success: false, - message: "Unexpected error from font generation", - }); - }); -}; - -app.get("/ascii", asciiFontController); -app.get("/motd", modtFontController); - -app.listen(port, () => { - console.log(`Font generation application listening on port ${port}.`); -}); diff --git a/package.json b/package.json index a14d126..fb442c6 100644 --- a/package.json +++ b/package.json @@ -1,4 +1,7 @@ { + "scripts": { + "start": "node src/app.js" + }, "dependencies": { "express": "^4.18.2", "figlet": "^1.5.2" diff --git a/src/app.js b/src/app.js new file mode 100644 index 0000000..742850a --- /dev/null +++ b/src/app.js @@ -0,0 +1,15 @@ +const express = require("express"); + +const asciiFontController = require("./controllers/asciiController.js"); +const modtFontController = require("./controllers/motdController.js"); +const requiredQueryMiddleware = require("./requiredQueryMiddleware"); + +const app = express(); +const port = 3000; + +app.get("/ascii", requiredQueryMiddleware, asciiFontController); +app.get("/motd", requiredQueryMiddleware, modtFontController); + +app.listen(port, () => { + console.log(`Font generation application listening on port ${port}.`); +}); diff --git a/src/ascii.js b/src/ascii.js new file mode 100644 index 0000000..f6365f1 --- /dev/null +++ b/src/ascii.js @@ -0,0 +1,33 @@ +const figlet = require("figlet"); + +const defaultFontOptions = { + font: "Larry 3D", + horizontalLayout: "default", + verticalLayout: "default", + width: 80, + whitespaceBreak: true, +}; + +function generateAscii(message, options) { + const _options = { + ...defaultFontOptions, + ...options, + }; + + return new Promise((resolve, reject) => { + figlet.text(message, _options, (err, data) => { + if (err) { + console.error("error from figlet:", error); + return reject(err); + } + + if (_options.font === "Larry 3D") { + data = data.replaceAll("L", "_"); + } + + resolve(data); + }); + }); +} + +module.exports = generateAscii; diff --git a/src/controllers/asciiController.js b/src/controllers/asciiController.js new file mode 100644 index 0000000..fd3c8b6 --- /dev/null +++ b/src/controllers/asciiController.js @@ -0,0 +1,16 @@ +const generateAscii = require("../ascii.js"); + +const asciiFontController = (req, res) => { + const { text } = req.query; + + return generateAscii(text) + .then((ascii) => res.send(ascii)) + .catch((error) => + res.status(error?.statusCode || 500).send({ + success: false, + message: error?.message || "Unexpected error from font generation", + }) + ); +}; + +module.exports = asciiFontController; diff --git a/src/controllers/motdController.js b/src/controllers/motdController.js new file mode 100644 index 0000000..cf40cb3 --- /dev/null +++ b/src/controllers/motdController.js @@ -0,0 +1,17 @@ +const generateAscii = require("../ascii.js"); + +const modtFontController = (req, res) => { + const { text } = req.query; + + return generateAscii(message) + .then((ascii) => generateCatOutput(ascii)) + .then((motd) => res.send(motd)) + .catch((error) => { + return res.status(500).send({ + success: false, + message: "Unexpected error from font generation", + }); + }); +}; + +module.exports = modtFontController; diff --git a/src/errors.js b/src/errors.js new file mode 100644 index 0000000..1817566 --- /dev/null +++ b/src/errors.js @@ -0,0 +1,13 @@ +class MissingTextError extends Error { + constructor(error = null) { + const message = `Missing query parameter 'text'`; + super(message); + + this.error = error; + this.statusCode = 400; + } +} + +module.exports = { + MissingTextError, +}; diff --git a/src/requiredQueryMiddleware.js b/src/requiredQueryMiddleware.js new file mode 100644 index 0000000..92695f3 --- /dev/null +++ b/src/requiredQueryMiddleware.js @@ -0,0 +1,14 @@ +const { MissingTextError } = require("./errors.js"); + +const requiredQueryMiddleware = (req, res, next) => { + const { text } = req.query; + + if (!text || text?.length === 0) { + const error = new MissingTextError(); + return res.status(error?.statusCode || 500).send(error?.message); + } + + next(); +}; + +module.exports = requiredQueryMiddleware;