Skip to content

Commit

Permalink
chore: run migrations conditionally (calcom#13925)
Browse files Browse the repository at this point in the history
Co-authored-by: Keith Williams <[email protected]>
Co-authored-by: Udit Takkar <[email protected]>
  • Loading branch information
3 people authored Mar 13, 2024
1 parent a4bc079 commit 502a324
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 27 deletions.
16 changes: 5 additions & 11 deletions apps/web/app/future/apps/categories/[category]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import CategoryPage, { type PageProps } from "@pages/apps/categories/[category]";
import { Prisma } from "@prisma/client";
import { withAppDirSsg } from "app/WithAppDirSsg";
import { _generateMetadata } from "app/_utils";
import { WithLayout } from "app/layoutHOC";

import { APP_NAME } from "@calcom/lib/constants";
import prisma from "@calcom/prisma";
import { AppCategories } from "@calcom/prisma/enums";
import { isPrismaAvailableCheck } from "@calcom/prisma/is-prisma-available-check";

import { getStaticProps } from "@lib/apps/categories/[category]/getStaticProps";

Expand All @@ -19,16 +18,11 @@ export const generateMetadata = async () => {

export const generateStaticParams = async () => {
const paths = Object.keys(AppCategories);
const isPrismaAvailable = await isPrismaAvailableCheck();

try {
await prisma.$queryRaw`SELECT 1`;
} catch (e: unknown) {
if (e instanceof Prisma.PrismaClientInitializationError) {
// Database is not available at build time. Make sure we fall back to building these pages on demand
return [];
} else {
throw e;
}
if (!isPrismaAvailable) {
// Database is not available at build time. Make sure we fall back to building these pages on demand
return [];
}

return paths.map((category) => ({ category }));
Expand Down
23 changes: 8 additions & 15 deletions apps/web/pages/apps/categories/[category].tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
"use client";

import { Prisma } from "@prisma/client";
import type { InferGetStaticPropsType } from "next";
import Link from "next/link";

import Shell from "@calcom/features/shell/Shell";
import { useCompatSearchParams } from "@calcom/lib/hooks/useCompatSearchParams";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import prisma from "@calcom/prisma";
import { AppCategories } from "@calcom/prisma/enums";
import { isPrismaAvailableCheck } from "@calcom/prisma/is-prisma-available-check";
import { AppCard, SkeletonText } from "@calcom/ui";

import { getStaticProps } from "@lib/apps/categories/[category]/getStaticProps";
Expand Down Expand Up @@ -62,19 +61,13 @@ Apps.PageWrapper = PageWrapper;

export const getStaticPaths = async () => {
const paths = Object.keys(AppCategories);

try {
await prisma.$queryRaw`SELECT 1`;
} catch (e: unknown) {
if (e instanceof Prisma.PrismaClientInitializationError) {
// Database is not available at build time. Make sure we fall back to building these pages on demand
return {
paths: [],
fallback: "blocking",
};
} else {
throw e;
}
const isPrismaAvailable = await isPrismaAvailableCheck();
if (!isPrismaAvailable) {
// Database is not available at build time. Make sure we fall back to building these pages on demand
return {
paths: [],
fallback: "blocking",
};
}

return {
Expand Down
42 changes: 42 additions & 0 deletions packages/prisma/auto-migrations.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import dotEnv from "dotenv";
import { exec as execCb } from "node:child_process";
import { promisify } from "node:util";

import { isPrismaAvailableCheck } from "./is-prisma-available-check";

dotEnv.config({ path: "../../.env" });

const exec = promisify(execCb);

/**
* TODO: re-write this when Prisma.io gets a programmatic migration API
* Thanks to @olalonde for the idea.
* @see https://github.com/prisma/prisma/issues/4703#issuecomment-1447354363
*/
async function main(): Promise<void> {
if (!process.env.DATABASE_URL) {
console.info("No DATABASE_URL found, skipping migrations");
return;
}
if (!process.env.DATABASE_DIRECT_URL) {
console.info("No DATABASE_DIRECT_URL found, skipping migrations");
return;
}
if (!(await isPrismaAvailableCheck())) {
console.info("Prisma can't be initialized, skipping migrations");
return;
}
// throws an error if migration fails
const { stdout, stderr } = await exec("yarn prisma migrate deploy", {
env: {
...process.env,
},
});
console.log(stdout);
console.error(stderr);
}

main().catch((e) => {
console.error(e.stdout || e.stderr || e.message);
process.exit(1);
});
17 changes: 17 additions & 0 deletions packages/prisma/is-prisma-available-check.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Prisma } from "@prisma/client";

import prisma from ".";

export async function isPrismaAvailableCheck() {
try {
await prisma.$queryRaw`SELECT 1`;
return true;
} catch (e: unknown) {
if (e instanceof Prisma.PrismaClientInitializationError) {
// Database might not available at build time.
return false;
} else {
throw e;
}
}
}
2 changes: 1 addition & 1 deletion packages/prisma/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"private": true,
"scripts": {
"clean": "rm -rf .turbo && rm -rf node_modules",
"build": "yarn prisma migrate deploy || true",
"build": "ts-node --transpile-only ./auto-migrations.ts",
"db-deploy": "yarn prisma migrate deploy",
"db-migrate": "yarn prisma migrate dev",
"db-nuke": "docker compose down --volumes --remove-orphans || docker-compose down --volumes --remove-orphans",
Expand Down
2 changes: 2 additions & 0 deletions turbo.json
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,8 @@
"DAILY_API_KEY",
"DAILY_SCALE_PLAN",
"DAILY_WEBHOOK_SECRET",
"DATABASE_DIRECT_URL",
"DATABASE_URL",
"DEBUG",
"E2E_TEST_APPLE_CALENDAR_EMAIL",
"E2E_TEST_APPLE_CALENDAR_PASSWORD",
Expand Down

0 comments on commit 502a324

Please sign in to comment.