diff --git a/prisma/schema.prisma b/prisma/schema.prisma index b9b3a41..a598bc7 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -6,7 +6,6 @@ generator client { provider = "prisma-client-js" - output = "../generated/prisma" } datasource db { diff --git a/src/app.module.ts b/src/app.module.ts index 8662803..ead0157 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,10 +1,13 @@ import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; +import { PrismaModule } from './prisma/prisma.module'; +import { HealthModule } from './health/health.module'; +import { HealthController } from './health/health.controller'; @Module({ - imports: [], - controllers: [AppController], + imports: [PrismaModule, HealthModule], + controllers: [AppController, HealthController], providers: [AppService], }) export class AppModule {} diff --git a/src/health/health.controller.spec.ts b/src/health/health.controller.spec.ts new file mode 100644 index 0000000..0ab9987 --- /dev/null +++ b/src/health/health.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { HealthController } from './health.controller'; + +describe('HealthController', () => { + let controller: HealthController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [HealthController], + }).compile(); + + controller = module.get(HealthController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/health/health.controller.ts b/src/health/health.controller.ts new file mode 100644 index 0000000..0718382 --- /dev/null +++ b/src/health/health.controller.ts @@ -0,0 +1,13 @@ +import { Controller, Get } from '@nestjs/common'; +import { PrismaService } from '../prisma/prisma.service'; + +@Controller('health') +export class HealthController { + constructor(private readonly prisma: PrismaService) {} + + @Get() + async check(): Promise<{ status: string }> { + await this.prisma.$queryRaw`SELECT 1`; + return { status: 'ok' }; + } +} diff --git a/src/health/health.module.ts b/src/health/health.module.ts new file mode 100644 index 0000000..3f7f985 --- /dev/null +++ b/src/health/health.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { HealthController } from './health.controller'; +import { PrismaModule } from '../prisma/prisma.module'; + +@Module({ + imports: [PrismaModule], + controllers: [HealthController], +}) +export class HealthModule {} diff --git a/src/prisma/prisma.module.ts b/src/prisma/prisma.module.ts index e69de29..7207426 100644 --- a/src/prisma/prisma.module.ts +++ b/src/prisma/prisma.module.ts @@ -0,0 +1,9 @@ +import { Global, Module } from '@nestjs/common'; +import { PrismaService } from './prisma.service'; + +@Global() +@Module({ + providers: [PrismaService], + exports: [PrismaService], +}) +export class PrismaModule {} diff --git a/src/prisma/prisma.service.ts b/src/prisma/prisma.service.ts index e69de29..0e4c877 100644 --- a/src/prisma/prisma.service.ts +++ b/src/prisma/prisma.service.ts @@ -0,0 +1,18 @@ +import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'; +import { PrismaClient } from '@prisma/client'; + +//Gestion des connections à la DB + +@Injectable() +export class PrismaService + extends PrismaClient + implements OnModuleInit, OnModuleDestroy +{ + async onModuleInit() { + await this.$connect(); + } + + async onModuleDestroy() { + await this.$disconnect(); + } +} diff --git a/test/health.e2e-spec.ts b/test/health.e2e-spec.ts new file mode 100644 index 0000000..47db223 --- /dev/null +++ b/test/health.e2e-spec.ts @@ -0,0 +1,29 @@ +import { INestApplication } from '@nestjs/common'; +import { Test, TestingModule } from '@nestjs/testing'; +import * as request from 'supertest'; +import { AppModule } from './../src/app.module'; + +describe('HealthController (e2e)', () => { + let app: INestApplication; + + beforeAll(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/health (GET) → 200 & { status: "ok" }', () => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + return request(app.getHttpServer()) + .get('/health') + .expect(200) + .expect({ status: 'ok' }); + }); + + afterAll(async () => { + await app.close(); + }); +});