Building phase one

This commit is contained in:
2026-07-10 18:23:48 +02:00
parent 09ce18cbb7
commit ea2a0b3e36
41 changed files with 28591 additions and 2 deletions

3
backend/.env.production Normal file
View File

@@ -0,0 +1,3 @@
PORT=5000
DB_URI=mongodb://192.168.1.7:27017/simplepublisher
NODE_ENV=production

16
backend/.gitignore vendored Normal file
View File

@@ -0,0 +1,16 @@
# Node dependencies
node_modules
# Logs
logs
*.log
# Misc
.DS_Store
.fleet
.idea
# Local env files
.env
.env.*
!.env.production

1693
backend/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

24
backend/package.json Normal file
View File

@@ -0,0 +1,24 @@
{
"name": "backend",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node src/index.js",
"dev": "nodemon src/index.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"type": "commonjs",
"dependencies": {
"cors": "^2.8.6",
"dotenv": "^17.4.2",
"express": "^5.2.1",
"mongoose": "^9.7.4",
"socket.io": "^4.8.3"
},
"devDependencies": {
"nodemon": "^3.1.14"
}
}

14
backend/src/db.js Normal file
View File

@@ -0,0 +1,14 @@
const mongoose = require("mongoose");
const connectDB = async () => {
try {
await mongoose.connect(process.env.DB_URI);
console.log("MongoDB connected");
} catch (error) {
console.error("MongoDB connection error:", error);
process.exit(1);
}
};
module.exports = connectDB;

66
backend/src/index.js Normal file
View File

@@ -0,0 +1,66 @@
const express = require("express");
const cors = require("cors");
const mongoose = require("mongoose");
const { createServer } = require("http");
const { Server } = require("socket.io");
const dotenv = require("dotenv");
if (process.env.NODE_ENV) {
dotenv.config({
path: `.env.${process.env.NODE_ENV}`,
});
} else {
dotenv.config();
}
const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, {
path: '/api/socket.io',
cors: {
origin: true,
credentials: true,
},
});
const connectDB = require("./db");
// const gridCellsRouter = require("./routes/gridCells");
// gridCellsRouter.setIO(io);
// connect database
connectDB();
app.use(
cors({
origin: true,
credentials: true,
})
);
app.use(express.json());
// Socket.IO
io.on("connection", (socket) => {
console.log(`Socket connected: ${socket.id}`);
socket.on("disconnect", () => {
console.log(`Socket disconnected: ${socket.id}`);
});
});
app.get("/api/test", (req, res) => {
console.log("Hey");
res.json({ message: "Hello from backend!" });
});
// Site management routes
const sitesRouter = require("./routes/sites");
app.use("/api/sites", sitesRouter);
const PORT = process.env.PORT || 5000;
httpServer.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});

View File

@@ -0,0 +1,16 @@
const mongoose = require("mongoose");
const siteSchema = new mongoose.Schema(
{
id: { type: String, required: true, unique: true, index: true },
name: { type: String, required: true, trim: true },
url: { type: String, default: "", trim: true },
description: { type: String, default: "", trim: true },
themeColor: { type: String, default: "#2563eb" },
targetWindow: { type: String, default: "_blank", enum: ["_blank", "_self"] },
enabled: { type: Boolean, default: true },
},
{ timestamps: true }
);
module.exports = mongoose.model("Site", siteSchema);

View File

@@ -0,0 +1,52 @@
const express = require("express");
const Site = require("../models/Site");
const router = express.Router();
// GET /api/sites - List all sites
router.get("/", async (req, res) => {
try {
const sites = await Site.find().sort({ createdAt: -1 });
res.json(sites);
} catch (err) {
res.status(500).json({ error: err.message });
}
});
// POST /api/sites - Create a new site
router.post("/", async (req, res) => {
try {
const { id, name, url, description, themeColor, targetWindow, enabled } = req.body;
const site = new Site({ id, name, url, description, themeColor, targetWindow, enabled });
await site.save();
res.status(201).json(site);
} catch (err) {
res.status(500).json({ error: err.message });
}
});
// PUT /api/sites/:id - Update a site
router.put("/:id", async (req, res) => {
try {
const { name, url, description, themeColor, targetWindow, enabled } = req.body;
const updates = { name, url, description, themeColor, targetWindow, enabled };
const site = await Site.findOneAndUpdate({ id: req.params.id }, updates, { new: true, runValidators: true });
if (!site) return res.status(404).json({ error: "Site not found" });
res.json(site);
} catch (err) {
res.status(500).json({ error: err.message });
}
});
// DELETE /api/sites/:id - Delete a site
router.delete("/:id", async (req, res) => {
try {
const site = await Site.findOneAndDelete({ id: req.params.id });
if (!site) return res.status(404).json({ error: "Site not found" });
res.json({ message: "Site deleted", id: site.id });
} catch (err) {
res.status(500).json({ error: err.message });
}
});
module.exports = router;