106 lines
3.5 KiB
TypeScript
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('*');
|
|
}
|
|
}
|