123 lines
4.8 KiB
TypeScript
123 lines
4.8 KiB
TypeScript
import Application from "./Application";
|
|
import Migration, {MigrationType} from "./db/Migration";
|
|
import ExpressAppComponent from "./components/ExpressAppComponent";
|
|
import RedisComponent from "./components/RedisComponent";
|
|
import MysqlComponent from "./components/MysqlComponent";
|
|
import NunjucksComponent from "./components/NunjucksComponent";
|
|
import LogRequestsComponent from "./components/LogRequestsComponent";
|
|
import MailComponent from "./components/MailComponent";
|
|
import SessionComponent from "./components/SessionComponent";
|
|
import AuthComponent from "./auth/AuthComponent";
|
|
import FormHelperComponent from "./components/FormHelperComponent";
|
|
import ServeStaticDirectoryComponent from "./components/ServeStaticDirectoryComponent";
|
|
import {Express} from "express";
|
|
import MagicLinkAuthMethod from "./auth/magic_link/MagicLinkAuthMethod";
|
|
import PasswordAuthMethod from "./auth/password/PasswordAuthMethod";
|
|
import {MAGIC_LINK_MAIL} from "./Mails";
|
|
import CreateMigrationsTable from "./migrations/CreateMigrationsTable";
|
|
import CreateUsersAndUserEmailsTableMigration from "./auth/migrations/CreateUsersAndUserEmailsTableMigration";
|
|
import CreateMagicLinksTableMigration from "./auth/magic_link/CreateMagicLinksTableMigration";
|
|
import AuthController from "./auth/AuthController";
|
|
import MagicLinkWebSocketListener from "./auth/magic_link/MagicLinkWebSocketListener";
|
|
import MagicLinkController from "./auth/magic_link/MagicLinkController";
|
|
import AddPasswordToUsersMigration from "./auth/password/AddPasswordToUsersMigration";
|
|
import AddNameToUsersMigration from "./auth/migrations/AddNameToUsersMigration";
|
|
import CsrfProtectionComponent from "./components/CsrfProtectionComponent";
|
|
import MailController from "./mail/MailController";
|
|
import WebSocketServerComponent from "./components/WebSocketServerComponent";
|
|
import Controller from "./Controller";
|
|
import AccountController from "./auth/AccountController";
|
|
import MakeMagicLinksSessionNotUniqueMigration from "./auth/magic_link/MakeMagicLinksSessionNotUniqueMigration";
|
|
import AddUsedToMagicLinksMigration from "./auth/magic_link/AddUsedToMagicLinksMigration";
|
|
import packageJson = require('./package.json');
|
|
import PreviousUrlComponent from "./components/PreviousUrlComponent";
|
|
|
|
export const MIGRATIONS = [
|
|
CreateMigrationsTable,
|
|
CreateUsersAndUserEmailsTableMigration,
|
|
AddPasswordToUsersMigration,
|
|
CreateMagicLinksTableMigration,
|
|
AddNameToUsersMigration,
|
|
MakeMagicLinksSessionNotUniqueMigration,
|
|
AddUsedToMagicLinksMigration,
|
|
];
|
|
|
|
export default class TestApp extends Application {
|
|
private readonly addr: string;
|
|
private readonly port: number;
|
|
|
|
public constructor(addr: string, port: number) {
|
|
super(packageJson.version, true);
|
|
this.addr = addr;
|
|
this.port = port;
|
|
}
|
|
|
|
protected getMigrations(): MigrationType<Migration>[] {
|
|
return MIGRATIONS;
|
|
}
|
|
|
|
protected async init(): Promise<void> {
|
|
this.registerComponents();
|
|
this.registerWebSocketListeners();
|
|
this.registerControllers();
|
|
}
|
|
|
|
protected registerComponents(): void {
|
|
// Base
|
|
this.use(new ExpressAppComponent(this.addr, this.port));
|
|
this.use(new LogRequestsComponent());
|
|
|
|
// Static files
|
|
this.use(new ServeStaticDirectoryComponent('public'));
|
|
|
|
// Dynamic views and routes
|
|
this.use(new NunjucksComponent(['test/views', 'views']));
|
|
this.use(new PreviousUrlComponent());
|
|
|
|
// Services
|
|
this.use(new MysqlComponent());
|
|
this.use(new MailComponent());
|
|
|
|
// Session
|
|
this.use(new RedisComponent());
|
|
this.use(new SessionComponent(this.as(RedisComponent)));
|
|
|
|
// Utils
|
|
this.use(new FormHelperComponent());
|
|
|
|
// Middlewares
|
|
this.use(new CsrfProtectionComponent());
|
|
|
|
// Auth
|
|
this.use(new AuthComponent(this, new MagicLinkAuthMethod(this, MAGIC_LINK_MAIL), new PasswordAuthMethod(this)));
|
|
|
|
// WebSocket server
|
|
this.use(new WebSocketServerComponent(this, this.as(ExpressAppComponent), this.as(RedisComponent)));
|
|
}
|
|
|
|
protected registerWebSocketListeners(): void {
|
|
this.use(new MagicLinkWebSocketListener());
|
|
}
|
|
|
|
protected registerControllers(): void {
|
|
this.use(new MailController());
|
|
this.use(new AuthController());
|
|
this.use(new AccountController());
|
|
|
|
this.use(new MagicLinkController(this.as<MagicLinkWebSocketListener<this>>(MagicLinkWebSocketListener)));
|
|
|
|
// Special home controller
|
|
this.use(new class extends Controller {
|
|
public routes(): void {
|
|
this.get('/', (req, res) => {
|
|
res.render('home');
|
|
}, 'home');
|
|
}
|
|
}());
|
|
}
|
|
|
|
public getExpressApp(): Express {
|
|
return this.as(ExpressAppComponent).getExpressApp();
|
|
}
|
|
}
|