@parsifal-m/backstage-plugin-open-feedback-backend
Version:
This plugin serves as the backend for OpenFeedback.
115 lines (109 loc) • 4.63 kB
JavaScript
;
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