diff options
author | Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> | 2021-08-12 20:09:35 +0200 |
---|---|---|
committer | Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> | 2021-08-12 20:09:35 +0200 |
commit | 08e837bf5559e9680fc8cb99bd05b93f8eb2cac5 (patch) | |
tree | 1eadc038773b025275d7b751265f741b09ca92ab /api/src/Server.ts | |
parent | npm i @fosscord/server-util@1.3.52 (diff) | |
download | server-08e837bf5559e9680fc8cb99bd05b93f8eb2cac5.tar.xz |
:sparkles: api
Diffstat (limited to 'api/src/Server.ts')
-rw-r--r-- | api/src/Server.ts | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/api/src/Server.ts b/api/src/Server.ts new file mode 100644 index 00000000..7299425a --- /dev/null +++ b/api/src/Server.ts @@ -0,0 +1,109 @@ +import "missing-native-js-functions"; +import fs from "fs"; +import { Connection } from "mongoose"; +import { Server, ServerOptions } from "lambert-server"; +import { Authentication, CORS } from "./middlewares/"; +import { Config, db, RabbitMQ } from "@fosscord/server-util"; +import i18next from "i18next"; +import i18nextMiddleware, { I18next } from "i18next-http-middleware"; +import i18nextBackend from "i18next-node-fs-backend"; +import { ErrorHandler } from "./middlewares/ErrorHandler"; +import { BodyParser } from "./middlewares/BodyParser"; +import express, { Router, Request, Response } from "express"; +import mongoose from "mongoose"; +import path from "path"; +import { initRateLimits } from "./middlewares/RateLimit"; +import TestClient from "./middlewares/TestClient"; + +// this will return the new updated document for findOneAndUpdate +mongoose.set("returnOriginal", false); // https://mongoosejs.com/docs/api/model.html#model_Model.findOneAndUpdate + +export interface FosscordServerOptions extends ServerOptions {} + +declare global { + namespace Express { + interface Request { + // @ts-ignore + server: FosscordServer; + } + } +} + +export class FosscordServer extends Server { + public declare options: FosscordServerOptions; + + constructor(opts?: Partial<FosscordServerOptions>) { + // @ts-ignore + super({ ...opts, errorHandler: false, jsonBody: false }); + } + + async setupSchema() { + return Promise.all([ + db.collection("users").createIndex({ id: 1 }, { unique: true }), + db.collection("messages").createIndex({ id: 1 }, { unique: true }), + db.collection("channels").createIndex({ id: 1 }, { unique: true }), + db.collection("guilds").createIndex({ id: 1 }, { unique: true }), + db.collection("members").createIndex({ id: 1, guild_id: 1 }, { unique: true }), + db.collection("roles").createIndex({ id: 1 }, { unique: true }), + db.collection("emojis").createIndex({ id: 1 }, { unique: true }), + db.collection("invites").createIndex({ code: 1 }, { unique: true }), + db.collection("invites").createIndex({ expires_at: 1 }, { expireAfterSeconds: 0 }), // after 0 seconds of expires_at the invite will get delete + db.collection("ratelimits").createIndex({ expires_at: 1 }, { expireAfterSeconds: 0 }) + ]); + } + + async start() { + // @ts-ignore + await (db as Promise<Connection>); + await this.setupSchema(); + console.log("[Database] connected"); + await Config.init(); + await RabbitMQ.init(); + + this.app.use(CORS); + this.app.use(Authentication); + this.app.use(BodyParser({ inflate: true, limit: 1024 * 1024 * 10 })); // 2MB + const languages = fs.readdirSync(path.join(__dirname, "..", "locales")); + const namespaces = fs.readdirSync(path.join(__dirname, "..", "locales", "en")); + const ns = namespaces.filter((x) => x.endsWith(".json")).map((x) => x.slice(0, x.length - 5)); + + await i18next + .use(i18nextBackend) + .use(i18nextMiddleware.LanguageDetector) + .init({ + preload: languages, + // debug: true, + fallbackLng: "en", + ns, + backend: { + loadPath: __dirname + "/../locales/{{lng}}/{{ns}}.json" + }, + load: "all" + }); + this.app.use(i18nextMiddleware.handle(i18next, {})); + + const app = this.app; + const api = Router(); + // @ts-ignore + this.app = api; + + initRateLimits(api); + this.routes = await this.registerRoutes(path.join(__dirname, "routes", "/")); + app.use("/api/v8", api); + app.use("/api/v9", api); + app.use("/api", api); // allow unversioned requests + + api.get("*", (req: Request, res: Response) => { + res.status(404).json({ + message: "404: Not Found", + code: 0 + }); + }); + + this.app = app; + this.app.use(ErrorHandler); + TestClient(this.app); + + return super.start(); + } +} |