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 PreviousUrlComponent from "./components/PreviousUrlComponent"; import AddNameChangedAtToUsersMigration from "./auth/migrations/AddNameChangedAtToUsersMigration"; import BackendController from "./helpers/BackendController"; import FrontendToolsComponent from "./components/FrontendToolsComponent"; import SvelteViewEngine from "./frontend/SvelteViewEngine"; import packageJson = require('./package.json'); export const MIGRATIONS = [ CreateMigrationsTable, CreateUsersAndUserEmailsTableMigration, AddPasswordToUsersMigration, CreateMagicLinksTableMigration, AddNameToUsersMigration, MakeMagicLinksSessionNotUniqueMigration, AddUsedToMagicLinksMigration, AddNameChangedAtToUsersMigration, ]; export default class TestApp extends Application { private readonly addr: string; private readonly port: number; public constructor(addr: string, port: number, ignoreCommandLine: boolean = false) { super(packageJson.version, ignoreCommandLine); this.addr = addr; this.port = port; } protected getMigrations(): MigrationType[] { return MIGRATIONS; } protected async init(): Promise { 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 FrontendToolsComponent(new SvelteViewEngine('build/views', 'public', '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 BackendController()); this.use(new MagicLinkController(this.as>(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(); } }