Files
Toju/electron/db/database.ts

77 lines
2.0 KiB
TypeScript

import { app } from 'electron';
import * as fs from 'fs';
import * as fsp from 'fs/promises';
import * as path from 'path';
import { DataSource } from 'typeorm';
import {
MessageEntity,
UserEntity,
RoomEntity,
ReactionEntity,
BanEntity,
AttachmentEntity,
MetaEntity
} from '../entities';
import { settings } from '../settings';
let applicationDataSource: DataSource | undefined;
export function getDataSource(): DataSource | undefined {
return applicationDataSource;
}
export async function initializeDatabase(): Promise<void> {
const userDataPath = app.getPath('userData');
const dbDir = path.join(userDataPath, 'metoyou');
await fsp.mkdir(dbDir, { recursive: true });
const databaseFilePath = path.join(dbDir, settings.databaseName);
let database: Uint8Array | undefined;
if (fs.existsSync(databaseFilePath)) {
database = fs.readFileSync(databaseFilePath);
}
applicationDataSource = new DataSource({
type: 'sqljs',
database,
entities: [MessageEntity, UserEntity, RoomEntity, ReactionEntity, BanEntity, AttachmentEntity, MetaEntity],
migrations: [
path.join(__dirname, '..', 'migrations', '*.js'),
path.join(__dirname, '..', 'migrations', '*.ts')
],
synchronize: false,
logging: false,
autoSave: true,
location: databaseFilePath
});
try {
await applicationDataSource.initialize();
console.log('[DB] Connection initialised at:', databaseFilePath);
try {
await applicationDataSource.runMigrations();
console.log('[DB] Migrations executed');
} catch (migErr) {
console.error('[DB] Migration error:', migErr);
}
} catch (error) {
console.error('[DB] Initialisation error:', error);
}
}
export async function destroyDatabase(): Promise<void> {
if (applicationDataSource?.isInitialized) {
try {
await applicationDataSource.destroy();
console.log('[DB] Connection closed');
} catch (error) {
console.error('[DB] Error closing connection:', error);
} finally {
applicationDataSource = undefined;
}
}
}