Newer
Older
taehui / taehui-www / src / index.ts
@Taehui Taehui on 13 Mar 1 KB v1.0.0
import Koa from "koa";
import koaHelmet from "koa-helmet";
import { mkdir, readdir, unlink } from "fs";
import { join } from "path";
import { promisify } from "util";

import routers from "src/routers";
import DB from "src/system/DB";
import Logger from "src/system/Logger";
import { AVATAR_ENTRY_PATH, ESSAY_ENTRY_PATH } from "src/TaehuiComponent";

const pm = promisify(mkdir);
const pr = promisify(readdir);
const pu = promisify(unlink);

const koa = new Koa();

koa.use(koaHelmet());

koa.use(async (ctx, next) => {
  const {
    request,
    request: { method, url, headers },
  } = ctx;

  if (headers["x-real-ip"]) {
    request.ip = headers["x-real-ip"] as string;
  }

  const { ip } = request;

  try {
    await next();
  } catch (e) {
    Logger.error(e);
    ctx.status = 500;
  } finally {
    const { status } = ctx;
    Logger.info(`[${ip}] ${method} ${url} ${status}`);
  }
});

koa.use(routers.routes());

(async () => {
  await DB.setBaseDB();

  await pm(ESSAY_ENTRY_PATH, { recursive: true });
  await pm(AVATAR_ENTRY_PATH, { recursive: true });

  const fileNames = await pr(ESSAY_ENTRY_PATH);
  for (const fileName of fileNames) {
    if (!(await DB.isValidFile(fileName))) {
      await pu(join(ESSAY_ENTRY_PATH, fileName));
      Logger.info(`Wiped ${fileName}`);
    }
  }

  const taehui = koa.listen(10100, () => {
    process.send?.("ready");
    Logger.info("Loaded Taehui");
  });

  process.on("SIGINT", () => {
    taehui.close((err) => {
      process.exit(err ? 1 : 0);
    });
  });
})();