Files
the_order/packages/database/src/client.ts
defiQUG 2633de4d33 feat(eresidency): Complete eResidency service implementation
- Implement credential revocation endpoint with proper database integration
- Fix database row mapping (snake_case to camelCase) for eResidency applications
- Add missing imports (getRiskAssessmentEngine, VeriffKYCProvider, ComplyAdvantageSanctionsProvider)
- Fix environment variable type checking for Veriff and ComplyAdvantage providers
- Add required 'message' field to notification service calls
- Fix risk assessment type mismatches
- Update audit logging to use 'verified' action type (supported by schema)
- Resolve all TypeScript errors and unused variable warnings
- Add TypeScript ignore comments for placeholder implementations
- Temporarily disable security/detect-non-literal-regexp rule due to ESLint 9 compatibility
- Service now builds successfully with no linter errors

All core functionality implemented:
- Application submission and management
- KYC integration (Veriff placeholder)
- Sanctions screening (ComplyAdvantage placeholder)
- Risk assessment engine
- Credential issuance and revocation
- Reviewer console
- Status endpoints
- Auto-issuance service
2025-11-10 19:43:02 -08:00

95 lines
2.0 KiB
TypeScript

/**
* PostgreSQL database client with connection pooling
*/
import { Pool, PoolConfig, QueryResult, QueryResultRow } from 'pg';
// Re-export types for use in other modules
export type { QueryResult, QueryResultRow };
export interface DatabaseConfig {
connectionString?: string;
host?: string;
port?: number;
database?: string;
user?: string;
password?: string;
max?: number;
idleTimeoutMillis?: number;
connectionTimeoutMillis?: number;
}
/**
* Create a PostgreSQL connection pool
*/
export function createPool(config: DatabaseConfig): Pool {
const poolConfig: PoolConfig = {
connectionString: config.connectionString,
host: config.host,
port: config.port,
database: config.database,
user: config.user,
password: config.password,
max: config.max || 20,
idleTimeoutMillis: config.idleTimeoutMillis || 30000,
connectionTimeoutMillis: config.connectionTimeoutMillis || 2000,
};
return new Pool(poolConfig);
}
/**
* Default database pool instance
*/
let defaultPool: Pool | null = null;
/**
* Get or create the default database pool
*/
export function getPool(config?: DatabaseConfig): Pool {
if (!defaultPool) {
if (!config) {
throw new Error('Database configuration required for first pool creation');
}
defaultPool = createPool(config);
}
return defaultPool;
}
/**
* Execute a query
*/
export async function query<T extends QueryResultRow = QueryResultRow>(
text: string,
params?: unknown[]
): Promise<QueryResult<T>> {
if (!defaultPool) {
throw new Error('Database pool not initialized. Call getPool() with configuration first.');
}
return defaultPool.query<T>(text, params);
}
/**
* Close the database pool
*/
export async function closePool(): Promise<void> {
if (defaultPool) {
await defaultPool.end();
defaultPool = null;
}
}
/**
* Health check for database connection
*/
export async function healthCheck(): Promise<boolean> {
try {
const pool = getPool();
await pool.query('SELECT 1');
return true;
} catch {
return false;
}
}