webstudio/server/src/core/controllers/app.ts
2023-11-20 00:48:40 +03:00

87 lines
2.6 KiB
TypeScript

import express from "express";
import { Routes } from "../interfaces/router";
import cors from "cors";
import { Server } from "socket.io";
import { createServer } from "http";
import { SocketSubscriber } from "./socket_controller";
import { dirname } from "path";
import fileUpload from "express-fileupload";
import { SetLastActivePipelineToRealTimeServiceUseCase } from "../usecases/set_active_pipeline_to_realtime_service_usecase";
import { CheckAndCreateStaticFilesFolderUseCase } from "../usecases/check_and_create_static_files_folder_usecase";
import { DataBaseConnectUseCase } from "../usecases/database_connect_usecase";
export class App {
public app: express.Application;
public port: number;
public env: string;
public socketSubscribers: SocketSubscriber<any>[];
public io: Server;
constructor(routes: Routes[], socketSubscribers: SocketSubscriber<any>[]) {
this.port = 4001;
this.socketSubscribers = socketSubscribers;
this.env = "dev";
this.app = express();
this.loadAppDependencies().then(() => {
this.initializeMiddlewares();
this.initializeRoutes(routes);
});
}
public listen() {
const httpServer = createServer(this.app);
const io = new Server(httpServer, {
cors: { origin: "*" },
});
io.on("connection", (socket) => {
this.socketSubscribers.map((el) => {
el.emitter.on((e) => {
socket.emit(el.event, e);
});
});
});
httpServer.listen(this.port, () => {
console.info(`=================================`);
console.info(`======= ENV: ${this.env} =======`);
console.info(`🚀 HTTP http://localhost:${this.port}`);
console.info(`🚀 WS ws://localhost:${this.port}`);
console.info(`=================================`);
});
this.io = io;
}
public getServer() {
return this.app;
}
private initializeMiddlewares() {
this.app.use(cors());
this.app.use(express.json());
this.app.use(express.urlencoded({ extended: true }));
this.app.use(express.static("public"));
this.app.use(
fileUpload({
createParentPath: true,
})
);
}
private initializeRoutes(routes: Routes[]) {
routes.forEach((route) => {
this.app.use("/", route.router);
});
}
async loadAppDependencies() {
await new DataBaseConnectUseCase().call();
await new CheckAndCreateStaticFilesFolderUseCase().call();
await new SetLastActivePipelineToRealTimeServiceUseCase().call();
}
static staticFilesStoreDir = () => {
const dir = dirname(__filename);
const rootDir = dir.slice(0, dir.length - 20);
return rootDir + "public/";
};
}