mirror of
https://github.com/docmost/docmost.git
synced 2025-11-13 12:12:39 +10:00
* stripe init git submodules for enterprise modules * * Cloud billing UI - WIP * Proxy websockets in dev mode * Separate workspace login and creation for cloud * Other fixes * feat: billing (cloud) * * add domain service * prepare links from workspace hostname * WIP * Add exchange token generation * Validate JWT token type during verification * domain service * add SkipTransform decorator * * updates (server) * add new packages * new sso migration file * WIP * Fix hostname generation * WIP * WIP * Reduce input error font-size * set max password length * jwt package * license page - WIP * * License management UI * Move license key store to db * add reflector * SSO enforcement * * Add default plan * Add usePlan hook * * Fix auth container margin in mobile * Redirect login and home to select page in cloud * update .gitignore * Default to yearly * * Trial messaging * Handle ended trials * Don't set to readonly on collab disconnect (Cloud) * Refine trial (UI) * Fix bug caused by using jotai optics atom in AppHeader component * configurable database maximum pool * Close SSO form on save * wip * sync * Only show sign-in in cloud * exclude base api part from workspaceId check * close db connection beforeApplicationShutdown * Add health/live endpoint * clear cookie on hostname change * reset currentUser atom * Change text * return 401 if workspace does not match * feat: show user workspace list in cloud login page * sync * Add home path * Prefetch to speed up queries * * Add robots.txt * Disallow login and forgot password routes * wildcard user-agent * Fix space query cache * fix * fix * use space uuid for recent pages * prefetch billing plans * enhance license page * sync
97 lines
2.7 KiB
TypeScript
97 lines
2.7 KiB
TypeScript
import { NestFactory, Reflector } from '@nestjs/core';
|
|
import { AppModule } from './app.module';
|
|
import {
|
|
FastifyAdapter,
|
|
NestFastifyApplication,
|
|
} from '@nestjs/platform-fastify';
|
|
import { Logger, NotFoundException, ValidationPipe } from '@nestjs/common';
|
|
import { TransformHttpResponseInterceptor } from './common/interceptors/http-response.interceptor';
|
|
import { WsRedisIoAdapter } from './ws/adapter/ws-redis.adapter';
|
|
import { InternalLogFilter } from './common/logger/internal-log-filter';
|
|
import fastifyMultipart from '@fastify/multipart';
|
|
import fastifyCookie from '@fastify/cookie';
|
|
|
|
async function bootstrap() {
|
|
const app = await NestFactory.create<NestFastifyApplication>(
|
|
AppModule,
|
|
new FastifyAdapter({
|
|
ignoreTrailingSlash: true,
|
|
ignoreDuplicateSlashes: true,
|
|
maxParamLength: 1000,
|
|
trustProxy: true,
|
|
}),
|
|
{
|
|
rawBody: true,
|
|
logger: new InternalLogFilter(),
|
|
},
|
|
);
|
|
|
|
app.setGlobalPrefix('api', { exclude: ['robots.txt'] });
|
|
|
|
const reflector = app.get(Reflector);
|
|
const redisIoAdapter = new WsRedisIoAdapter(app);
|
|
await redisIoAdapter.connectToRedis();
|
|
|
|
app.useWebSocketAdapter(redisIoAdapter);
|
|
|
|
await app.register(fastifyMultipart);
|
|
await app.register(fastifyCookie);
|
|
|
|
app
|
|
.getHttpAdapter()
|
|
.getInstance()
|
|
.decorateReply('setHeader', function (name: string, value: unknown) {
|
|
this.header(name, value);
|
|
})
|
|
.decorateReply('end', function () {
|
|
this.send('');
|
|
})
|
|
.addHook('preHandler', function (req, reply, done) {
|
|
// don't require workspaceId for the following paths
|
|
const excludedPaths = [
|
|
'/api/auth/setup',
|
|
'/api/health',
|
|
'/api/billing/stripe/webhook',
|
|
'/api/workspace/check-hostname',
|
|
'/api/sso/google',
|
|
'/api/workspace/create',
|
|
'/api/workspace/joined',
|
|
];
|
|
|
|
if (
|
|
req.originalUrl.startsWith('/api') &&
|
|
!excludedPaths.some((path) => req.originalUrl.startsWith(path))
|
|
) {
|
|
if (!req.raw?.['workspaceId'] && req.originalUrl !== '/api') {
|
|
throw new NotFoundException('Workspace not found');
|
|
}
|
|
done();
|
|
} else {
|
|
done();
|
|
}
|
|
});
|
|
|
|
app.useGlobalPipes(
|
|
new ValidationPipe({
|
|
whitelist: true,
|
|
stopAtFirstError: true,
|
|
transform: true,
|
|
}),
|
|
);
|
|
|
|
app.enableCors();
|
|
app.useGlobalInterceptors(new TransformHttpResponseInterceptor(reflector));
|
|
app.enableShutdownHooks();
|
|
|
|
const logger = new Logger('NestApplication');
|
|
|
|
const port = process.env.PORT || 3000;
|
|
await app.listen(port, '0.0.0.0', () => {
|
|
logger.log(
|
|
`Listening on http://127.0.0.1:${port} / ${process.env.APP_URL}`,
|
|
);
|
|
});
|
|
}
|
|
|
|
bootstrap();
|