sourceapprouteslatbs.js

import Database from "better-sqlite3";
import express from "express";

import grimm from "../grimm.js";
import {
	getRubricFilters,
	comparePages,
	getComments,
	highlightFilter,
	prettyRender,
	rubric
} from "../helpers.js";

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

const filters = Object.assign(getRubricFilters(rubric), highlightFilter);

const archives = () => {
	const articles = db
		.prepare(
			`Select pagesets.pagesetID, editions.editionID, editions.lang, editions.title
			From editions
			Join pagesets
			On editions.translates = pagesets.pagesetID
			Where editions.translates Like 'latbs%'`
		)
		.all();

	let archive = {};

	for (const art of articles) {
		art.slug = art.editionID.replace("latbs/", "");
		art.translates = art.pagesetID.replace("latbs/", "");

		if (art.translates in archive) {
			archive[art.translates][art.lang] = art;
		} else {
			archive[art.translates] = {};
			archive[art.translates][art.lang] = art;
		}
	}

	return archive;
};

const displayPage = async (slug, res, next) => {
	const page = db
		.prepare(
			`Select * From editions
			Join pagesets
			On editions.translates = pagesets.pagesetID
			Where editions.editionID = ?`
		)
		.get(slug);

	if (page === undefined) {
		return next();
	}

	page.cache = page?.cache === 1 || page?.cache === true;

	const comments = getComments(slug);

	const translations = page.translates
		? db
				.prepare(
					`Select * From editions
					Join pagesets
					On editions.translates = pagesets.pagesetID
					Where editions.translates = ?`
				)
				.all(page.translates)
				.sort(comparePages)
		: [];

	const tags =
		db
			.prepare(
				`Select tags.tagID As tagID, tags.defaultName As defaultName
				From taggings
				Inner Join tags
				On taggings.tag = tags.tagID
				Where taggings.pageset = ?`
			)
			.all(page.editionID) || [];

	const toSendOver = {
		slug: slug,
		comments: comments,
		translations: translations,
		tags: tags,

		grimm: grimm,
		tr: grimm.translator(page.lang),

		baseDomain: "satyrs.eu",

		qua: text => `/${page.translates}/${text}`, // Short for “qualify”
		archives: archives(),
		compileDebug: true,
		filters: filters
	};

	try {
		toSendOver.annexe = (
			await import(`../../hypertext/public/${page.translates}/annexe`)
		).default;
	} catch (err) {}

	Object.assign(toSendOver, page);

	return prettyRender(
		res,
		next,
		`${page.translates}/${page.lang}`,
		toSendOver
	);
};

router.get(
	"/:pageSlug([^\\.]+)",
	async (req, res, next) =>
		await displayPage(
			"latbs/" + req.params.pageSlug.replace(/\/$/, ""),
			res,
			next
		)
);

/* GET home page. */
router.get(
	"/",
	async (req, res, next) => await displayPage("latbs", res, next)
);

export default router;