mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-15 04:21:09 +02:00
Applied formatting to 1487+ files using pnpm format:write - TypeScript/JavaScript files - Svelte components - Astro pages - JSON configs - Markdown docs 13 files still need manual review (Astro JSX comments)
97 lines
2 KiB
TypeScript
97 lines
2 KiB
TypeScript
import { drizzle } from 'drizzle-orm/postgres-js';
|
|
import postgres from 'postgres';
|
|
import * as schema from './schema/index.js';
|
|
|
|
// Singleton instance for the database client
|
|
let dbInstance: ReturnType<typeof drizzle<typeof schema>> | null = null;
|
|
let pgClient: ReturnType<typeof postgres> | null = null;
|
|
|
|
/**
|
|
* Get the database URL from environment variables
|
|
*/
|
|
function getDatabaseUrl(): string {
|
|
const url = process.env.DATABASE_URL || process.env.MANADECK_DATABASE_URL;
|
|
if (!url) {
|
|
throw new Error(
|
|
'Database URL not found. Set DATABASE_URL or MANADECK_DATABASE_URL environment variable.'
|
|
);
|
|
}
|
|
return url;
|
|
}
|
|
|
|
/**
|
|
* Create a new database client
|
|
* Uses connection pooling with sensible defaults for serverless environments
|
|
*/
|
|
export function createClient(connectionString?: string) {
|
|
const url = connectionString || getDatabaseUrl();
|
|
|
|
const client = postgres(url, {
|
|
max: 10, // Maximum connections in the pool
|
|
idle_timeout: 20, // Close idle connections after 20 seconds
|
|
connect_timeout: 10, // Connection timeout in seconds
|
|
prepare: false, // Disable prepared statements for serverless
|
|
});
|
|
|
|
return drizzle(client, { schema });
|
|
}
|
|
|
|
/**
|
|
* Get the singleton database instance
|
|
* Creates a new instance if one doesn't exist
|
|
*/
|
|
export function getDb() {
|
|
if (!dbInstance) {
|
|
const url = getDatabaseUrl();
|
|
pgClient = postgres(url, {
|
|
max: 10,
|
|
idle_timeout: 20,
|
|
connect_timeout: 10,
|
|
prepare: false,
|
|
});
|
|
dbInstance = drizzle(pgClient, { schema });
|
|
}
|
|
return dbInstance;
|
|
}
|
|
|
|
/**
|
|
* Close the database connection
|
|
* Should be called when shutting down the application
|
|
*/
|
|
export async function closeDb() {
|
|
if (pgClient) {
|
|
await pgClient.end();
|
|
pgClient = null;
|
|
dbInstance = null;
|
|
}
|
|
}
|
|
|
|
// Export the database type for typing purposes
|
|
export type Database = ReturnType<typeof createClient>;
|
|
|
|
// Re-export commonly used Drizzle utilities
|
|
export {
|
|
eq,
|
|
ne,
|
|
gt,
|
|
gte,
|
|
lt,
|
|
lte,
|
|
and,
|
|
or,
|
|
not,
|
|
inArray,
|
|
notInArray,
|
|
isNull,
|
|
isNotNull,
|
|
like,
|
|
ilike,
|
|
sql,
|
|
asc,
|
|
desc,
|
|
count,
|
|
sum,
|
|
avg,
|
|
min,
|
|
max,
|
|
} from 'drizzle-orm';
|