atums.world/src/index.ts

105 lines
2.3 KiB
TypeScript

import { dataType } from "@config/environment";
import { logger } from "@helpers/logger";
import { type ReservedSQL, s3, sql } from "bun";
import { existsSync, mkdirSync } from "fs";
import { readdir } from "fs/promises";
import { resolve } from "path";
import { serverHandler } from "@/server";
import { redis } from "./helpers/redis";
async function initializeDatabase(): Promise<void> {
const sqlDir: string = resolve("config", "sql");
const files: string[] = await readdir(sqlDir);
const modules: Module[] = await Promise.all(
files
.filter((file: string): boolean => file.endsWith(".ts"))
.map(async (file: string): Promise<Module> => {
const module: Module["module"] = await import(
resolve(sqlDir, file)
);
return { file, module };
}),
);
modules.sort(
(a: Module, b: Module): number =>
(a.module.order ?? 0) - (b.module.order ?? 0),
);
const reservation: ReservedSQL = await sql.reserve();
for (const { module } of modules) {
if (module.createTable) {
await module.createTable(reservation);
}
}
reservation.release();
}
async function main(): Promise<void> {
try {
try {
await sql`SELECT 1;`;
logger.info([
"Connected to PostgreSQL on",
`${process.env.PGHOST}:${process.env.PGPORT}`,
]);
} catch (error) {
logger.error([
"Could not establish a connection to PostgreSQL:",
error as Error,
]);
process.exit(1);
}
if (dataType.type === "local" && dataType.path) {
if (!existsSync(dataType.path)) {
try {
mkdirSync(dataType.path);
} catch (error) {
logger.error([
"Could not create datasource local directory",
error as Error,
]);
process.exit(1);
}
}
logger.info([
"Using local datasource directory",
`${dataType.path}`,
]);
} else {
try {
await s3.write("test", "test");
await s3.delete("test");
logger.info([
"Connected to S3 with bucket",
`${process.env.S3_BUCKET}`,
]);
} catch (error) {
logger.error([
"Could not establish a connection to S3 bucket:",
error as Error,
]);
process.exit(1);
}
}
await redis.initialize();
serverHandler.initialize();
await initializeDatabase();
} catch (error) {
throw error;
}
}
main().catch((error: Error) => {
logger.error(["Error initializing the server:", error]);
process.exit(1);
});