server/api/ReportThemeRoute.js
Rama master · réplica de lectura del repositorio original.
const db = require("../models/models");
const verifyToken = require("../modules/verifyToken");
const { createPreset, changePreset } = require("../modules/reportAppearance");
module.exports = (app) => {
const base = "/team/:team_id/report-theme-presets";
const authorize = async (req, res, next) => {
try {
const role = await db.TeamRole.findOne({ where: { team_id: req.params.team_id, user_id: req.user.id } });
const admin = ["teamOwner", "teamAdmin"].includes(role?.role);
const editor = role?.role === "teamEditor" || ["projectAdmin", "projectEditor"].includes(role?.role)
&& role.projects?.length > 0
&& await db.Project.count({ where: { team_id: req.params.team_id, id: role.projects } });
if (!admin && !editor) return res.status(403).json({ message: "Access denied" });
if (req.params.id) {
const preset = await db.ReportThemePreset.findOne({ where: { id: req.params.id, team_id: req.params.team_id } });
if (!preset) return res.status(404).json({ message: "Preset not found" });
if (!admin && preset.created_by !== req.user.id) return res.status(403).json({ message: "Access denied" });
req.reportThemePreset = preset;
}
return next();
} catch {
return res.status(500).json({ message: "Presets could not be loaded. Try again." });
}
};
const respond = (action) => async (req, res) => {
try {
return res.json(await action(req));
} catch (error) {
return res.status(error.statusCode || 500).json({ message: error.statusCode ? error.message : "The preset could not be saved. Try again." });
}
};
app.get(base, verifyToken, authorize, respond((req) => db.ReportThemePreset.findAll({
where: { team_id: req.params.team_id }, order: [["name", "ASC"], ["id", "ASC"]],
})));
app.post(base, verifyToken, authorize, respond((req) => createPreset(req.params.team_id, req.user.id, req.body)));
app.put(`${base}/:id`, verifyToken, authorize, respond((req) => changePreset(req.reportThemePreset, req.body)));
app.delete(`${base}/:id`, verifyToken, authorize, respond((req) => changePreset(req.reportThemePreset, req.body, true)));
return (req, res, next) => {
next();
};
};