Refactor code structure for improved readability and maintainability
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user