learning_ai_clock/backend/src/lib/datastore.ts
saravanakumardb1 6acc97bf8a fix(backend): use config.DB_PROVIDER instead of process.env.DB_PROVIDER in datastore.ts
- Reads validated DB_PROVIDER from Zod config instead of raw env
- Removes stale isTest fallback logic (now handled by config defaults)
2026-03-20 08:29:36 -07:00

68 lines
1.7 KiB
TypeScript

/**
* Cloud-agnostic datastore bridge for chronomind-backend.
*
* Wraps @bytelyst/datastore with ChronoMind container registry config.
* Repositories import getCollection() from here instead of getContainer() from cosmos.
*
* Migration: Replace `import { getContainer } from '../../lib/cosmos.js'`
* with `import { getCollection } from '../../lib/datastore.js'`
*/
import {
type DatastoreProvider,
type DocumentCollection,
type BaseDocument,
setDatastore,
CosmosDatastoreProvider,
MemoryDatastoreProvider,
} from '@bytelyst/datastore';
import { config } from './config.js';
let _provider: DatastoreProvider | null = null;
/**
* Initialize the datastore provider.
* Call once at service startup (before any repository calls).
*/
export function initDatastore(): DatastoreProvider {
if (_provider) return _provider;
if (config.DB_PROVIDER === 'memory') {
_provider = new MemoryDatastoreProvider();
} else {
_provider = new CosmosDatastoreProvider();
}
setDatastore(_provider);
return _provider;
}
/**
* Inject a provider directly (for testing).
*/
export function setProvider(provider: DatastoreProvider): void {
_provider = provider;
setDatastore(provider);
}
/**
* Get a typed collection from the datastore.
* Drop-in replacement for getContainer() — returns a DocumentCollection instead of a Cosmos Container.
*/
export function getCollection<T extends BaseDocument = BaseDocument>(
name: string,
partitionKeyPath: string = '/productId'
): DocumentCollection<T> {
if (!_provider) {
initDatastore();
}
return _provider!.getCollection<T>(name, partitionKeyPath);
}
/**
* @internal — for testing only
*/
export function _resetDatastoreProvider(): void {
_provider = null;
}