* chore: Stripe paid apps flow * chore: Subscription * chore: Webhooks * chore: Abstract functions * chore: Lockfile * chore: Webhook handler * chore: Use catch-all * chore: Webhook changes, etc * chore: Cleanup * chore: Use actual price id * chore: Updates * chore: Install normally until expiry date * Disable team install for paid apps and cal.ai\ * Fix the same at another place * Fix Typescript error * redactedCause doesnt have message has enumerable prop * Fix reinstallation of an already installed app * chore: Remove unused deps * chore: Ensure index * chore: Price in usd * chore: PR suggestion * Fix missing packages in yarn.lock --------- Co-authored-by: Hariom <hariombalhara@gmail.com> Co-authored-by: Peer Richelsen <peeroke@gmail.com>
66 lines
2.0 KiB
TypeScript
66 lines
2.0 KiB
TypeScript
import type { NextApiRequest, NextApiResponse } from "next";
|
|
|
|
import { defaultResponder } from "@calcom/lib/server";
|
|
import { createContext } from "@calcom/trpc/server/createContext";
|
|
import { apiKeysRouter } from "@calcom/trpc/server/routers/viewer/apiKeys/_router";
|
|
|
|
import checkSession from "../../_utils/auth";
|
|
import getInstalledAppPath from "../../_utils/getInstalledAppPath";
|
|
import { checkInstalled, createDefaultInstallation } from "../../_utils/installation";
|
|
import { withStripeCallback } from "../../_utils/paid-apps";
|
|
import appConfig from "../config.json";
|
|
|
|
export async function getHandler(req: NextApiRequest, res: NextApiResponse) {
|
|
const session = checkSession(req);
|
|
const slug = appConfig.slug;
|
|
const appType = appConfig.type;
|
|
|
|
const { checkoutId } = req.query as { checkoutId: string };
|
|
if (!checkoutId) {
|
|
return { url: `/apps/installed?error=${JSON.stringify({ message: "No Stripe Checkout Session ID" })}` };
|
|
}
|
|
|
|
const { url } = await withStripeCallback(checkoutId, slug, async ({ checkoutSession }) => {
|
|
const ctx = await createContext({ req, res });
|
|
const caller = apiKeysRouter.createCaller(ctx);
|
|
|
|
const apiKey = await caller.create({
|
|
note: "Cal.ai",
|
|
expiresAt: null,
|
|
appId: "cal-ai",
|
|
});
|
|
|
|
await checkInstalled(slug, session.user.id);
|
|
await createDefaultInstallation({
|
|
appType,
|
|
userId: session.user.id,
|
|
slug,
|
|
key: {
|
|
apiKey,
|
|
},
|
|
subscriptionId: checkoutSession.subscription?.toString(),
|
|
billingCycleStart: new Date().getDate(),
|
|
paymentStatus: "active",
|
|
});
|
|
|
|
await fetch(
|
|
`${process.env.NODE_ENV === "development" ? "http://localhost:3005" : "https://cal.ai"}/api/onboard`,
|
|
{
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
body: JSON.stringify({
|
|
userId: session.user.id,
|
|
}),
|
|
}
|
|
);
|
|
|
|
return { url: getInstalledAppPath({ variant: appConfig.variant, slug: "cal-ai" }) };
|
|
});
|
|
|
|
return res.redirect(url);
|
|
}
|
|
|
|
export default defaultResponder(getHandler);
|