52 lines
1.7 KiB
TypeScript
52 lines
1.7 KiB
TypeScript
import { hash } from "bcryptjs";
|
|
import cache from "memory-cache";
|
|
import { NextMiddleware } from "next-api-middleware";
|
|
|
|
import { PRISMA_CLIENT_CACHING_TIME } from "@calcom/api/lib/constants";
|
|
// import prismaAdmin from "@calcom/console/modules/common/utils/prisma";
|
|
import { asStringOrUndefined } from "@calcom/lib/asStringOrNull";
|
|
import { CONSOLE_URL } from "@calcom/lib/constants";
|
|
import { prisma, customPrisma } from "@calcom/prisma";
|
|
|
|
// This replaces the prisma client for the cusotm one if the key is valid
|
|
export const customPrismaClient: NextMiddleware = async (req, res, next) => {
|
|
const {
|
|
query: { key },
|
|
}: { query: { key?: string } } = req;
|
|
// If no custom api Id is provided, attach to request the regular cal.com prisma client.
|
|
if (!key) {
|
|
req.prisma = prisma;
|
|
await next();
|
|
} else {
|
|
const id = asStringOrUndefined(key);
|
|
|
|
// If we have a key, we check if it is valid.
|
|
// const deployment = await prismaAdmin.deployment.findUnique({
|
|
// where: { key },
|
|
// });
|
|
const databaseUrl = await fetch(
|
|
`${process.env.NEXT_PUBLIC_CONSOLE_URL || CONSOLE_URL}/api/deployments/database?key=${id}`
|
|
)
|
|
.then((res) => res.json())
|
|
.then((res) => res.databaseUrl);
|
|
|
|
if (!databaseUrl) {
|
|
res.status(400).json({ error: "no databaseUrl set up at your instance yet" });
|
|
return;
|
|
}
|
|
const hashedUrl = await hash(databaseUrl, 12);
|
|
|
|
const cachedPrisma = cache.get(hashedUrl);
|
|
|
|
if (!cachedPrisma) {
|
|
cache.put(
|
|
hashedUrl,
|
|
customPrisma({ datasources: { db: { url: databaseUrl } } }),
|
|
PRISMA_CLIENT_CACHING_TIME // Cache the prisma client for 24 hours
|
|
);
|
|
}
|
|
req.prisma = customPrisma({ datasources: { db: { url: databaseUrl } } });
|
|
}
|
|
await next();
|
|
};
|