2
0

first commit

This commit is contained in:
2024-08-09 00:39:27 +02:00
commit 79688abe2e
5698 changed files with 497838 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
export enum AppOnboardingSteps {
ACCOUNTS_STEP = "accounts",
EVENT_TYPES_STEP = "event-types",
CONFIGURE_STEP = "configure",
}

View File

@@ -0,0 +1,8 @@
import { AppOnboardingSteps } from "@calcom/lib/apps/appOnboardingSteps";
import { getAppOnboardingUrl } from "./getAppOnboardingUrl";
export const getAppOnboardingRedirectUrl = (slug: string, teamId?: number) => {
const url = getAppOnboardingUrl({ slug, teamId, step: AppOnboardingSteps.EVENT_TYPES_STEP });
return encodeURIComponent(url);
};

View File

@@ -0,0 +1,21 @@
import { stringify } from "querystring";
import type { AppOnboardingSteps } from "@calcom/lib/apps/appOnboardingSteps";
export const getAppOnboardingUrl = ({
slug,
step,
teamId,
}: {
slug: string;
step: AppOnboardingSteps;
teamId?: number;
}) => {
const params: { [key: string]: string | number | number[] } = { slug };
if (!!teamId) {
params.teamId = teamId;
}
const query = stringify(params);
return `/apps/installation/${step}?${query}`;
};

View File

@@ -0,0 +1,67 @@
import type { Prisma } from "@prisma/client";
import type { CredentialDataWithTeamName } from "@calcom/app-store/utils";
import getApps from "@calcom/app-store/utils";
import { prisma } from "@calcom/prisma";
type EnabledApp = ReturnType<typeof getApps>[number] & { enabled: boolean };
/**
*
* @param credentials - Can be user or team credentials
* @param options
* @param options.where Aditional where conditions to filter out apps
* @param options.filterOnCredentials - Only include apps where credentials are present
* @returns A list of enabled app metadata & credentials tied to them
*/
const getEnabledAppsFromCredentials = async (
credentials: CredentialDataWithTeamName[],
options?: {
where?: Prisma.AppWhereInput;
filterOnCredentials?: boolean;
}
) => {
const { where: _where = {}, filterOnCredentials = false } = options || {};
const filterOnIds = {
credentials: {
some: {
OR: [] as Prisma.CredentialWhereInput[],
},
},
} satisfies Prisma.AppWhereInput;
if (filterOnCredentials) {
const userIds: number[] = [],
teamIds: number[] = [];
for (const credential of credentials) {
if (credential.userId) userIds.push(credential.userId);
if (credential.teamId) teamIds.push(credential.teamId);
}
if (userIds.length) filterOnIds.credentials.some.OR.push({ userId: { in: userIds } });
if (teamIds.length) filterOnIds.credentials.some.OR.push({ teamId: { in: teamIds } });
}
const where: Prisma.AppWhereInput = {
enabled: true,
..._where,
...(filterOnIds.credentials.some.OR.length && filterOnIds),
};
const enabledApps = await prisma.app.findMany({
where,
select: { slug: true, enabled: true },
});
const apps = getApps(credentials, filterOnCredentials);
const filteredApps = apps.reduce((reducedArray, app) => {
const appDbQuery = enabledApps.find((metadata) => metadata.slug === app.slug);
if (appDbQuery?.enabled || app.isGlobal) {
reducedArray.push({ ...app, enabled: true });
}
return reducedArray;
}, [] as EnabledApp[]);
return filteredApps;
};
export default getEnabledAppsFromCredentials;

View File

@@ -0,0 +1,27 @@
import { z } from "zod";
import prisma from "@calcom/prisma";
const getInstallCountPerApp = async () => {
const mostPopularApps = z.array(z.object({ appId: z.string(), installCount: z.number() })).parse(
await prisma.$queryRaw`
SELECT
c."appId",
COUNT(*)::integer AS "installCount"
FROM
"Credential" c
WHERE
c."appId" IS NOT NULL
GROUP BY
c."appId"
ORDER BY
"installCount" DESC
`
);
return mostPopularApps.reduce((acc, { appId, installCount }) => {
acc[appId] = installCount;
return acc;
}, {} as Record<string, number>);
};
export default getInstallCountPerApp;

View File

@@ -0,0 +1,6 @@
import type { AppMeta } from "@calcom/types/App";
export const shouldRedirectToAppOnboarding = (appMetadata: AppMeta) => {
const hasEventTypes = appMetadata?.extendsFeature == "EventType";
return hasEventTypes;
};