UNPKG

@parsifal-m/backstage-plugin-open-feedback-backend

Version:
115 lines (109 loc) 4.63 kB
'use strict'; var express = require('express'); var Router = require('express-promise-router'); var zod = require('zod'); var rootHttpRouter = require('@backstage/backend-defaults/rootHttpRouter'); function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; } var express__default = /*#__PURE__*/_interopDefaultCompat(express); var Router__default = /*#__PURE__*/_interopDefaultCompat(Router); const idParamSchema = zod.z.coerce.number().int().positive(); const submitFeedbackSchema = zod.z.object({ rating: zod.z.number(), comment: zod.z.string(), userRef: zod.z.string(), url: zod.z.string().max(2048) }); async function createRouter(options) { const { logger, config, databaseHandler } = options; const router = Router__default.default(); router.use(express__default.default.json()); router.get("/health", (_, response) => { logger.info("PONG!"); response.json({ status: "ok" }); }); router.post("/feedback/submit", (req, res) => { const result = submitFeedbackSchema.safeParse(req.body); if (!result.success) { return res.status(400).json({ errors: result.error.issues }); } const feedback = result.data; return databaseHandler.addFeedback(feedback).then(() => { logger.info( `Received feedback from ${feedback.userRef} with rating ${feedback.rating}` ); res.status(201).json({ status: "ok", message: "Feedback added" }); }).catch((error) => { logger.error(`Failed to add feedback: ${error}`); res.status(500).json({ status: "error", message: "Failed to add feedback" }); }); }); router.get("/feedback", (_, res) => { databaseHandler.getFeedback().then((feedback) => { res.status(200).json(feedback); }).catch((error) => { logger.error(`Failed to get feedback: ${error}`); res.status(500).json({ status: "error", message: "Failed to get feedback" }); }); }); router.get("/feedback/archived", (_, res) => { databaseHandler.getArchivedFeedback().then((feedback) => { res.status(200).json(feedback); }).catch((error) => { logger.error(`Failed to get archived feedback: ${error}`); res.status(500).json({ status: "error", message: "Failed to get archived feedback" }); }); }); router.patch("/feedback/:id/archive", (req, res) => { const parsed = idParamSchema.safeParse(req.params.id); if (!parsed.success) { return res.status(400).json({ status: "error", message: "Invalid ID" }); } return databaseHandler.archiveFeedback(parsed.data).then((count) => { if (count === 0) { return res.status(404).json({ status: "error", message: "Feedback not found" }); } return res.status(200).json({ status: "ok", message: "Feedback archived" }); }).catch((error) => { logger.error(`Failed to archive feedback: ${error}`); return res.status(500).json({ status: "error", message: "Failed to archive feedback" }); }); }); router.patch("/feedback/:id/restore", (req, res) => { const parsed = idParamSchema.safeParse(req.params.id); if (!parsed.success) { return res.status(400).json({ status: "error", message: "Invalid ID" }); } return databaseHandler.restoreFeedback(parsed.data).then((count) => { if (count === 0) { return res.status(404).json({ status: "error", message: "Feedback not found" }); } return res.status(200).json({ status: "ok", message: "Feedback restored" }); }).catch((error) => { logger.error(`Failed to restore feedback: ${error}`); return res.status(500).json({ status: "error", message: "Failed to restore feedback" }); }); }); router.delete("/feedback/:id", (req, res) => { const parsed = idParamSchema.safeParse(req.params.id); if (!parsed.success) { return res.status(400).json({ status: "error", message: "Invalid ID" }); } return databaseHandler.removeFeedback(parsed.data).then((count) => { if (count === 0) { return res.status(404).json({ status: "error", message: "Feedback not found" }); } return res.status(200).json({ status: "ok", message: "Feedback removed" }); }).catch((error) => { logger.error(`Failed to remove feedback: ${error}`); return res.status(500).json({ status: "error", message: "Failed to remove feedback" }); }); }); const middleware = rootHttpRouter.MiddlewareFactory.create({ logger, config }); router.use(middleware.error()); return router; } exports.createRouter = createRouter; //# sourceMappingURL=router.cjs.js.map