Refactor code structure for improved readability and maintainability

This commit is contained in:
2025-11-27 23:47:33 +00:00
parent ab88ac896f
commit 9f5e7e2558
23 changed files with 13024 additions and 109 deletions

View File

@@ -1,50 +1,65 @@
/**
* Database connection singleton
*
* SmartData models need a db reference at class definition time via lazy getter.
* The actual .init() is called later when the server starts.
*/
import * as plugins from '../plugins.ts';
import { User } from './user.ts';
let dbInstance: plugins.smartdata.SmartdataDb | null = null;
// Database instance - created lazily in initDb()
// The @Collection(() => db) decorator uses a lazy getter, so db can be undefined
// until initDb() is called. Default admin is seeded after db.init() completes.
export let db: plugins.smartdata.SmartdataDb;
let isInitialized = false;
/**
* Initialize database connection
*/
export async function initDb(config: {
mongoDbUrl: string;
mongoDbName?: string;
}): Promise<plugins.smartdata.SmartdataDb> {
if (dbInstance) {
return dbInstance;
export async function initDb(
mongoDbUrl: string,
mongoDbName?: string
): Promise<plugins.smartdata.SmartdataDb> {
if (isInitialized && db) {
return db;
}
dbInstance = new plugins.smartdata.SmartdataDb({
mongoDbUrl: config.mongoDbUrl,
mongoDbName: config.mongoDbName || 'stackregistry',
// Create the database instance with actual configuration
db = new plugins.smartdata.SmartdataDb({
mongoDbUrl: mongoDbUrl,
mongoDbName: mongoDbName || 'stackregistry',
});
await dbInstance.init();
await db.init();
isInitialized = true;
console.log('Database connected successfully');
return dbInstance;
// Seed default admin user if none exists
try {
await User.seedDefaultAdmin();
} catch (err) {
console.warn('[Database] Failed to seed default admin:', err);
}
return db;
}
/**
* Get database instance (must call initDb first)
* Get database instance (for backward compatibility)
*/
export function getDb(): plugins.smartdata.SmartdataDb {
if (!dbInstance) {
throw new Error('Database not initialized. Call initDb() first.');
}
return dbInstance;
return db;
}
/**
* Close database connection
*/
export async function closeDb(): Promise<void> {
if (dbInstance) {
await dbInstance.close();
dbInstance = null;
if (db && isInitialized) {
await db.close();
isInitialized = false;
console.log('Database connection closed');
}
}
@@ -53,5 +68,5 @@ export async function closeDb(): Promise<void> {
* Check if database is connected
*/
export function isDbConnected(): boolean {
return dbInstance !== null;
return isInitialized;
}