jormungandr-bite/packages/backend/src/server/api/web/index.ts
2023-12-16 17:43:29 +01:00

63 lines
1.7 KiB
TypeScript

import Router from "@koa/router";
import Koa, { DefaultState, Context, Middleware } from "koa";
import { bootstrapControllers, Ctx } from "@iceshrimp/koa-openapi";
import { ILocalUser } from "@/models/entities/user.js";
import { AccessToken } from "@/models/entities/access-token.js";
import { UserController } from "@/server/api/web/controllers/user.js";
import { RatelimitMiddleware } from "@/server/api/web/middleware/rate-limit.js";
import { AuthenticationMiddleware } from "@/server/api/web/middleware/auth.js";
import { ErrorHandlingMiddleware } from "@/server/api/web/middleware/error-handling.js";
export type WebRouter = Router<WebState, WebContext>;
export type WebMiddleware = Middleware<WebState, WebContext>;
export interface WebState extends DefaultState {}
export interface WebContext extends Context {
user: ILocalUser | null;
token: AccessToken | null;
}
export class WebAPI {
private readonly router: WebRouter;
constructor(prefix: string) {
this.router = new Router<DefaultState, WebContext>({ prefix });
}
public async setup(app: Koa): Promise<void> {
await bootstrapControllers({
app: app,
router: this.router,
attachRoutes: true,
errorHandler: ErrorHandlingMiddleware,
controllers: [
UserController,
],
flow: [
AuthenticationMiddleware,
RatelimitMiddleware,
],
versions: {
1: true
},
bodyParser: {
multipart: true,
},
openAPI: {
enabled: true,
publicURL: '/api/iceshrimp',
options: {
title: "Iceshrimp Web API documentation"
},
spec: {
info: {
title: "Iceshrimp Web API",
description: "Documentation for using Iceshrimp's Web API",
version: "1.0.0"
}
}
},
});
}
}