import { Module } from '@nestjs/common'
import { TypeOrmModule } from '@nestjs/typeorm'
import { ConfigModule, ConfigService } from '@nestjs/config'
import { ServeStaticModule } from '@nestjs/serve-static'
import { MailerModule } from '@nestjs-modules/mailer'
import { ThrottlerModule } from '@nestjs/throttler'
import { CacheModule } from '@nestjs/cache-manager'
import * as path from 'path'
import { join } from 'path'
// Feature Modules
import { StatsModule } from './stats/stats.module'
import { UsersModule } from './users/users.module'
import { ActivitiesModule } from './activities/activities.module'
import { ProjectModule } from './projects/project.module'
import { AuthModule } from './auth/auth.module'
import { MailModule } from './mail/mail.module'
import { ConfiguracionModule } from './configuracion/configuracion.module'
@Module({
imports: [
// Cache Configuration
CacheModule.register({
ttl: 60000, // 60 seconds
max: 100, // Max items
isGlobal: true,
}),
// Environment Configuration
ConfigModule.forRoot({
isGlobal: true,
envFilePath: path.resolve(__dirname, '../../.env')
}),
// Email Configuration
MailerModule.forRoot({
transport: {
host: 'smtp.gmail.com',
port: 587,
secure: false,
auth: {
user: '[email protected]',
pass: process.env.SMTP_PASSWORD
},
},
defaults: {
from: '"SociApp" <[email protected]>',
},
}),
// Database Configuration
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (configService: ConfigService) => ({
type: 'mysql',
host: configService.get('DB_HOST'),
port: configService.get('DB_PORT'),
username: configService.get('DB_USERNAME'),
password: configService.get('DB_PASSWORD'),
database: configService.get('DB_NAME'),
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: false, // Never true in production!
}),
}),
// Rate Limiting
ThrottlerModule.forRoot([{
ttl: 60, // Time window in seconds
limit: 10, // Max requests per window
}]),
// Static File Serving
ServeStaticModule.forRoot({
rootPath: join(process.cwd(), 'uploads'),
serveRoot: '/uploads',
}),
// Feature Modules
StatsModule,
UsersModule,
ActivitiesModule,
ProjectModule,
AuthModule,
ConfiguracionModule,
MailModule,
],
controllers: [],
providers: [],
})
export class AppModule { }