version 1.0.0
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
import { Controller, Get } from '@nestjs/common';
|
||||
import { ApiOkResponse, ApiTags } from '@nestjs/swagger';
|
||||
import { HealthResponseDto } from './health.dto';
|
||||
import { HealthService } from './health.service';
|
||||
|
||||
@ApiTags('health')
|
||||
@Controller({
|
||||
path: 'health',
|
||||
version: '1',
|
||||
})
|
||||
export class HealthController {
|
||||
constructor(private readonly healthService: HealthService) {}
|
||||
|
||||
@Get()
|
||||
@ApiOkResponse({ type: HealthResponseDto })
|
||||
async getHealth(): Promise<HealthResponseDto> {
|
||||
return this.healthService.getHealth();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
import { ApiProperty } from '@nestjs/swagger';
|
||||
|
||||
class HealthDependencyDto {
|
||||
@ApiProperty({ example: 'up' })
|
||||
status!: 'up' | 'down';
|
||||
}
|
||||
|
||||
class StorageDependencyDto extends HealthDependencyDto {
|
||||
@ApiProperty({ example: '/app/runtime/storage' })
|
||||
root!: string;
|
||||
}
|
||||
|
||||
export class HealthResponseDto {
|
||||
@ApiProperty({ example: 'velody-backend' })
|
||||
service!: string;
|
||||
|
||||
@ApiProperty({ example: '0.1.0' })
|
||||
version!: string;
|
||||
|
||||
@ApiProperty({ type: HealthDependencyDto })
|
||||
database!: HealthDependencyDto;
|
||||
|
||||
@ApiProperty({ type: StorageDependencyDto })
|
||||
storage!: StorageDependencyDto;
|
||||
|
||||
@ApiProperty({ example: '2026-05-24T20:00:00.000Z' })
|
||||
serverTime!: string;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { PrismaModule } from '../../infrastructure/database/prisma.module';
|
||||
import { StorageModule } from '../storage/storage.module';
|
||||
import { HealthController } from './health.controller';
|
||||
import { HealthService } from './health.service';
|
||||
|
||||
@Module({
|
||||
imports: [PrismaModule, StorageModule],
|
||||
controllers: [HealthController],
|
||||
providers: [HealthService],
|
||||
})
|
||||
export class HealthModule {}
|
||||
@@ -0,0 +1,44 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { AppConfigService } from '../config/config.service';
|
||||
import { PrismaService } from '../../infrastructure/database/prisma.service';
|
||||
import { LocalFilesystemStorageService } from '../storage/storage.service';
|
||||
import { HealthResponseDto } from './health.dto';
|
||||
|
||||
@Injectable()
|
||||
export class HealthService {
|
||||
constructor(
|
||||
private readonly configService: AppConfigService,
|
||||
private readonly prismaService: PrismaService,
|
||||
private readonly storageService: LocalFilesystemStorageService,
|
||||
) {}
|
||||
|
||||
async getHealth(): Promise<HealthResponseDto> {
|
||||
let databaseStatus: 'up' | 'down' = 'up';
|
||||
let storageStatus: 'up' | 'down' = 'up';
|
||||
|
||||
try {
|
||||
await this.prismaService.$queryRawUnsafe('SELECT 1');
|
||||
} catch {
|
||||
databaseStatus = 'down';
|
||||
}
|
||||
|
||||
try {
|
||||
await this.storageService.checkReadiness();
|
||||
} catch {
|
||||
storageStatus = 'down';
|
||||
}
|
||||
|
||||
return {
|
||||
service: 'velody-backend',
|
||||
version: this.configService.appVersion,
|
||||
database: {
|
||||
status: databaseStatus,
|
||||
},
|
||||
storage: {
|
||||
status: storageStatus,
|
||||
root: this.storageService.root,
|
||||
},
|
||||
serverTime: new Date().toISOString(),
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user