import { ValidationPipe } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { NestFactory } from '@nestjs/core'; import RedisStore from 'connect-redis'; import * as cookieParser from 'cookie-parser'; import * as session from 'express-session'; import * as graphqlUploadExpress from 'graphql-upload/graphqlUploadExpress.js'; import { CoreModule } from '@/src/core/core.module'; import { RedisService } from '@/src/core/redis/redis.service'; import { ms } from '@/src/shared/util/ms.util'; import { parseBoolean } from '@/src/shared/util/parse-boolean.util'; async function bootstrap() { const app = await NestFactory.create(CoreModule, { rawBody: true }); const config = app.get(ConfigService); const redis = app.get(RedisService); app.use(cookieParser(config.getOrThrow('COOKIE_SECRET'))); app.use(config.getOrThrow('GRAPHQL_PREFIX'), graphqlUploadExpress()); app.useGlobalPipes(new ValidationPipe({ transform: true, })); app.use(session({ secret: config.getOrThrow('SESSION_SECRET'), name: config.getOrThrow('SESSION_NAME'), resave: false, saveUninitialized: false, cookie: { domain: config.getOrThrow('SESSION_DOMAIN'), maxAge: ms(config.getOrThrow('SESSION_MAX_AGE')), httpOnly: parseBoolean(config.getOrThrow('SESSION_HTTP_ONLY')), secure: parseBoolean(config.getOrThrow('SESSION_SECURE')), sameSite: 'lax', }, store: new RedisStore({ client: redis, prefix: config.getOrThrow('SESSION_FOLDER'), }), })); app.enableCors({ origin: config.getOrThrow('ALLOWED_ORIGIN'), credentials: true, exposedHeaders: ['set-cookie'], }); await app.listen(config.getOrThrow('APPLICATION_PORT')); } void bootstrap();