@voilajsx/appkit
Version:
Minimal and framework agnostic Node.js toolkit designed for AI agentic backend development
137 lines • 4.8 kB
TypeScript
/**
* Ultra-simple database API with org/tenant support and smart connection management
* @module @voilajsx/appkit/database
* @file src/database/index.ts
*
* @llm-rule WHEN: ALWAYS add tenant_id text field to ALL tables (nullable for future compatibility)
* @llm-rule NOTE: tenant_id = null (single tenant) or "team-1" (multi-tenant)
* @llm-rule VARIABLE: const db = await databaseClass.get() - user's data (single or tenant-filtered)
* @llm-rule VARIABLE: const dbTenants = await databaseClass.getTenants() - all tenants (admin access)
* @llm-rule VARIABLE: const {orgName}Db = await databaseClass.org('{orgName}').get() - org-specific data
* @llm-rule VARIABLE: const {orgName}DbTenants = await databaseClass.org('{orgName}').getTenants() - all tenants in org
*/
interface DatabaseClient {
_appKit?: boolean;
_orgId?: string;
_tenantId?: string;
_url?: string;
[key: string]: any;
}
interface PrismaClient extends DatabaseClient {
$queryRaw?: any;
$disconnect: () => Promise<void>;
$connect: () => Promise<void>;
$use?: (middleware: any) => void;
}
interface MongooseConnection extends DatabaseClient {
db: any;
close: () => Promise<void>;
model: (name: string, schema?: any, collection?: string) => any;
models: Record<string, any>;
on: (event: string, callback: (...args: any[]) => void) => void;
}
type DatabaseClientUnion = PrismaClient | MongooseConnection;
/**
* Organization database builder
*/
declare class OrgDatabase {
private orgId;
constructor(orgId: string);
/**
* Get organization database (tenant-filtered if tenant mode enabled)
*/
get(req?: any): Promise<DatabaseClientUnion>;
/**
* Get all tenants in organization (admin access)
*/
getTenants(req?: any): Promise<DatabaseClientUnion>;
}
/**
* Main database API - ultra-simple like auth module
*/
export declare const databaseClass: {
/**
* Get database client - main function that handles all contexts
* @param {Object} [req] - Request object for context detection
* @returns {Promise<DatabaseClientUnion>} Database client
*/
get(req?: any): Promise<DatabaseClientUnion>;
/**
* Get all tenants data (admin access - no tenant filtering)
* @param {Object} [req] - Request object for org context
* @returns {Promise<DatabaseClientUnion>} Database client with no tenant filtering
*/
getTenants(req?: any): Promise<DatabaseClientUnion>;
/**
* Get organization-specific database
* @param {string} orgId - Organization ID
* @returns {OrgDatabase} Organization database instance
*/
org(orgId: string): OrgDatabase;
/**
* Health check for database connections
* @returns {Promise<Object>} Health status
*/
health(): Promise<any>;
/**
* List tenants in current context
* @param {Object} [req] - Request object for org context
* @returns {Promise<string[]>} Array of tenant IDs
*/
list(req?: any): Promise<string[]>;
/**
* Check if tenant exists
* @param {string} tenantId - Tenant ID
* @param {Object} [req] - Request object for org context
* @returns {Promise<boolean>} Whether tenant exists
*/
exists(tenantId: string, req?: any): Promise<boolean>;
/**
* Create tenant (registers tenant for future use)
* @param {string} tenantId - Tenant ID
* @param {Object} [req] - Request object for org context
* @returns {Promise<void>}
*/
create(tenantId: string, req?: any): Promise<void>;
/**
* Delete all tenant data (requires confirmation)
* @param {string} tenantId - Tenant ID
* @param {Object} options - Options object
* @param {boolean} options.confirm - Confirmation flag (required)
* @param {Object} [req] - Request object for org context
* @returns {Promise<void>}
*/
delete(tenantId: string, options: any, req?: any): Promise<void>;
/**
* Disconnect all connections and cleanup
* @returns {Promise<void>}
*/
disconnect(): Promise<void>;
/**
* Get distinct tenant IDs from database
* @private
*/
_getDistinctTenantIds(client: any): Promise<string[]>;
/**
* Check if tenant has data
* @private
*/
_tenantHasData(client: any, tenantId: string): Promise<boolean>;
/**
* Delete all tenant data
* @private
*/
_deleteAllTenantData(client: any, tenantId: string): Promise<void>;
/**
* Clear tenant-specific cached connections
* @private
*/
_clearTenantCache(tenantId: string): void;
/**
* Close database connection
* @private
*/
_closeConnection(connection: any): Promise<void>;
};
export default databaseClass;
//# sourceMappingURL=index.d.ts.map