import Application from "swaf/Application"; import Migration, {MigrationType} from "swaf/db/Migration"; import ExpressAppComponent from "swaf/components/ExpressAppComponent"; import NunjucksComponent from "swaf/components/NunjucksComponent"; import MysqlComponent from "swaf/components/MysqlComponent"; import LogRequestsComponent from "swaf/components/LogRequestsComponent"; import RedisComponent from "swaf/components/RedisComponent"; import ServeStaticDirectoryComponent from "swaf/components/ServeStaticDirectoryComponent"; import MaintenanceComponent from "swaf/components/MaintenanceComponent"; import MailComponent from "swaf/components/MailComponent"; import SessionComponent from "swaf/components/SessionComponent"; import FormHelperComponent from "swaf/components/FormHelperComponent"; import CsrfProtectionComponent from "swaf/components/CsrfProtectionComponent"; import WebSocketServerComponent from "swaf/components/WebSocketServerComponent"; import HomeController from "./controllers/HomeController"; import AuthComponent from "swaf/auth/AuthComponent"; import LDAPServerComponent from "./LDAPServerComponent"; import AutoUpdateComponent from "swaf/components/AutoUpdateComponent"; import DummyMigration from "swaf/migrations/DummyMigration"; import DropLegacyLogsTable from "swaf/migrations/DropLegacyLogsTable"; import AccountMailboxController from "./controllers/AccountMailboxController"; import CreateMigrationsTable from "swaf/migrations/CreateMigrationsTable"; import MagicLinkWebSocketListener from "swaf/auth/magic_link/MagicLinkWebSocketListener"; import BackendController from "swaf/helpers/BackendController"; import CreateMailTablesMigration from "./migrations/CreateMailTablesMigration"; import MailboxBackendController from "./controllers/backend/MailboxBackendController"; import MailAutoConfigController from "./controllers/MailAutoConfigController"; import AccountBackendController from "./controllers/backend/AccountBackendController"; import CreateUsersAndUserEmailsTableMigration from "swaf/auth/migrations/CreateUsersAndUserEmailsTableMigration"; import AddPasswordToUsersMigration from "swaf/auth/password/AddPasswordToUsersMigration"; import CreateMagicLinksTableMigration from "swaf/auth/magic_link/CreateMagicLinksTableMigration"; import AddApprovedFieldToUsersTableMigration from "swaf/auth/migrations/AddApprovedFieldToUsersTableMigration"; import AddNameToUsersMigration from "swaf/auth/migrations/AddNameToUsersMigration"; import PreviousUrlComponent from "swaf/components/PreviousUrlComponent"; import MagicLinkAuthMethod from "swaf/auth/magic_link/MagicLinkAuthMethod"; import {MAGIC_LINK_MAIL} from "swaf/Mails"; import PasswordAuthMethod from "swaf/auth/password/PasswordAuthMethod"; import MagicLinkController from "swaf/auth/magic_link/MagicLinkController"; import AuthController from "swaf/auth/AuthController"; import MailController from "swaf/mail/MailController"; import AccountController from "swaf/auth/AccountController"; import packageJson = require('./package.json'); import AddUsedToMagicLinksMigration from "swaf/auth/magic_link/AddUsedToMagicLinksMigration"; import MakeMagicLinksSessionNotUniqueMigration from "swaf/auth/magic_link/MakeMagicLinksSessionNotUniqueMigration"; export default class App extends Application { public constructor( private readonly addr: string, private readonly port: number, ) { super(packageJson.version); } protected getMigrations(): MigrationType[] { return [ CreateMigrationsTable, DummyMigration, CreateUsersAndUserEmailsTableMigration, AddPasswordToUsersMigration, CreateMagicLinksTableMigration, AddApprovedFieldToUsersTableMigration, DummyMigration, DummyMigration, AddNameToUsersMigration, CreateMailTablesMigration, DropLegacyLogsTable, AddUsedToMagicLinksMigration, MakeMagicLinksSessionNotUniqueMigration, ]; } protected async init(): Promise { this.registerComponents(); this.registerWebSocketListeners(); this.registerControllers(); } private registerComponents() { // Base this.use(new ExpressAppComponent(this.addr, this.port)); this.use(new LogRequestsComponent()); // Static files this.use(new ServeStaticDirectoryComponent('public')); this.use(new ServeStaticDirectoryComponent('node_modules/feather-icons/dist', '/icons')); // Dynamic views and routes this.use(new NunjucksComponent()); this.use(new PreviousUrlComponent()); // Maintenance this.use(new MaintenanceComponent(this, () => { return this.as(RedisComponent).canServe() && this.as(MysqlComponent).canServe(); })); this.use(new AutoUpdateComponent()); // 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))); // LDAP server this.use(new LDAPServerComponent()); } private registerWebSocketListeners() { this.use(new MagicLinkWebSocketListener()); } private registerControllers() { // Priority routes / interrupting middlewares this.use(new MailAutoConfigController()); // Needs to override MailController this.use(new MailController()); this.use(new AuthController()); this.use(new AccountController()); this.use(new AccountMailboxController()); this.use(new MagicLinkController(this.as>(MagicLinkWebSocketListener))); // Core functionality this.use(new BackendController()); this.use(new MailboxBackendController()); this.use(new AccountBackendController()); // Other functionnality // Semi-static routes this.use(new HomeController()); } }