import { Injectable, OnModuleInit, OnModuleDestroy, Logger } from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; @Injectable() export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy { private readonly logger = new Logger(PrismaService.name); constructor() { super({ log: process.env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'], }); } async onModuleInit() { try { await this.$connect(); this.logger.log('✅ Database connected successfully'); } catch (error) { this.logger.error('❌ Database connection failed', error); throw error; } } async onModuleDestroy() { await this.$disconnect(); this.logger.log('Database disconnected'); } /** * Clean database method for testing * WARNING: Only use in development/testing! */ async cleanDatabase() { if (process.env.NODE_ENV === 'production') { throw new Error('Cannot clean database in production!'); } const models = Object.keys(this).filter( (key) => !key.startsWith('_') && !key.startsWith('$'), ); return Promise.all( models.map((modelKey) => { const model = this[modelKey as keyof this]; if (model && typeof model === 'object' && 'deleteMany' in model) { return (model as any).deleteMany(); } }), ); } }