* refactor: allow non unique PlatformBilling customerId * feat: add PlatformBilling managed organizations fields * feat: ManagedOrganization table * refactor: bill overdue based on teamId * refactor: restructure organizations module * wip: organizations endpoints * Revert "wip: organizations endpoints" This reverts commit 0e9e66fc74f31da436f12930c1b6597c650ed621. * refactor: unique index for managed organizations * wip: organizations endpoints * wip: create managed organization * remove unecessary membership check because we have guard * feat: create managed org * feat: get managed org and orgs * feat: update and delete managed orgs * wip: api key logic * feat: allow variable api key length * feat: refresh managed org api key * feat: create managed org OAuth clients using api key * finish merge main * chore: bump platform libraries * tests: fix and add more tests to api-auth.strategy.e2e * refactor: dont request managed org slug and handle metadata as object * revert: billing service and repository update overdue based on sub and customer ids * refactor: v2 OAuth client permissions (#19501) * refactor: v2 permissions as string array * refactor: frontend work with permissions as string * tests: test '*' permissions * fix:managed org creator have profile & test can fetch oauth client * fix: tests * fix: OAuthClientCard on frontend * fix: tests
93 lines
3.5 KiB
TypeScript
93 lines
3.5 KiB
TypeScript
"use client";
|
|
|
|
import { useRouter } from "next/navigation";
|
|
|
|
import Shell from "@calcom/features/shell/Shell";
|
|
import { ErrorCode } from "@calcom/lib/errorCodes";
|
|
import { useCompatSearchParams } from "@calcom/lib/hooks/useCompatSearchParams";
|
|
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
|
import type { PERMISSION_MAP } from "@calcom/platform-constants";
|
|
import { PERMISSIONS_GROUPED_MAP } from "@calcom/platform-constants/permissions";
|
|
import { showToast } from "@calcom/ui";
|
|
|
|
import { useCreateOAuthClient } from "@lib/hooks/settings/platform/oauth-clients/usePersistOAuthClient";
|
|
|
|
import NoPlatformPlan from "@components/settings/platform/dashboard/NoPlatformPlan";
|
|
import { useGetUserAttributes } from "@components/settings/platform/hooks/useGetUserAttributes";
|
|
import type { FormValues } from "@components/settings/platform/oauth-clients/oauth-client-form";
|
|
import { OAuthClientForm } from "@components/settings/platform/oauth-clients/oauth-client-form";
|
|
|
|
export default function CreateOAuthClient() {
|
|
const searchParams = useCompatSearchParams();
|
|
const router = useRouter();
|
|
const { t } = useLocale();
|
|
const clientId = searchParams?.get("clientId") || "";
|
|
|
|
const { isUserLoading, isPlatformUser, isPaidUser } = useGetUserAttributes();
|
|
|
|
const { mutateAsync: save, isPending: isSaving } = useCreateOAuthClient({
|
|
onSuccess: () => {
|
|
showToast("OAuth client created successfully", "success");
|
|
router.push("/settings/platform/");
|
|
},
|
|
onError: () => {
|
|
showToast(ErrorCode.CreatingOauthClientError, "error");
|
|
},
|
|
});
|
|
|
|
const onSubmit = (data: FormValues) => {
|
|
const userPermissions: Array<keyof typeof PERMISSION_MAP> = [];
|
|
const userRedirectUris = data.redirectUris.map((uri) => uri.uri).filter((uri) => !!uri);
|
|
|
|
Object.keys(PERMISSIONS_GROUPED_MAP).forEach((key) => {
|
|
const entity = key as keyof typeof PERMISSIONS_GROUPED_MAP;
|
|
const entityKey = PERMISSIONS_GROUPED_MAP[entity].key;
|
|
|
|
if (data[`${entityKey}Read`]) userPermissions.push(`${entity}_READ`);
|
|
if (data[`${entityKey}Write`]) userPermissions.push(`${entity}_WRITE`);
|
|
});
|
|
|
|
save({
|
|
name: data.name,
|
|
permissions: userPermissions,
|
|
redirectUris: userRedirectUris,
|
|
bookingRedirectUri: data.bookingRedirectUri,
|
|
bookingCancelRedirectUri: data.bookingCancelRedirectUri,
|
|
bookingRescheduleRedirectUri: data.bookingRescheduleRedirectUri,
|
|
areEmailsEnabled: data.areEmailsEnabled,
|
|
});
|
|
};
|
|
|
|
if (isUserLoading) return <div className="m-5">Loading...</div>;
|
|
|
|
if (isPlatformUser && isPaidUser) {
|
|
return (
|
|
<div>
|
|
<Shell title={t("oAuth_client_creation_form")} isPlatformUser={true} withoutSeo={true}>
|
|
<div className="m-2 md:mx-5">
|
|
<div className="border-subtle mx-auto block justify-between rounded-t-lg border px-4 py-6 sm:flex sm:px-6">
|
|
<div className="flex w-full flex-col">
|
|
<h1 className="font-cal text-emphasis mb-1 text-xl font-semibold leading-5 tracking-wide">
|
|
{t("oAuth_client_creation_form")}
|
|
</h1>
|
|
<p className="text-default text-sm ltr:mr-4 rtl:ml-4">
|
|
{t("oAuth_client_creation_form_description")}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<OAuthClientForm isPending={isSaving} onSubmit={onSubmit} />
|
|
</div>
|
|
</Shell>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<div>
|
|
<Shell withoutSeo={true} isPlatformUser={true} withoutMain={false} SidebarContainer={<></>}>
|
|
<NoPlatformPlan />
|
|
</Shell>
|
|
</div>
|
|
);
|
|
}
|