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' path: 'prisma/migrations'
}, },
datasource: { datasource: {
url: process.env['POSTGRES_URI'] url: process.env['DATABASE_URI']
} }
}) })

View File

@ -1,7 +1,7 @@
import { Module } from '@nestjs/common' import { Module } from '@nestjs/common'
import { ConfigModule } from '@nestjs/config' import { ConfigModule } from '@nestjs/config'
import { grpcEnv } from './config' import { dabataseEnv, grpcEnv } from './config'
import { PrismaModule } from './infra/prisma/prisma.module' import { PrismaModule } from './infra/prisma/prisma.module'
import { RedisModule } from './infra/redis/redis.module' import { RedisModule } from './infra/redis/redis.module'
import { AuthModule } from './modules/auth/auth.module' import { AuthModule } from './modules/auth/auth.module'
@ -9,7 +9,7 @@ import { OtpModule } from './modules/otp/otp.module'
@Module({ @Module({
imports: [ imports: [
ConfigModule.forRoot({ isGlobal: true, load: [grpcEnv] }), ConfigModule.forRoot({ isGlobal: true, load: [dabataseEnv, grpcEnv] }),
PrismaModule, PrismaModule,
RedisModule, RedisModule,
AuthModule, 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 './grpc.env'
export * from './database.env'

View File

@ -1,5 +1,7 @@
import { DatabaseConfig } from './database.interface'
import { GrpcConfig } from './grpc.interface' import { GrpcConfig } from './grpc.interface'
export interface AllConfigs { export interface AllConfigs {
database: DatabaseConfig
grpc: GrpcConfig 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 './grpc.validator'
export * from './database.validator'

View File

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