Files
dyolink/backend/src/main.ts
rameen 50eda34e8e
Some checks failed
Production — tag build, push, deploy / build-and-push (push) Successful in 1h13m36s
Production — tag build, push, deploy / deploy (push) Failing after 1m1s
The app is now wired to GlitchTip with the Sentry SDKs
2026-08-31 07:34:07 +03:30

97 lines
3.1 KiB
TypeScript

// backend/src/main.ts
import './instrument';
import { NestFactory } from '@nestjs/core';
import { urlencoded } from 'express';
import { AppModule } from './app.module';
import { createJsonBodyParser } from './common/body-parsers';
import { ValidationPipe } from '@nestjs/common';
import cookieParser from 'cookie-parser'; // 👈 Change this line!
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import {
HttpExceptionFilter,
validationExceptionFactory,
} from './common/errors';
// At the VERY TOP of main.ts, before anything else
const originalConsoleLog = console.log;
console.log = (...args) => {
// Check if this is the massive Prisma dump (contains _clientVersion)
if (args.some(arg => arg && typeof arg === 'object' && arg._clientVersion)) {
console.error = originalConsoleLog; // Temporarily restore for this message
originalConsoleLog('🔍🔍🔍 PRISMA CLIENT DUMP DETECTED 🔍🔍🔍');
originalConsoleLog('Stack trace:', new Error().stack);
return; // Don't print the actual object
}
originalConsoleLog.apply(console, args);
};
async function bootstrap() {
// bodyParser is disabled so the JSON parsers can be registered in an explicit order below;
// Nest's built-in one would otherwise reject a voice recording at 100 kb.
const app = await NestFactory.create(AppModule, { bodyParser: false });
// Voice needs a larger JSON limit than everything else; see body-parsers.ts.
app.use(createJsonBodyParser());
app.use(urlencoded({ extended: true }));
app.useGlobalFilters(new HttpExceptionFilter());
// Global pipes
app.useGlobalPipes(new ValidationPipe({
whitelist: true,
forbidNonWhitelisted: true,
transform: true,
exceptionFactory: validationExceptionFactory,
}));
// Cookie parser - this is correct for Express
app.use(cookieParser());
// CORS
app.enableCors({
origin: process.env.FRONTEND_URL || 'http://localhost:3001',
credentials: true,
});
// Global prefix
app.setGlobalPrefix('api');
// Swagger configuration
const swaggerConfig = new DocumentBuilder()
.setTitle('Dyolink API')
.setDescription('Dental Clinic & Lab Communication Hub API')
.setVersion('1.0')
.addTag('auth', 'Authentication endpoints')
.addBearerAuth(
{
type: 'http',
scheme: 'bearer',
bearerFormat: 'JWT',
name: 'JWT',
description: 'Enter JWT token',
in: 'header',
},
'JWT-auth',
)
.build();
const document = SwaggerModule.createDocument(app, swaggerConfig);
SwaggerModule.setup('api/docs', app, document, {
swaggerOptions: {
persistAuthorization: true,
tagsSorter: 'alpha',
operationsSorter: 'alpha',
},
customSiteTitle: 'Dyolink API Documentation',
});
const port = parseInt(process.env.PORT || '', 10) || 3000;
await app.listen(port);
console.log(`🚀 Application is running on: http://localhost:${port}/api`);
console.log(`📚 Swagger documentation: http://localhost:${port}/api/docs`);
console.log(`📚 AdminJS Panel: http://localhost:${port}/admin`);
}
bootstrap();