sourceapprouter.js

import Database from "better-sqlite3";
import express from "express";
import createError from "http-errors";

import grimm from "./grimm.js";
import { rootFolder } from "./helpers.js";

import authRouter from "./routes/auth.js";
import codexRouter from "./routes/codex.js";
import commentRouter from "./routes/comment.js";
import indexRouter from "./routes/main.js";
import planterRouter from "./routes/planter.js";
import gardenRouter from "./routes/garden.js";
import latbsRouter from "./routes/latbs.js";
import redirectRouter from "./routes/redirects.js";
import sourceRouter from "./routes/source.js";
import statsRouter from "./routes/stats.js";

const router = express.Router();
const db = new Database("./db/site.db");
db.pragma("journal_mode = DELETE");

const auth = permission => {
	if (permission) {
		return (req, res, next) => {
			if (req?.user) {
				req.user.prefs = db
					.prepare("SELECT * FROM user_preferences WHERE userID = ?")
					.get(req.user.userID);
			}
			if (req?.user?.permissions === permission) {
				return next();
			}
			return next(createError(403));
		};
	} else {
		return (req, res, next) => {
			if (req?.user) {
				req.user.prefs = db
					.prepare("SELECT * FROM user_preferences WHERE userID = ?")
					.get(req.user.userID);
			}
			if (req.isAuthenticated()) {
				return next();
			}
			return next(createError(403));
		};
	}
};

router.post("/post-comment", commentRouter);

router.use("/x/stats", auth("admin"), statsRouter);
router.use(
	"/x/stats",
	auth("admin"),
	express.static(`${rootFolder}/hypertext/admin/stats`)
);

router.get("/x/sp", auth("admin"), (req, res, next) =>
	res.render("../admin/startpage/en")
);
router.use(
	"/x/sp",
	auth("admin"),
	express.static(`${rootFolder}/hypertext/admin/startpage`)
);

router.use("/x/planter", auth("admin"), planterRouter);
router.use(
	"/x/planter",
	auth("admin"),
	express.static(`${rootFolder}/hypertext/admin/planter`)
);

router.get('/x/ip', (req, res) => {
	res.send(req.headers["x-real-ip"]);
});

router.use("/", authRouter);

router.use("/garden", gardenRouter);

router.use("/latbs", latbsRouter);

router.use("/codex", codexRouter);

router.use("/source", sourceRouter);

router.use("/", indexRouter);

router.use("/", redirectRouter);

router.use(express.static(`${rootFolder}/hypertext/public`));

// catch 404 and forward to error handler
router.use((req, res, next) => {
	next(createError(req.url.startsWith("/x/") ? 403 : 404));
});

// error handler
router.use((err, req, res, next) => {
	if (err.message != "Not Found") {
		console.error(err.stack);
	}

	res.locals.message = err.message;
	res.locals.error = err;

	// render the error page
	return res
		.status(err.status || 500)
		.render(`error/${[403, 404].includes(err.status) ? err.status : 500}`, {
			lang: "en",
			slug: err.status,
			baseDomain: "satyrs.eu",
			translates: [],
			grimm: grimm,
			tr: grimm.translator("en")
		});
});

export default router;