89 lines
3.3 KiB
TypeScript
89 lines
3.3 KiB
TypeScript
|
import Application from "../src/Application";
|
||
|
import Migration, {MigrationType} from "../src/db/Migration";
|
||
|
import ExpressAppComponent from "../src/components/ExpressAppComponent";
|
||
|
import RedisComponent from "../src/components/RedisComponent";
|
||
|
import MysqlComponent from "../src/components/MysqlComponent";
|
||
|
import NunjucksComponent from "../src/components/NunjucksComponent";
|
||
|
import LogRequestsComponent from "../src/components/LogRequestsComponent";
|
||
|
import MailComponent from "../src/components/MailComponent";
|
||
|
import SessionComponent from "../src/components/SessionComponent";
|
||
|
import AuthComponent from "../src/auth/AuthComponent";
|
||
|
import FormHelperComponent from "../src/components/FormHelperComponent";
|
||
|
import RedirectBackComponent from "../src/components/RedirectBackComponent";
|
||
|
import ServeStaticDirectoryComponent from "../src/components/ServeStaticDirectoryComponent";
|
||
|
import {Express} from "express";
|
||
|
import MagicLinkAuthMethod from "../src/auth/magic_link/MagicLinkAuthMethod";
|
||
|
import PasswordAuthMethod from "../src/auth/password/PasswordAuthMethod";
|
||
|
import {MAGIC_LINK_MAIL} from "./Mails";
|
||
|
import packageJson = require('../package.json');
|
||
|
import CreateMigrationsTable from "./migrations/CreateMigrationsTable";
|
||
|
import CreateUsersAndUserEmailsTable from "./auth/migrations/CreateUsersAndUserEmailsTable";
|
||
|
import CreateMagicLinksTableMigration from "./auth/magic_link/CreateMagicLinksTableMigration";
|
||
|
|
||
|
export const MIGRATIONS = [
|
||
|
CreateMigrationsTable,
|
||
|
CreateUsersAndUserEmailsTable,
|
||
|
CreateMagicLinksTableMigration,
|
||
|
];
|
||
|
|
||
|
export default class TestApp extends Application {
|
||
|
private readonly addr: string;
|
||
|
private readonly port: number;
|
||
|
private expressAppComponent?: ExpressAppComponent;
|
||
|
|
||
|
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 {
|
||
|
this.expressAppComponent = new ExpressAppComponent(this.addr, this.port);
|
||
|
const redisComponent = new RedisComponent();
|
||
|
const mysqlComponent = new MysqlComponent();
|
||
|
|
||
|
// Base
|
||
|
this.use(this.expressAppComponent);
|
||
|
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 RedirectBackComponent());
|
||
|
|
||
|
// Services
|
||
|
this.use(mysqlComponent);
|
||
|
this.use(new MailComponent());
|
||
|
|
||
|
// Session
|
||
|
this.use(redisComponent);
|
||
|
this.use(new SessionComponent(redisComponent));
|
||
|
|
||
|
// Auth
|
||
|
this.use(new AuthComponent(this, new MagicLinkAuthMethod(this, MAGIC_LINK_MAIL), new PasswordAuthMethod(this)));
|
||
|
|
||
|
// Utils
|
||
|
this.use(new FormHelperComponent());
|
||
|
}
|
||
|
|
||
|
protected registerWebSocketListeners?(): void;
|
||
|
|
||
|
protected registerControllers?(): void;
|
||
|
|
||
|
public getExpressApp(): Express {
|
||
|
return this.as(ExpressAppComponent).getExpressApp();
|
||
|
}
|
||
|
}
|