diff --git a/server/middleware/validateCanvasInputMiddleware.js b/server/middleware/validateCanvasInputMiddleware.js new file mode 100644 index 000000000..daf3775ba --- /dev/null +++ b/server/middleware/validateCanvasInputMiddleware.js @@ -0,0 +1,25 @@ +const { isObject } = require("lodash"); + +const validateCanvasInputMiddleware = (req, res, next) => { + const { values, keys, override } = req.body; + + if (!Array.isArray(values) || !Array.isArray(keys)) { + return res.status(400).send("Invalid input: 'values' and 'keys' must be arrays."); + } + + if (values.some((value) => typeof value !== "number")) { + return res.status(400).send("Invalid input: 'values' must be an array of numbers."); + } + + if (keys.some((key) => typeof key !== "string")) { + return res.status(400).send("Invalid input: 'keys' must be an array of strings."); + } + + if (override && !isObject(override)) { + return res.status(400).send("Override must be an object"); + } + + next(); // Proceed to the next middleware or route handler +}; + +module.exports = validateCanvasInputMiddleware; diff --git a/server/render/canvas-handler.js b/server/render/canvas-handler.js index df3cc8f02..b35926935 100644 --- a/server/render/canvas-handler.js +++ b/server/render/canvas-handler.js @@ -1,11 +1,9 @@ const { createCanvas } = require("canvas"); const { Canvas, FontLibrary } = require("skia-canvas"); -const { performance } = require("perf_hooks"); const Chart = require("chart.js/auto"); -const logger = require("../utils/logger"); const { backgroundColors, borderColors } = require("./canvas-colors"); -const { isObject, defaultsDeep, isNumber } = require("lodash"); +const { defaultsDeep, isNumber } = require("lodash"); try { FontLibrary.use("Montserrat", [ @@ -62,45 +60,16 @@ const getChartConfiguration = (keys, values, override) => { return defaultsDeep(override || {}, defaultConfiguration); }; -// Utility to validate input -const validateCanvasInput = ({ values, keys, override }, res) => { - if (!Array.isArray(values) || !Array.isArray(keys)) { - res.status(400).send("Invalid input: 'values' and 'keys' must be arrays."); - return false; - } - - if (values.some((value) => typeof value !== "number")) { - res.status(400).send("Invalid input: 'values' must be an array of numbers."); - return false; - } - - if (keys.some((key) => typeof key !== "string")) { - res.status(400).send("Invalid input: 'keys' must be an array of strings."); - return false; - } - - if (override && !isObject(override)) { - res.status(400).send("Override must be an object"); - return false; - } - - return true; -}; - exports.canvastest = function (req, res) { - //console.log("Incoming test request.", req); res.status(200).send("OK"); }; exports.canvas = function (req, res) { - const startTime = performance.now(); + const { logger } = req; const { w, h, values, keys, override } = req.body; - //console.log("Incoming Canvas Request:", w, h, values, keys, override); logger.log("inbound-canvas-creation", "debug", "jsr", null, { w, h, values, keys, override }); - if (!validateCanvasInput(req.body, res)) return; - // Set the default Width and Height let [width, height] = [500, 275]; @@ -122,18 +91,15 @@ exports.canvas = function (req, res) { return canvas.toDataURL(); })() ); - console.log("Canvas generation time:", performance.now() - startTime, "ms"); }; exports.canvasSkia = async function (req, res) { - const startTime = performance.now(); + const { logger } = req; const { w, h, values, keys, override } = req.body; // Log incoming request for debugging logger.log("inbound-canvas-creation", "debug", "jsr", null, { w, h, values, keys, override }); - if (!validateCanvasInput(req.body, res)) return; - // Default width and height const width = typeof w === "number" && w > 0 ? w : 500; const height = typeof h === "number" && h > 0 ? h : 275; @@ -154,11 +120,9 @@ exports.canvasSkia = async function (req, res) { // Send the Base64-encoded image as the response res.status(200).send(dataURL); - console.log("Canvas generation time:", performance.now() - startTime, "ms"); } catch (error) { // Log and handle rendering errors logger.log("canvas-error", "error", "jsr", null, { error: error.message }); - console.error("Error generating chart:", error.message); res.status(500).send("Failed to generate canvas."); } }; diff --git a/server/routes/renderRoutes.js b/server/routes/renderRoutes.js index d1b64566e..c1423f698 100644 --- a/server/routes/renderRoutes.js +++ b/server/routes/renderRoutes.js @@ -3,10 +3,11 @@ const router = express.Router(); const { inlinecss } = require("../render/inlinecss"); const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware"); const { canvas, canvasSkia } = require("../render/canvas-handler"); +const validateCanvasInputMiddleware = require("../middleware/validateCanvasInputMiddleware"); // Define the route for inline CSS rendering router.post("/inlinecss", validateFirebaseIdTokenMiddleware, inlinecss); -router.post("/canvas", validateFirebaseIdTokenMiddleware, canvas); -router.post("/canvas-skia", validateFirebaseIdTokenMiddleware, canvasSkia); +router.post("/canvas", [validateFirebaseIdTokenMiddleware, validateCanvasInputMiddleware], canvas); +router.post("/canvas-skia", [validateFirebaseIdTokenMiddleware, validateCanvasInputMiddleware], canvasSkia); module.exports = router;