2020-11-22 13:49:08 +01:00
|
|
|
import Application from "swaf/Application";
|
|
|
|
import Migration, {MigrationType} from "swaf/db/Migration";
|
|
|
|
import CreateMigrationsTable from "swaf/migrations/CreateMigrationsTable";
|
|
|
|
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";
|
2020-06-14 13:01:52 +02:00
|
|
|
import AboutController from "./controllers/AboutController";
|
2020-11-22 13:49:08 +01:00
|
|
|
import AutoUpdateComponent from "swaf/components/AutoUpdateComponent";
|
|
|
|
import MagicLinkWebSocketListener from "swaf/auth/magic_link/MagicLinkWebSocketListener";
|
2020-06-14 13:01:52 +02:00
|
|
|
import FileController from "./controllers/FileController";
|
|
|
|
import CreateAuthTokensTable from "./migrations/CreateAuthTokensTable";
|
2020-11-22 13:49:08 +01:00
|
|
|
import AuthComponent from "swaf/auth/AuthComponent";
|
2020-06-14 13:01:52 +02:00
|
|
|
import CreateFilesTable from "./migrations/CreateFilesTable";
|
2020-06-15 10:16:28 +02:00
|
|
|
import IncreaseFilesSizeField from "./migrations/IncreaseFilesSizeField";
|
2020-07-06 10:49:18 +02:00
|
|
|
import CreateUrlRedirectsTable from "./migrations/CreateUrlRedirectsTable";
|
|
|
|
import AuthTokenController from "./controllers/AuthTokenController";
|
|
|
|
import URLRedirectController from "./controllers/URLRedirectController";
|
2020-07-06 15:39:47 +02:00
|
|
|
import LinkController from "./controllers/LinkController";
|
2020-11-22 13:49:08 +01:00
|
|
|
import BackendController from "swaf/helpers/BackendController";
|
|
|
|
import DummyMigration from "swaf/migrations/DummyMigration";
|
|
|
|
import DropLegacyLogsTable from "swaf/migrations/DropLegacyLogsTable";
|
2021-01-25 17:43:26 +01:00
|
|
|
import CreateUsersAndUserEmailsTableMigration from "swaf/auth/migrations/CreateUsersAndUserEmailsTableMigration";
|
|
|
|
import CreateMagicLinksTableMigration from "swaf/auth/magic_link/CreateMagicLinksTableMigration";
|
|
|
|
import AddApprovedFieldToUsersTableMigration from "swaf/auth/migrations/AddApprovedFieldToUsersTableMigration";
|
|
|
|
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 MailController from "swaf/mail/MailController";
|
|
|
|
import AccountController from "swaf/auth/AccountController";
|
|
|
|
import AuthController from "swaf/auth/AuthController";
|
|
|
|
import MagicLinkController from "swaf/auth/magic_link/MagicLinkController";
|
|
|
|
import AddUsedToMagicLinksMigration from "swaf/auth/magic_link/AddUsedToMagicLinksMigration";
|
|
|
|
import MakeMagicLinksSessionNotUniqueMigration from "swaf/auth/magic_link/MakeMagicLinksSessionNotUniqueMigration";
|
|
|
|
import AddPasswordToUsersMigration from "swaf/auth/password/AddPasswordToUsersMigration";
|
|
|
|
import DropNameFromUsers from "swaf/auth/migrations/DropNameFromUsers";
|
2021-01-25 13:17:41 +01:00
|
|
|
import packageJson = require('./package.json');
|
2020-04-23 18:07:55 +02:00
|
|
|
|
2020-06-14 13:01:52 +02:00
|
|
|
export default class App extends Application {
|
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-22 13:49:08 +01:00
|
|
|
DummyMigration,
|
2021-01-25 17:43:26 +01:00
|
|
|
CreateUsersAndUserEmailsTableMigration,
|
|
|
|
CreateMagicLinksTableMigration,
|
2020-06-14 13:01:52 +02:00
|
|
|
CreateAuthTokensTable,
|
|
|
|
CreateFilesTable,
|
2020-06-15 10:16:28 +02:00
|
|
|
IncreaseFilesSizeField,
|
2021-01-25 17:43:26 +01:00
|
|
|
AddApprovedFieldToUsersTableMigration,
|
2020-07-06 10:49:18 +02:00
|
|
|
CreateUrlRedirectsTable,
|
2020-11-22 13:49:08 +01:00
|
|
|
DropLegacyLogsTable,
|
2021-01-25 17:43:26 +01:00
|
|
|
DummyMigration,
|
|
|
|
AddUsedToMagicLinksMigration,
|
|
|
|
MakeMagicLinksSessionNotUniqueMigration,
|
|
|
|
AddPasswordToUsersMigration,
|
|
|
|
DropNameFromUsers,
|
2020-04-23 18:07:55 +02:00
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
protected async init(): Promise<void> {
|
|
|
|
this.registerComponents();
|
|
|
|
this.registerWebSocketListeners();
|
|
|
|
this.registerControllers();
|
|
|
|
}
|
|
|
|
|
|
|
|
private registerComponents() {
|
2020-08-11 17:54:15 +02:00
|
|
|
// Base
|
2021-01-25 13:17:41 +01:00
|
|
|
this.use(new ExpressAppComponent(this.addr, this.port));
|
2020-06-14 17:37:47 +02:00
|
|
|
this.use(new LogRequestsComponent());
|
|
|
|
|
2020-06-14 21:23:57 +02:00
|
|
|
// Static files
|
|
|
|
this.use(new ServeStaticDirectoryComponent('public'));
|
|
|
|
this.use(new ServeStaticDirectoryComponent('node_modules/feather-icons/dist', '/icons'));
|
|
|
|
|
2020-08-11 17:54:15 +02:00
|
|
|
// Dynamic views and routes
|
|
|
|
this.use(new NunjucksComponent());
|
2021-01-25 13:17:41 +01:00
|
|
|
this.use(new PreviousUrlComponent());
|
2020-08-11 17:54:15 +02:00
|
|
|
|
2020-04-23 18:07:55 +02:00
|
|
|
// Maintenance
|
|
|
|
this.use(new MaintenanceComponent(this, () => {
|
2021-01-25 13:17:41 +01:00
|
|
|
return this.as(RedisComponent).canServe() && this.as(MysqlComponent).canServe();
|
2020-04-23 18:07:55 +02:00
|
|
|
}));
|
2020-05-05 15:26:28 +02:00
|
|
|
this.use(new AutoUpdateComponent());
|
2020-04-23 18:07:55 +02:00
|
|
|
|
|
|
|
// Services
|
2021-01-25 13:17:41 +01:00
|
|
|
this.use(new MysqlComponent());
|
2020-04-23 18:07:55 +02:00
|
|
|
this.use(new MailComponent());
|
|
|
|
|
2020-06-14 21:23:57 +02:00
|
|
|
// Session
|
2021-01-25 13:17:41 +01:00
|
|
|
this.use(new RedisComponent());
|
|
|
|
this.use(new SessionComponent(this.as(RedisComponent)));
|
2021-01-25 17:43:26 +01:00
|
|
|
this.use(new AuthComponent(this, new MagicLinkAuthMethod(this, MAGIC_LINK_MAIL), new PasswordAuthMethod(this)));
|
2020-04-23 18:07:55 +02:00
|
|
|
|
2020-06-14 21:23:57 +02:00
|
|
|
// Utils
|
|
|
|
this.use(new FormHelperComponent());
|
|
|
|
|
2020-04-23 18:07:55 +02:00
|
|
|
// Middlewares
|
|
|
|
this.use(new CsrfProtectionComponent());
|
|
|
|
|
|
|
|
// WebSocket server
|
2021-01-25 13:17:41 +01:00
|
|
|
this.use(new WebSocketServerComponent(this, this.as(ExpressAppComponent), this.as(RedisComponent)));
|
2020-04-23 18:07:55 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private registerWebSocketListeners() {
|
2020-11-22 13:49:08 +01:00
|
|
|
this.use(new MagicLinkWebSocketListener());
|
2020-04-23 18:07:55 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private registerControllers() {
|
2020-07-06 15:39:47 +02:00
|
|
|
// Multi-domain + vhost
|
|
|
|
this.use(new LinkController());
|
|
|
|
|
2020-06-14 13:01:52 +02:00
|
|
|
// Priority
|
2021-01-25 17:43:26 +01:00
|
|
|
this.use(new MailController());
|
2020-06-14 13:01:52 +02:00
|
|
|
this.use(new AuthController());
|
2020-11-22 13:49:08 +01:00
|
|
|
this.use(new MagicLinkController(this.as<MagicLinkWebSocketListener<this>>(MagicLinkWebSocketListener)));
|
2020-06-14 13:01:52 +02:00
|
|
|
|
2021-01-25 17:43:26 +01:00
|
|
|
// Core
|
|
|
|
this.use(new AccountController());
|
|
|
|
this.use(new BackendController());
|
2020-06-14 13:01:52 +02:00
|
|
|
|
2020-07-06 10:49:18 +02:00
|
|
|
// Other functionality
|
|
|
|
this.use(new AuthTokenController());
|
|
|
|
|
2020-06-14 13:01:52 +02:00
|
|
|
// Semi-static
|
|
|
|
this.use(new AboutController());
|
2020-06-14 14:53:05 +02:00
|
|
|
|
|
|
|
// Global slug
|
|
|
|
this.use(new FileController());
|
2020-07-06 10:49:18 +02:00
|
|
|
this.use(new URLRedirectController());
|
2020-04-23 18:07:55 +02:00
|
|
|
}
|
2020-10-05 13:38:03 +02:00
|
|
|
}
|