Skip to main content
Glama
DatabaseConfig.ts•3.32 kB
import { Environment } from '../../domain/value-objects/Environment'; /** * 🎯 SEMANTIC INTENT: DatabaseConfig maps environments to D1 database IDs * * WHY: Infrastructure routing for environment-specific databases * - Development, staging, production databases are separate instances * - Environment semantic preserved: routing based on deployment context * - Loaded from environment variables * * INFRASTRUCTURE LAYER: Technical database routing configuration * INTENT PRESERVATION: Environment semantic maintained from domain to infrastructure */ export interface DatabaseInstance { name: string; id: string; } export class DatabaseConfig { private readonly databases: Map<Environment, DatabaseInstance>; constructor(databases: Map<Environment, DatabaseInstance>) { if (databases.size === 0) { throw new Error('At least one database must be configured'); } this.databases = new Map(databases); Object.freeze(this); } /** * Get database instance for environment * * Semantic: Environment determines which database to use */ getDatabaseInstance(environment: Environment): DatabaseInstance { const instance = this.databases.get(environment); if (!instance) { throw new Error( `No database configured for environment: ${environment}. ` + `Available: ${Array.from(this.databases.keys()).join(', ')}` ); } return instance; } /** * Get database ID for environment */ getDatabaseId(environment: Environment): string { return this.getDatabaseInstance(environment).id; } /** * Get database name for environment */ getDatabaseName(environment: Environment): string { return this.getDatabaseInstance(environment).name; } /** * Check if environment has configured database */ hasEnvironment(environment: Environment): boolean { return this.databases.has(environment); } /** * Get all configured environments */ getConfiguredEnvironments(): Environment[] { return Array.from(this.databases.keys()); } /** * Create config from environment variables */ static fromEnvironment(env: Record<string, string | undefined>): DatabaseConfig { const databases = new Map<Environment, DatabaseInstance>(); // Development database const devId = env.D1_DEV_DATABASE_ID || env.D1_DATABASE_ID; if (devId) { databases.set(Environment.DEVELOPMENT, { name: env.D1_DEV_DATABASE_NAME || 'development', id: devId, }); } // Staging database const stagingId = env.D1_STAGING_DATABASE_ID; if (stagingId) { databases.set(Environment.STAGING, { name: env.D1_STAGING_DATABASE_NAME || 'staging', id: stagingId, }); } // Production database const prodId = env.D1_PROD_DATABASE_ID || env.D1_PRODUCTION_DATABASE_ID; if (prodId) { databases.set(Environment.PRODUCTION, { name: env.D1_PROD_DATABASE_NAME || env.D1_PRODUCTION_DATABASE_NAME || 'production', id: prodId, }); } if (databases.size === 0) { throw new Error( 'No databases configured. Set at least one of: ' + 'D1_DEV_DATABASE_ID, D1_STAGING_DATABASE_ID, D1_PROD_DATABASE_ID' ); } return new DatabaseConfig(databases); } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/semanticintent/semantic-d1-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server