shadowfacts.net/lib/index.ts

130 lines
3.2 KiB
TypeScript
Raw Permalink Normal View History

import { Page } from "./metadata";
import generators from "./generate";
2019-01-04 18:14:53 +00:00
2019-02-20 23:07:29 +00:00
import express, { Router } from "express";
import morgan from "morgan";
import bodyParser from "body-parser";
import activitypub from "./activitypub";
2019-02-20 23:07:29 +00:00
import validateHttpSig from "./activitypub/middleware/http-signature";
import "reflect-metadata";
import { createConnection} from "typeorm";
2019-08-17 19:25:19 +00:00
import * as path from "path";
2021-09-09 14:31:03 +00:00
import chokidar from "chokidar";
async function generate(): Promise<Page[]> {
2019-01-04 18:36:40 +00:00
generators.copy();
2019-01-04 18:14:53 +00:00
generators.css();
2019-09-17 19:30:47 +00:00
generators.errors();
2019-01-04 18:14:53 +00:00
2020-07-09 18:10:39 +00:00
generators.tutorials().then(generators.rss.tutorials);
2019-01-04 18:14:53 +00:00
const posts = await generators.posts();
generators.homepage(posts);
2020-01-28 00:31:59 +00:00
generators.years(posts);
2020-07-09 18:10:39 +00:00
generators.rss.posts(posts)
2020-08-29 16:09:42 +00:00
generators.tags(posts).then(generators.rss.tags);
2020-08-22 02:37:57 +00:00
generators.archive(posts);
2019-02-18 18:47:43 +00:00
return posts;
2019-01-04 18:14:53 +00:00
}
2021-09-09 14:31:03 +00:00
function watch() {
const watcher = chokidar.watch("site/", {
ignoreInitial: true,
});
watcher.on("all", (event, path) => {
console.log(`Regenerating due to ${event} ${path}`);
// todo: this could be smarter about not regenerating everything
generate();
});
}
(async () => {
2021-09-09 14:31:03 +00:00
if (process.env.NODE_ENV === undefined) {
process.env.NODE_ENV = "development";
}
const app = express();
2019-08-17 19:25:19 +00:00
app.use(morgan("dev"));
app.use(bodyParser.json({ type: "application/activity+json" }));
2022-05-16 04:41:01 +00:00
app.use(bodyParser.urlencoded());
2019-08-17 19:25:19 +00:00
const connection = await createConnection({
"type": "postgres",
"host": process.env.DB_HOST || "localhost",
"port": process.env.DB_PORT ? parseInt(process.env.DB_PORT) : 5432,
"username": process.env.DB_USERNAME || "blog",
"password": process.env.DB_PASSWORD || "blog",
"database": process.env.DB_DATABASE || "blog",
2019-08-17 19:25:19 +00:00
"synchronize": true,
"logging": true,
"entities": [
path.join(__dirname, "entity/**/*.{ts,js}")
],
"migrations": [
path.join(__dirname, "migration/**/*.{ts,js}")
],
"subscribers": [
path.join(__dirname, "subscriber/**/*.{ts,js}")
],
"cli": {
"entitiesDir": "lib/entity",
"migrationsDir": "lib/migration",
"subscribersDir": "lib/subscriber"
}
});
const posts = await generate();
2021-09-09 14:31:03 +00:00
if (process.env.NODE_ENV === "development") {
watch();
}
await activitypub.articles.setup(posts);
2022-05-16 04:41:01 +00:00
await activitypub.interact(app);
2019-02-20 23:07:29 +00:00
const apRouter = Router();
apRouter.use(validateHttpSig);
await activitypub.actor(apRouter);
2019-03-01 23:42:28 +00:00
activitypub.comments(apRouter);
2019-02-20 23:07:29 +00:00
activitypub.followers(apRouter);
activitypub.inbox(apRouter);
2019-09-17 18:36:54 +00:00
await activitypub.nodeinfo(apRouter);
2019-02-20 23:07:29 +00:00
activitypub.webfinger(apRouter);
activitypub.articles.route(apRouter);
app.use(apRouter);
app.use(express.static("out"));
2019-09-18 17:15:47 +00:00
// redirect posts with changed permalinks
for (const post of posts) {
if (post.metadata.oldPermalink) {
app.get(post.metadata.oldPermalink, (req, res) => {
res.status(301).redirect(post.metadata.permalink);
});
}
}
2019-09-17 19:30:47 +00:00
app.use((err, req, res, next) => {
console.error("Unhandled error:", err);
2019-09-17 19:30:47 +00:00
res.status(500).sendFile("500.html", {
root: "out"
});
});
app.use((req, res, next) => {
res.status(404).sendFile("404.html", {
root: "out"
});
});
const port = process.env.PORT || 8083;
2020-12-08 02:26:03 +00:00
app.listen(port, async () => {
console.log(`Listening on port ${port}`);
2020-12-08 02:26:03 +00:00
const toFederate = await activitypub.articles.toFederate();
activitypub.federate(toFederate);
});
})();