diff --git a/backend/controllers/resourceController.js b/backend/controllers/resourceController.js
index 4bfa3a5..f935f7c 100644
--- a/backend/controllers/resourceController.js
+++ b/backend/controllers/resourceController.js
@@ -1,36 +1,158 @@
const pool = require("../db");
-exports.getActive = async (req, res) => {
- const [rows] = await pool.query(
- "SELECT * FROM resources WHERE status != 'gekündigt'"
- );
- res.json(rows);
+/* ACTIVE */
+exports.getActive = async (req,res)=>{
+
+const [rows] = await pool.query(`
+SELECT
+r.*,
+JSON_ARRAYAGG(
+JSON_OBJECT(
+'id', ip.id,
+'ip', ip.ip,
+'type', ip.type,
+'comment', ip.comment
+)
+) AS ips
+FROM resources r
+LEFT JOIN resource_ips ip ON r.id = ip.resource_id
+WHERE r.status != 'gekündigt'
+GROUP BY r.id
+`);
+
+rows.forEach(r=>{
+
+/* JSON string → array */
+if(typeof r.ips === "string"){
+try{
+r.ips = JSON.parse(r.ips);
+}catch{
+r.ips=[];
+}
+}
+
+/* remove null entries */
+if(r.ips && r.ips[0] && r.ips[0].id === null){
+r.ips=[];
+}
+
+});
+
+res.json(rows);
+
};
-exports.getCancelled = async (req, res) => {
- const [rows] = await pool.query(
- "SELECT * FROM resources WHERE status = 'gekündigt'"
- );
- res.json(rows);
+/* CANCELLED */
+
+exports.getCancelled = async (req,res)=>{
+
+const [rows] = await pool.query(`
+SELECT
+r.*,
+JSON_ARRAYAGG(
+JSON_OBJECT(
+'id', ip.id,
+'ip', ip.ip,
+'type', ip.type,
+'comment', ip.comment
+)
+) AS ips
+FROM resources r
+LEFT JOIN resource_ips ip ON r.id = ip.resource_id
+WHERE r.status = 'gekündigt'
+GROUP BY r.id
+`);
+
+rows.forEach(r=>{
+
+if(typeof r.ips === "string"){
+try{
+r.ips = JSON.parse(r.ips);
+}catch{
+r.ips=[];
+}
+}
+
+if(r.ips && r.ips[0] && r.ips[0].id === null){
+r.ips=[];
+}
+
+});
+
+res.json(rows);
+
};
-exports.create = async (req, res) => {
- await pool.query("INSERT INTO resources SET ?", req.body);
- res.json({ message: "Inserted" });
+/* CREATE */
+
+exports.create = async (req,res)=>{
+
+const clean = v => v === "" ? null : v;
+
+const data = {
+name: req.body.name,
+produkt: clean(req.body.produkt),
+provider: clean(req.body.provider),
+art: clean(req.body.art),
+
+cpu: clean(req.body.cpu),
+ram: clean(req.body.ram),
+disk: clean(req.body.disk),
+os: clean(req.body.os),
+
+ipv6_net: clean(req.body.ipv6_net),
+providername: clean(req.body.providername),
+
+kosten_monat: clean(req.body.kosten_monat),
+kosten_jahr: clean(req.body.kosten_jahr),
+laufzeit_monate: clean(req.body.laufzeit_monate),
+
+bestelldatum: clean(req.body.bestelldatum),
+kuendbar_ab: clean(req.body.kuendbar_ab),
+
+status: clean(req.body.status),
+kuendigungsdatum: clean(req.body.kuendigungsdatum),
+
+bemerkung: clean(req.body.bemerkung)
};
-exports.update = async (req, res) => {
- await pool.query(
- "UPDATE resources SET ? WHERE id = ?",
- [req.body, req.params.id]
- );
- res.json({ message: "Updated" });
+await pool.query("INSERT INTO resources SET ?",data);
+
+res.json({message:"created"});
+
};
-exports.remove = async (req, res) => {
- await pool.query(
- "DELETE FROM resources WHERE id = ?",
- [req.params.id]
- );
- res.json({ message: "Deleted" });
+
+
+/* UPDATE */
+
+exports.update = async (req,res)=>{
+
+const clean = v => v === "" ? null : v;
+
+Object.keys(req.body).forEach(k=>{
+req.body[k]=clean(req.body[k]);
+});
+
+await pool.query(
+"UPDATE resources SET ? WHERE id=?",
+[req.body,req.params.id]
+);
+
+res.json({message:"updated"});
+
+};
+
+
+/* DELETE */
+
+exports.remove = async (req,res)=>{
+
+await pool.query(
+"DELETE FROM resources WHERE id=?",
+[req.params.id]
+);
+
+res.json({message:"deleted"});
+
};
diff --git a/backend/public/index.html b/backend/public/index.html
index 9bd65b0..ecb278c 100644
--- a/backend/public/index.html
+++ b/backend/public/index.html
@@ -1,326 +1,533 @@
-```html
-
+
-
-Resource Manager
-
+
+ResMan
-
+
Resource Manager
-
Resource Manager
+
-
-
+
Active Resources
-
+
+
+
+
Cancelled Resources
+
+
+
+
+
+
+| Name |
+Provider |
+Produkt |
+CPU |
+RAM |
+Disk |
+IPs |
+Actions |
+
+
+
+
+
+
+
+
+
+
+
+
-
-
Aktive Ressourcen
-
-
-
Gekündigte Ressourcen
-
-
-
-
diff --git a/backend/server.js b/backend/server.js
index 35b3118..8298702 100644
--- a/backend/server.js
+++ b/backend/server.js
@@ -7,6 +7,17 @@ const ipRoutes = require("./routes/ips");
const app = express();
+process.on("uncaughtException", (err) => {
+ console.error("UNCAUGHT EXCEPTION");
+ console.error(err);
+});
+
+process.on("unhandledRejection", (err) => {
+ console.error("UNHANDLED PROMISE REJECTION");
+ console.error(err);
+});
+
+
app.use(cors());
app.use(express.json());
@@ -18,6 +29,16 @@ app.use("/resman/api/resources", resourceRoutes);
app.use("/resman/api", ipRoutes);
+app.use((err, req, res, next) => {
+
+console.error("EXPRESS ERROR:");
+console.error(err);
+
+res.status(500).json({
+error: "Internal Server Error"
+});
+
+});
app.listen(3000, () => {
console.log("ResMan running on port 3000");