rainbox.email/src/App.ts

151 lines
6.3 KiB
TypeScript
Raw Normal View History

2020-04-23 18:07:55 +02:00
import Application from "wms-core/Application";
2020-10-05 13:38:03 +02:00
import Migration, {MigrationType} from "wms-core/db/Migration";
2020-04-23 18:07:55 +02:00
import ExpressAppComponent from "wms-core/components/ExpressAppComponent";
import NunjucksComponent from "wms-core/components/NunjucksComponent";
import MysqlComponent from "wms-core/components/MysqlComponent";
import LogRequestsComponent from "wms-core/components/LogRequestsComponent";
import RedisComponent from "wms-core/components/RedisComponent";
import ServeStaticDirectoryComponent from "wms-core/components/ServeStaticDirectoryComponent";
import MaintenanceComponent from "wms-core/components/MaintenanceComponent";
import MailComponent from "wms-core/components/MailComponent";
import SessionComponent from "wms-core/components/SessionComponent";
import FormHelperComponent from "wms-core/components/FormHelperComponent";
import CsrfProtectionComponent from "wms-core/components/CsrfProtectionComponent";
import WebSocketServerComponent from "wms-core/components/WebSocketServerComponent";
import HomeController from "./controllers/HomeController";
import AuthController from "./controllers/AuthController";
import AuthComponent from "wms-core/auth/AuthComponent";
import AuthGuard from "wms-core/auth/AuthGuard";
import {PasswordAuthProof} from "./models/UserPasswordComponent";
import LDAPServerComponent from "./LDAPServerComponent";
2020-05-05 15:26:28 +02:00
import AutoUpdateComponent from "wms-core/components/AutoUpdateComponent";
2020-10-05 13:38:03 +02:00
import packageJson = require('../package.json');
2020-11-02 18:17:55 +01:00
import DummyMigration from "wms-core/migrations/DummyMigration";
import DropLegacyLogsTable from "wms-core/migrations/DropLegacyLogsTable";
import AccountController from "./controllers/AccountController";
import CreateMigrationsTable from "wms-core/migrations/CreateMigrationsTable";
import CreateUsersAndUserEmailsTable from "wms-core/auth/migrations/CreateUsersAndUserEmailsTable";
import AddPasswordToUsers from "./migrations/AddPasswordToUsers";
import CreateMagicLinksTable from "wms-core/auth/migrations/CreateMagicLinksTable";
import MailController from "wms-core/auth/MailController";
import MagicLinkController from "./controllers/MagicLinkController";
import MagicLinkWebSocketListener from "wms-core/auth/magic_link/MagicLinkWebSocketListener";
import BackendController from "wms-core/helpers/BackendController";
import AddApprovedFieldToUsersTable from "wms-core/auth/migrations/AddApprovedFieldToUsersTable";
import FixUserMainEmailRelation from "wms-core/auth/migrations/FixUserMainEmailRelation";
import DropNameFromUsers from "wms-core/auth/migrations/DropNameFromUsers";
import MagicLink from "wms-core/auth/models/MagicLink";
import AddNameToUsers from "./migrations/AddNameToUsers";
2020-07-27 16:02:09 +02:00
import CreateMailTables from "./migrations/CreateMailTables";
import MailboxBackendController from "./controllers/MailboxBackendController";
import RedirectBackComponent from "wms-core/components/RedirectBackComponent";
import MailAutoConfigController from "./controllers/MailAutoConfigController";
2020-04-23 18:07:55 +02:00
2020-06-27 17:20:06 +02:00
export default class App extends Application {
private magicLinkWebSocketListener?: MagicLinkWebSocketListener<this>;
2020-04-23 18:07:55 +02:00
2020-10-05 13:38:03 +02:00
public constructor(
private readonly addr: string,
private readonly port: number,
) {
super(packageJson.version);
2020-04-23 18:07:55 +02:00
}
2020-10-05 13:38:03 +02:00
protected getMigrations(): MigrationType<Migration>[] {
2020-04-23 18:07:55 +02:00
return [
CreateMigrationsTable,
2020-11-02 18:17:55 +01:00
DummyMigration,
CreateUsersAndUserEmailsTable,
AddPasswordToUsers,
CreateMagicLinksTable,
AddApprovedFieldToUsersTable,
FixUserMainEmailRelation,
DropNameFromUsers,
AddNameToUsers,
2020-07-27 16:02:09 +02:00
CreateMailTables,
2020-11-02 18:17:55 +01:00
DropLegacyLogsTable,
2020-04-23 18:07:55 +02:00
];
}
protected async init(): Promise<void> {
this.registerComponents();
this.registerWebSocketListeners();
this.registerControllers();
}
private registerComponents() {
const redisComponent = new RedisComponent();
const mysqlComponent = new MysqlComponent();
2020-07-29 15:03:54 +02:00
// Base
2020-10-05 13:38:03 +02:00
const expressAppComponent = new ExpressAppComponent(this.addr, this.port);
2020-04-23 18:07:55 +02:00
this.use(expressAppComponent);
this.use(new LogRequestsComponent());
// Static files
this.use(new ServeStaticDirectoryComponent('public'));
this.use(new ServeStaticDirectoryComponent('node_modules/feather-icons/dist', '/icons'));
2020-07-29 15:03:54 +02:00
// Dynamic views and routes
this.use(new NunjucksComponent());
this.use(new RedirectBackComponent());
2020-04-23 18:07:55 +02:00
// Maintenance
this.use(new MaintenanceComponent(this, () => {
return redisComponent.canServe() && mysqlComponent.canServe();
}));
2020-05-05 15:26:28 +02:00
this.use(new AutoUpdateComponent());
2020-04-23 18:07:55 +02:00
// Services
this.use(mysqlComponent);
this.use(new MailComponent());
// Session
this.use(redisComponent);
this.use(new SessionComponent(redisComponent));
// Utils
this.use(new FormHelperComponent());
// Middlewares
this.use(new CsrfProtectionComponent());
// Auth
this.use(new AuthComponent(new class extends AuthGuard<PasswordAuthProof | MagicLink> {
public async getProofForSession(session: Express.Session): Promise<PasswordAuthProof | MagicLink | null> {
return PasswordAuthProof.getProofForSession(session) ||
MagicLink.bySessionId(session.id);
}
}));
2020-04-23 18:07:55 +02:00
// WebSocket server
this.use(new WebSocketServerComponent(this, expressAppComponent, redisComponent));
// LDAP server
this.use(new LDAPServerComponent());
2020-04-23 18:07:55 +02:00
}
private registerWebSocketListeners() {
this.magicLinkWebSocketListener = new MagicLinkWebSocketListener();
this.use(this.magicLinkWebSocketListener);
2020-04-23 18:07:55 +02:00
}
private registerControllers() {
// Priority routes / interrupting middlewares
this.use(new AccountController());
this.use(new MagicLinkController(this.magicLinkWebSocketListener!));
this.use(new BackendController());
2020-07-27 16:02:09 +02:00
this.use(new MailboxBackendController());
this.use(new AuthController());
// Core functionality
this.use(new MailController());
// Other functionnality
this.use(new MailAutoConfigController());
// Semi-static routes
2020-04-23 18:07:55 +02:00
this.use(new HomeController());
}
}