canina/backend/src/app.module.ts

106 lines
3.5 KiB
TypeScript

import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { PrismaModule } from './prisma/prisma.module';
import { ProductsModule } from './products/products.module';
import { UsersModule } from './users/users.module';
import { RedisModule } from './redis/redis.module';
import { RedisService } from './redis/redis.service';
import { AuthModule } from './auth/auth.module';
import { PetsModule } from './pets/pets.module';
import { OrdersModule } from './orders/orders.module';
import { SettingsModule } from './settings/settings.module';
import { ThrottlerModule, ThrottlerGuard } from '@nestjs/throttler';
import { APP_GUARD } from '@nestjs/core';
import { MetricsController } from './common/metrics.controller';
import { AdminModule } from './admin/admin.module';
import { HomeModule } from './home/home.module';
import { BlogsModule } from './blogs/blogs.module';
import { WikiModule } from './wiki/wiki.module';
import { SeoModule } from './seo/seo.module';
import { CmsModule } from './cms/cms.module';
import { WholesaleModule } from './wholesale/wholesale.module';
import { VideosModule } from './videos/videos.module';
import { SmsModule } from './common/sms.module';
import { ContactModule } from './contact/contact.module';
import { BannersModule } from './banners/banners.module';
import { SmartAdvisorModule } from './smart-advisor/smart-advisor.module';
import { TestimonialsModule } from './testimonials/testimonials.module';
import { IngredientsModule } from './ingredients/ingredients.module';
import { PrescriptionsModule } from './prescriptions/prescriptions.module';
import { B2BModule } from './b2b/b2b.module';
import { PaymentModule } from './payment/payment.module';
import { Request, Response, NextFunction } from 'express';
@Module({
imports: [
SmsModule,
ContactModule,
PrismaModule,
RedisModule,
ProductsModule,
UsersModule,
AuthModule,
PetsModule,
OrdersModule,
SettingsModule,
PaymentModule,
ThrottlerModule.forRoot([
{
ttl: 60000,
limit: 100,
},
]),
AdminModule,
HomeModule,
BlogsModule,
WikiModule,
SeoModule,
CmsModule,
WholesaleModule,
VideosModule,
BannersModule,
SmartAdvisorModule,
TestimonialsModule,
IngredientsModule,
PrescriptionsModule,
B2BModule,
],
controllers: [MetricsController],
providers: [
{
provide: APP_GUARD,
useClass: ThrottlerGuard,
},
RedisService,
],
})
export class AppModule implements NestModule {
constructor(private readonly redisService: RedisService) {}
configure(consumer: MiddlewareConsumer) {
consumer
.apply((req: Request, res: Response, next: NextFunction) => {
MetricsController.incrementRequestCount();
const url: string = req.originalUrl || req.url || '';
const method: string = req.method || '';
// Exclude options, admin panel requests, static assets, and health metrics from visit counter
const isAdminPath =
url.includes('/admin') || url.includes('/api/admin');
const isStaticAsset = url.match(
/\.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?|map)$/i,
);
const isIgnoredMethod = method === 'OPTIONS' || method === 'HEAD';
if (!isAdminPath && !isStaticAsset && !isIgnoredMethod) {
const todayKey = `visits:${new Date().toISOString().split('T')[0]}`;
this.redisService.incr(todayKey, 86400).catch(() => {});
}
next();
})
.exclude('metrics')
.forRoutes('*');
}
}