54 lines
1.7 KiB
TypeScript
54 lines
1.7 KiB
TypeScript
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<string>('ALLOWED_ORIGIN'),
|
|
credentials: true,
|
|
exposedHeaders: ['set-cookie'],
|
|
});
|
|
|
|
await app.listen(config.getOrThrow('APPLICATION_PORT'));
|
|
}
|
|
void bootstrap();
|