migrate to DataSource

This commit is contained in:
TheArcaneBrony
2022-08-05 23:41:45 +02:00
parent 499cd2e8ff
commit 01da7dc4c2
2 changed files with 102 additions and 30 deletions

View File

@@ -1,6 +1,6 @@
import path from "path";
import "reflect-metadata";
import { Connection, createConnection } from "typeorm";
import { DataSource, createConnection } from "typeorm";
import * as Models from "../entities";
import { Migration } from "../entities/Migration";
import { yellow, green, red } from "picocolors";
@@ -9,21 +9,24 @@ import { yellow, green, red } from "picocolors";
// We want to generate all id's with Snowflakes that's why we have our own BaseEntity class
let promise: Promise<any>;
let dbConnection: Connection | undefined;
let dataSource: DataSource | undefined;
let dbConnectionString = process.env.DATABASE || path.join(process.cwd(), "database.db");
let verbose_db = false;
export function initDatabase(): Promise<Connection> {
if (promise) return promise; // prevent initalizing multiple times
export async function initDatabase(): Promise<DataSource> {
if (dataSource) return dataSource; // prevent initalizing multiple times
const type = dbConnectionString.includes("://") ? dbConnectionString.split(":")[0]?.replace("+srv", "") : "sqlite";
const type = dbConnectionString.includes("://") ? dbConnectionString.split(":")[0]?.replace("+srv", "") : "sqlite" as any;
const isSqlite = type.includes("sqlite");
if(process.env.DB_VERBOSE) verbose_db = true;
console.log(`[Database] ${yellow(`connecting to ${type} db`)}`);
if(isSqlite) {
if(isSqlite)
console.log(`[Database] ${red(`You are running sqlite! Please keep in mind that we recommend setting up a dedicated database!`)}`);
}
if(verbose_db)
console.log(`[Database] ${red(`Verbose database logging is enabled, this might impact performance! Unset VERBOSE_DB to disable.`)}`);
// @ts-ignore
promise = createConnection({
dataSource = new DataSource({
type,
charset: 'utf8mb4',
url: isSqlite ? undefined : dbConnectionString,
@@ -31,7 +34,7 @@ export function initDatabase(): Promise<Connection> {
// @ts-ignore
entities: Object.values(Models).filter((x) => x.constructor.name !== "Object" && x.name),
synchronize: type !== "mongodb",
logging: false,
logging: verbose_db,
cache: {
duration: 1000 * 3, // cache all find queries for 3 seconds
},
@@ -40,33 +43,30 @@ export function initDatabase(): Promise<Connection> {
name: "default",
migrations: [path.join(__dirname, "..", "migrations", "*.js")],
});
promise = dataSource.initialize();
await promise;
// run migrations, and if it is a new fresh database, set it to the last migration
if (dataSource.migrations.length) {
if (!(await Migration.findOne({}))) {
let i = 0;
promise.then(async (connection: Connection) => {
dbConnection = connection;
// run migrations, and if it is a new fresh database, set it to the last migration
if (connection.migrations.length) {
if (!(await Migration.findOne({}))) {
let i = 0;
await Migration.insert(
connection.migrations.map((x) => ({
id: i++,
name: x.name,
timestamp: Date.now(),
}))
);
}
await Migration.insert(
dataSource.migrations.map((x) => ({
id: i++,
name: x.name,
timestamp: Date.now(),
}))
);
}
await connection.runMigrations();
console.log(`[Database] ${green("connected")}`);
});
}
await dataSource.runMigrations();
console.log(`[Database] ${green("connected")}`);
return promise;
}
export { dbConnection };
export { dataSource };
export function closeDatabase() {
dbConnection?.close();
dataSource?.destroy();
}

View File

@@ -0,0 +1,72 @@
import path from "path";
import "reflect-metadata";
import { Connection, createConnection } from "typeorm";
import * as Models from "../entities";
import { Migration } from "../entities/Migration";
import { yellow, green, red } from "picocolors";
// UUID extension option is only supported with postgres
// We want to generate all id's with Snowflakes that's why we have our own BaseEntity class
let promise: Promise<any>;
let dbConnection: Connection | undefined;
let dbConnectionString = process.env.DATABASE || path.join(process.cwd(), "database.db");
export function initDatabase(): Promise<Connection> {
if (promise) return promise; // prevent initalizing multiple times
const type = dbConnectionString.includes("://") ? dbConnectionString.split(":")[0]?.replace("+srv", "") : "sqlite";
const isSqlite = type.includes("sqlite");
console.log(`[Database] ${yellow(`connecting to ${type} db`)}`);
if(isSqlite) {
console.log(`[Database] ${red(`You are running sqlite! Please keep in mind that we recommend setting up a dedicated database!`)}`);
}
// @ts-ignore
promise = createConnection({
type,
charset: 'utf8mb4',
url: isSqlite ? undefined : dbConnectionString,
database: isSqlite ? dbConnectionString : undefined,
// @ts-ignore
entities: Object.values(Models).filter((x) => x.constructor.name !== "Object" && x.name),
synchronize: type !== "mongodb",
logging: false,
cache: {
duration: 1000 * 3, // cache all find queries for 3 seconds
},
bigNumberStrings: false,
supportBigNumbers: true,
name: "default",
migrations: [path.join(__dirname, "..", "migrations", "*.js")],
});
promise.then(async (connection: Connection) => {
dbConnection = connection;
// run migrations, and if it is a new fresh database, set it to the last migration
if (connection.migrations.length) {
if (!(await Migration.findOne({}))) {
let i = 0;
await Migration.insert(
connection.migrations.map((x) => ({
id: i++,
name: x.name,
timestamp: Date.now(),
}))
);
}
}
await connection.runMigrations();
console.log(`[Database] ${green("connected")}`);
});
return promise;
}
export { dbConnection };
export function closeDatabase() {
dbConnection?.close();
}