* chore: deploy api v2 on vercel * fix: replace console.log with logger.log in Vercel handler Address Cubic AI review feedback to use the logging framework consistently instead of console.log in the serverless handler. Co-Authored-By: unknown <> * chore: enable esModuleInterop * chore: deploy api v2 on vercel * chore: deploy api v2 on vercel * Update apps/api/v2/src/bootstrap.ts Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> * fixup! Merge branch 'main' into deploy-api-v2-vercel * Revert "chore: deploy api v2 on vercel" This reverts commit 45c704a48e8396c46118069e1a25d8d7a5ee84be. * chore: deploy api v2 on vercel * fix: address Cubic AI review feedback in main.ts - Replace console.log with logger.log for consistent logging - Replace console.error with logger.error for consistent error logging - Restore comma: true option in qs.parse to support comma-separated arrays Co-Authored-By: unknown <> * fix: remove comma: true from qs.parse to maintain backward compatibility The main branch does not have comma: true in the query parser, so adding it would be a breaking change for existing API consumers. Removing it to maintain consistency with the current production behavior. Co-Authored-By: unknown <> * chore: deploy api v2 on vercel * small fixes * chore: add try catch around bootstrap.ts * fix: use NestJS Logger and throw error instead of process.exit in bootstrap - Replace console.error with logger.error for consistent logging - Replace process.exit(1) with throw error to avoid breaking Vercel serverless instance reuse Addresses Cubic AI review feedback (confidence 10/10 for both issues) Co-Authored-By: unknown <> * chore: try log redis url * fix: sanitize REDIS_URL logging to avoid exposing credentials Replace full REDIS_URL logging with a boolean check that only indicates whether Redis is configured, without exposing the connection string. Addresses Cubic AI review feedback (confidence 9/10) Co-Authored-By: unknown <> * chore: remove unnecessary logs * fix: prisma adapter * chore: handle USE_POOL platform libraries * fix: use JSON.stringify for Vite define value Wrap usePool with JSON.stringify() to properly serialize the string value. Without this, Vite injects the raw value as an identifier instead of a string literal, breaking runtime behavior. Addresses Cubic AI review feedback (confidence 9/10) Co-Authored-By: unknown <> * fix: docker file builds * fix: correct Dockerfile build order for platform packages Reorder builds to match the dependency graph from dev:build script: constants → enums → utils → types → libraries → trpc → api-v2 platform-libraries depends on the other platform packages, so they must be built first. Addresses Cubic AI review feedback (confidence 9/10) Co-Authored-By: unknown <> * fix: docker file builds * chore: add docker build * chore: upgrade nest/bull --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
89 lines
2.9 KiB
TypeScript
89 lines
2.9 KiB
TypeScript
import "./instrument";
|
|
|
|
import {
|
|
API_VERSIONS,
|
|
API_VERSIONS_ENUM,
|
|
CAL_API_VERSION_HEADER,
|
|
VERSION_2024_04_15,
|
|
X_CAL_CLIENT_ID,
|
|
X_CAL_PLATFORM_EMBED,
|
|
X_CAL_SECRET_KEY,
|
|
} from "@calcom/platform-constants";
|
|
import type { ValidationError } from "@nestjs/common";
|
|
import { BadRequestException, Logger, ValidationPipe, VersioningType } from "@nestjs/common";
|
|
import type { NestExpressApplication } from "@nestjs/platform-express";
|
|
import cookieParser from "cookie-parser";
|
|
import { Request } from "express";
|
|
import helmet from "helmet";
|
|
import { HttpExceptionFilter } from "@/filters/http-exception.filter";
|
|
import { PrismaExceptionFilter } from "@/filters/prisma-exception.filter";
|
|
import { ZodExceptionFilter } from "@/filters/zod-exception.filter";
|
|
import { CalendarServiceExceptionFilter } from "./filters/calendar-service-exception.filter";
|
|
import { TRPCExceptionFilter } from "./filters/trpc-exception.filter";
|
|
|
|
const logger: Logger = new Logger("Bootstrap");
|
|
|
|
export const bootstrap = (app: NestExpressApplication): NestExpressApplication => {
|
|
try {
|
|
if (!process.env.VERCEL) {
|
|
app.enableShutdownHooks();
|
|
}
|
|
app.enableVersioning({
|
|
type: VersioningType.CUSTOM,
|
|
extractor: (request: unknown) => {
|
|
const headerVersion = (request as Request)?.headers[CAL_API_VERSION_HEADER] as string | undefined;
|
|
if (headerVersion && API_VERSIONS.includes(headerVersion as API_VERSIONS_ENUM)) {
|
|
return headerVersion;
|
|
}
|
|
return VERSION_2024_04_15;
|
|
},
|
|
defaultVersion: VERSION_2024_04_15,
|
|
});
|
|
app.use(helmet());
|
|
app.enableCors({
|
|
origin: "*",
|
|
methods: ["GET", "PATCH", "DELETE", "HEAD", "POST", "PUT", "OPTIONS"],
|
|
allowedHeaders: [
|
|
X_CAL_CLIENT_ID,
|
|
X_CAL_SECRET_KEY,
|
|
X_CAL_PLATFORM_EMBED,
|
|
CAL_API_VERSION_HEADER,
|
|
"Accept",
|
|
"Authorization",
|
|
"Content-Type",
|
|
"Origin",
|
|
],
|
|
maxAge: 86_400,
|
|
});
|
|
app.useGlobalPipes(
|
|
new ValidationPipe({
|
|
whitelist: true,
|
|
transform: true,
|
|
validationError: {
|
|
target: true,
|
|
value: true,
|
|
},
|
|
exceptionFactory(errors: ValidationError[]): BadRequestException {
|
|
return new BadRequestException({ errors });
|
|
},
|
|
})
|
|
);
|
|
// Exception filters, new filters go at the bottom, keep the order
|
|
app.useGlobalFilters(new PrismaExceptionFilter());
|
|
app.useGlobalFilters(new ZodExceptionFilter());
|
|
app.useGlobalFilters(new HttpExceptionFilter());
|
|
app.useGlobalFilters(new TRPCExceptionFilter());
|
|
app.useGlobalFilters(new CalendarServiceExceptionFilter());
|
|
app.use(cookieParser());
|
|
|
|
if (process?.env?.API_GLOBAL_PREFIX) {
|
|
app.setGlobalPrefix(process?.env?.API_GLOBAL_PREFIX);
|
|
}
|
|
|
|
return app;
|
|
} catch (error) {
|
|
logger.error("Error starting NestJS app:", error);
|
|
throw error;
|
|
}
|
|
};
|