This repository has been archived on 2025-03-21. You can view files and clone it, but cannot push or open issues or pull requests.
insiemesalute-3p-nx/apps/ebitemp-api/src/app/modules/database/database.config.ts

64 lines
1.7 KiB
TypeScript

import { registerAs } from '@nestjs/config';
import { ConnectionString } from 'connection-string';
import { first } from 'lodash';
import { z } from 'zod';
import coerceRecordTypes from '../config/utils/coerce-record-types';
export const databaseSchema = z.object({
connectionString: z.string(),
type: z.enum([
'mysql',
'postgres',
'cockroachdb',
'sap',
'mariadb',
'sqlite',
'cordova',
'react-native',
'nativescript',
'sqljs',
'oracle',
'mssql',
'mongodb',
'aurora-mysql',
'aurora-postgres',
'expo',
'better-sqlite3',
'capacitor',
'spanner',
]),
host: z.string(),
port: z.number().optional(),
username: z.string(),
password: z.string(),
database: z.string(),
secure: z.boolean(),
});
export type DatabaseConfig = z.TypeOf<typeof databaseSchema>;
const rawDatabaseSchema = z.object({
connectionString: z.string(),
secure: z.boolean().default(true),
});
export const databaseConfig = registerAs('database', () => {
const env = coerceRecordTypes(process.env);
const envParsed = rawDatabaseSchema.strict().parse({
connectionString: env['DATABASE_CONNECTION_STRING'],
secure: env['DATABASE_SECURE'],
});
const connectionString = new ConnectionString(envParsed.connectionString);
const config: DatabaseConfig = databaseSchema.strict().parse({
connectionString: connectionString.toString(),
type: connectionString.protocol,
host: first(connectionString.hosts)?.name,
port: first(connectionString.hosts)?.port,
username: connectionString.user,
password: connectionString.password,
database: first(connectionString.path),
secure: envParsed.secure,
});
return config;
});