feat: add database env validator

This commit is contained in:
Sergey Krylov 2026-01-28 05:50:30 +03:00
parent 15e63f9725
commit d3c5ffb8fe
9 changed files with 67 additions and 9 deletions

View File

@ -7,6 +7,6 @@ export default defineConfig({
path: 'prisma/migrations'
},
datasource: {
url: process.env['POSTGRES_URI']
url: process.env['DATABASE_URI']
}
})

View File

@ -1,7 +1,7 @@
import { Module } from '@nestjs/common'
import { ConfigModule } from '@nestjs/config'
import { grpcEnv } from './config'
import { dabataseEnv, grpcEnv } from './config'
import { PrismaModule } from './infra/prisma/prisma.module'
import { RedisModule } from './infra/redis/redis.module'
import { AuthModule } from './modules/auth/auth.module'
@ -9,7 +9,7 @@ import { OtpModule } from './modules/otp/otp.module'
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true, load: [grpcEnv] }),
ConfigModule.forRoot({ isGlobal: true, load: [dabataseEnv, grpcEnv] }),
PrismaModule,
RedisModule,
AuthModule,

19
src/config/env/database.env.ts vendored Normal file
View File

@ -0,0 +1,19 @@
import { registerAs } from '@nestjs/config'
import { validateEnv } from '@/shared/utils'
import { DatabaseConfig } from '../interfaces/database.interface'
import { DatabaseValidator } from '../validators'
export const dabataseEnv = registerAs<DatabaseConfig>('database', () => {
validateEnv(process.env, DatabaseValidator)
return {
username: process.env.DATABASE_USERNAME,
password: process.env.DATABASE_PASSWORD,
host: process.env.DATABASE_HOST,
port: parseInt(process.env.DATABASE_PORT),
name: process.env.DATABASE_NAME,
uri: process.env.DATABASE_URI
}
})

View File

@ -1 +1,2 @@
export * from './grpc.env'
export * from './database.env'

View File

@ -1,5 +1,7 @@
import { DatabaseConfig } from './database.interface'
import { GrpcConfig } from './grpc.interface'
export interface AllConfigs {
database: DatabaseConfig
grpc: GrpcConfig
}

View File

@ -0,0 +1,8 @@
export interface DatabaseConfig {
username: string
password: string
host: string
port: number
name: string
uri: string
}

View File

@ -0,0 +1,23 @@
import { IsInt, IsString, Max, Min } from 'class-validator'
export class DatabaseValidator {
@IsString()
public DATABASE_USERNAME: string
@IsString()
public DATABASE_PASSWORD: string
@IsString()
public DATABASE_HOST: string
@Min(1)
@Max(65535)
@IsInt()
public DATABASE_PORT: number
@IsString()
public DATABASE_NAME: string
@IsString()
public DATABASE_URI: string
}

View File

@ -1 +1,2 @@
export * from './grpc.validator'
export * from './database.validator'

View File

@ -8,6 +8,8 @@ import { ConfigService } from '@nestjs/config'
import { PrismaPg } from '@prisma/adapter-pg'
import { PrismaClient } from '@prisma/generated/client'
import { AllConfigs } from '@/config'
@Injectable()
export class PrismaService
extends PrismaClient
@ -15,14 +17,16 @@ export class PrismaService
{
private readonly logger = new Logger(PrismaService.name)
public constructor(private readonly configService: ConfigService) {
public constructor(
private readonly configService: ConfigService<AllConfigs>
) {
super({
adapter: new PrismaPg({
user: configService.getOrThrow<string>('POSTGRES_USERNAME'),
password: configService.getOrThrow<string>('POSTGRES_PASSWORD'),
host: configService.getOrThrow<string>('POSTGRES_HOST'),
port: configService.getOrThrow<number>('POSTGRES_PORT'),
database: configService.getOrThrow<string>('POSTGRES_DATABASE_NAME')
user: configService.get('database.username', { infer: true }),
password: configService.get('database.password', { infer: true }),
host: configService.get('database.host', { infer: true }),
port: configService.get('database.port', { infer: true }),
database: configService.get('database.name', { infer: true })
})
})
}