2025-07-25 15:33:48 -07:00
|
|
|
import { initializeServices } from "./config/services.js";
|
|
|
|
|
import { initializeControllers } from "./config/controllers.js";
|
|
|
|
|
import { createApp } from "./app.js";
|
|
|
|
|
import { initShutdownListener } from "./shutdown.js";
|
2026-03-02 21:52:22 +00:00
|
|
|
import { validateEnv } from "./validation/envValidation.js";
|
2025-07-25 15:33:48 -07:00
|
|
|
import { fileURLToPath } from "url";
|
|
|
|
|
import path from "path";
|
|
|
|
|
import fs from "fs";
|
2026-01-12 19:32:23 +00:00
|
|
|
import { runMigrations } from "./db/migration/index.js";
|
2025-07-25 15:33:48 -07:00
|
|
|
|
2026-01-21 11:18:13 -08:00
|
|
|
import Logger, { ILogger } from "@/utils/logger.js";
|
2026-03-05 14:46:28 -08:00
|
|
|
import { SettingsService } from "@/service/index.js";
|
2026-01-21 13:01:31 -08:00
|
|
|
import { MongoSettingsRepository } from "./repositories/index.js";
|
2025-07-25 15:33:48 -07:00
|
|
|
|
|
|
|
|
const SERVICE_NAME = "Server";
|
2026-01-21 11:18:13 -08:00
|
|
|
let logger: ILogger;
|
2025-07-25 15:33:48 -07:00
|
|
|
|
|
|
|
|
const startApp = async () => {
|
2026-03-02 21:52:22 +00:00
|
|
|
// Validate environment variables first
|
|
|
|
|
const env = validateEnv();
|
|
|
|
|
|
2025-07-25 15:33:48 -07:00
|
|
|
// FE path
|
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
|
|
|
const __dirname = path.dirname(__filename);
|
|
|
|
|
const openApiSpec = JSON.parse(fs.readFileSync(path.join(__dirname, "../openapi.json"), "utf8"));
|
2025-08-15 09:17:33 -07:00
|
|
|
const frontendPath = path.join(__dirname, "..", "public");
|
2025-07-28 15:03:28 -07:00
|
|
|
|
2025-07-25 15:33:48 -07:00
|
|
|
// Create services
|
2026-01-21 13:01:31 -08:00
|
|
|
const settingsRepository = new MongoSettingsRepository();
|
2026-03-02 21:52:22 +00:00
|
|
|
const settingsService = new SettingsService(settingsRepository, env);
|
2026-01-21 13:01:31 -08:00
|
|
|
|
2025-07-28 14:37:18 -07:00
|
|
|
const envSettings = settingsService.loadSettings();
|
2025-07-25 15:33:48 -07:00
|
|
|
|
2025-07-28 15:03:28 -07:00
|
|
|
// Create logger
|
|
|
|
|
logger = new Logger({ envSettings });
|
|
|
|
|
|
2025-07-25 15:33:48 -07:00
|
|
|
// Initialize services
|
2026-01-21 13:01:31 -08:00
|
|
|
const services = await initializeServices({ logger, envSettings, settingsService, settingsRepository });
|
2025-07-25 15:33:48 -07:00
|
|
|
|
2026-01-12 19:32:23 +00:00
|
|
|
await runMigrations(logger);
|
|
|
|
|
|
2025-07-25 15:33:48 -07:00
|
|
|
// Initialize controllers
|
|
|
|
|
const controllers = initializeControllers(services);
|
|
|
|
|
|
|
|
|
|
const app = createApp({
|
|
|
|
|
services,
|
|
|
|
|
controllers,
|
2025-07-28 14:37:18 -07:00
|
|
|
envSettings,
|
2025-07-25 15:33:48 -07:00
|
|
|
frontendPath,
|
|
|
|
|
openApiSpec,
|
|
|
|
|
});
|
|
|
|
|
|
2026-03-06 12:07:18 -08:00
|
|
|
const server = app.listen(env.PORT, () => {
|
|
|
|
|
logger.info({ message: `Server started on port:${env.PORT}` });
|
2025-07-25 15:33:48 -07:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
initShutdownListener(server, services);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
startApp().catch((error) => {
|
|
|
|
|
logger.error({
|
|
|
|
|
message: error.message,
|
|
|
|
|
service: SERVICE_NAME,
|
|
|
|
|
method: "startApp",
|
|
|
|
|
stack: error.stack,
|
|
|
|
|
});
|
|
|
|
|
process.exit(1);
|
|
|
|
|
});
|