diff --git a/apps/web/pages/settings/organizations/[id]/about.tsx b/apps/web/pages/settings/organizations/[id]/about.tsx index 9fcd1041c4..f08e8bdb41 100644 --- a/apps/web/pages/settings/organizations/[id]/about.tsx +++ b/apps/web/pages/settings/organizations/[id]/about.tsx @@ -6,6 +6,8 @@ import { WizardLayout, Meta } from "@calcom/ui"; import PageWrapper from "@components/PageWrapper"; +export { getServerSideProps } from "@calcom/features/ee/organizations/pages/organization"; + const AboutOrganizationPage = () => { const { t } = useLocale(); const router = useRouter(); diff --git a/apps/web/pages/settings/organizations/[id]/add-teams.tsx b/apps/web/pages/settings/organizations/[id]/add-teams.tsx index ae670d2384..16728ba4d4 100644 --- a/apps/web/pages/settings/organizations/[id]/add-teams.tsx +++ b/apps/web/pages/settings/organizations/[id]/add-teams.tsx @@ -7,6 +7,8 @@ import { WizardLayout, Meta } from "@calcom/ui"; import PageWrapper from "@components/PageWrapper"; +export { getServerSideProps } from "@calcom/features/ee/organizations/pages/organization"; + const AddNewTeamsPage = () => { const { t } = useLocale(); const router = useRouter(); diff --git a/apps/web/pages/settings/organizations/[id]/onboard-admins.tsx b/apps/web/pages/settings/organizations/[id]/onboard-admins.tsx index 9fd7774017..5c2294e0b7 100644 --- a/apps/web/pages/settings/organizations/[id]/onboard-admins.tsx +++ b/apps/web/pages/settings/organizations/[id]/onboard-admins.tsx @@ -7,6 +7,8 @@ import { WizardLayout, Meta } from "@calcom/ui"; import PageWrapper from "@components/PageWrapper"; +export { getServerSideProps } from "@calcom/features/ee/organizations/pages/organization"; + const OnboardTeamMembersPage = () => { const { t } = useLocale(); const router = useRouter(); diff --git a/apps/web/pages/settings/organizations/[id]/set-password.tsx b/apps/web/pages/settings/organizations/[id]/set-password.tsx index 86b0bff1f0..9291aa9184 100644 --- a/apps/web/pages/settings/organizations/[id]/set-password.tsx +++ b/apps/web/pages/settings/organizations/[id]/set-password.tsx @@ -6,6 +6,8 @@ import { WizardLayout, Meta } from "@calcom/ui"; import PageWrapper from "@components/PageWrapper"; +export { getServerSideProps } from "@calcom/features/ee/organizations/pages/organization"; + const SetPasswordPage = () => { const { t } = useLocale(); const router = useRouter(); diff --git a/apps/web/pages/settings/organizations/new/index.tsx b/apps/web/pages/settings/organizations/new/index.tsx index f82c3b1dff..98d3c442f8 100644 --- a/apps/web/pages/settings/organizations/new/index.tsx +++ b/apps/web/pages/settings/organizations/new/index.tsx @@ -1,16 +1,21 @@ +import type { GetServerSidePropsContext } from "next"; + import LicenseRequired from "@calcom/features/ee/common/components/LicenseRequired"; import { CreateANewOrganizationForm } from "@calcom/features/ee/organizations/components"; +import { getFeatureFlagMap } from "@calcom/features/flags/server/utils"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { WizardLayout, Meta } from "@calcom/ui"; +import type { inferSSRProps } from "@lib/types/inferSSRProps"; + import PageWrapper from "@components/PageWrapper"; -const CreateNewOrganizationPage = () => { +const CreateNewOrganizationPage = ({ querySlug }: inferSSRProps) => { const { t } = useLocale(); return ( - + ); }; @@ -22,6 +27,25 @@ const LayoutWrapper = (page: React.ReactElement) => { ); }; +export const getServerSideProps = async (context: GetServerSidePropsContext) => { + const prisma = await import("@calcom/prisma").then((mod) => mod.default); + const flags = await getFeatureFlagMap(prisma); + // Check if organizations are enabled + if (flags["organizations"] !== true) { + return { + notFound: true, + }; + } + + const querySlug = context.query.slug as string; + + return { + props: { + querySlug: querySlug ?? null, + }, + }; +}; + CreateNewOrganizationPage.getLayout = LayoutWrapper; CreateNewOrganizationPage.PageWrapper = PageWrapper; diff --git a/apps/web/pages/team/[slug].tsx b/apps/web/pages/team/[slug].tsx index abc92bcad7..c16c343e44 100644 --- a/apps/web/pages/team/[slug].tsx +++ b/apps/web/pages/team/[slug].tsx @@ -7,6 +7,7 @@ import { useEffect } from "react"; import { sdkActionManager, useIsEmbed } from "@calcom/embed-core/embed-iframe"; import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains"; import EventTypeDescription from "@calcom/features/eventtypes/components/EventTypeDescription"; +import { getFeatureFlagMap } from "@calcom/features/flags/server/utils"; import { getPlaceholderAvatar } from "@calcom/lib/defaultAvatarImage"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import useTheme from "@calcom/lib/hooks/useTheme"; @@ -245,6 +246,7 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) => const ssr = await ssrInit(context); const slug = Array.isArray(context.query?.slug) ? context.query.slug.pop() : context.query.slug; const { isValidOrgDomain } = orgDomainConfig(context.req.headers.host ?? ""); + const flags = await getFeatureFlagMap(prisma); const team = await getTeamWithMembers(undefined, slug); const metadata = teamMetadataSchema.parse(team?.metadata ?? {}); @@ -253,7 +255,8 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) => if ( (isValidOrgDomain && team?.parent && !!metadata?.isOrganization) || (!isValidOrgDomain && team?.parent) || - (!isValidOrgDomain && !!metadata?.isOrganization) + (!isValidOrgDomain && !!metadata?.isOrganization) || + flags["organizations"] !== true ) { return { notFound: true } as const; } diff --git a/packages/features/ee/organizations/components/CreateANewOrganizationForm.tsx b/packages/features/ee/organizations/components/CreateANewOrganizationForm.tsx index caeb2a50d9..858645bfd1 100644 --- a/packages/features/ee/organizations/components/CreateANewOrganizationForm.tsx +++ b/packages/features/ee/organizations/components/CreateANewOrganizationForm.tsx @@ -135,13 +135,12 @@ export const VerifyCodeDialog = ({ ); }; -export const CreateANewOrganizationForm = () => { +export const CreateANewOrganizationForm = ({ slug }: { slug?: string }) => { const { t, i18n } = useLocale(); const router = useRouter(); const telemetry = useTelemetry(); const [serverErrorMessage, setServerErrorMessage] = useState(null); const [showVerifyCode, setShowVerifyCode] = useState(false); - const { slug } = router.query; const newOrganizationFormMethods = useForm<{ name: string; diff --git a/packages/features/ee/organizations/pages/organization.tsx b/packages/features/ee/organizations/pages/organization.tsx new file mode 100644 index 0000000000..6f93a2610d --- /dev/null +++ b/packages/features/ee/organizations/pages/organization.tsx @@ -0,0 +1,45 @@ +import type { GetServerSidePropsContext } from "next"; + +import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; +import { getFeatureFlagMap } from "@calcom/features/flags/server/utils"; +import { MembershipRole } from "@calcom/prisma/client"; + +export const getServerSideProps = async ({ req, res }: GetServerSidePropsContext) => { + const prisma = await import("@calcom/prisma").then((mod) => mod.default); + const flags = await getFeatureFlagMap(prisma); + // Check if organizations are enabled + if (flags["organizations"] !== true) { + return { + notFound: true, + }; + } + + // Check if logged in user has an organization assigned + const session = await getServerSession({ req, res }); + if (!session?.user.organizationId) { + return { + notFound: true, + }; + } + + // Check if logged in user has OWNER/ADMIN role in organization + const membership = await prisma.membership.findFirst({ + where: { + userId: session?.user.id, + teamId: session?.user.organizationId, + }, + select: { + role: true, + }, + }); + if (!membership?.role || membership?.role === MembershipRole.MEMBER) { + return { + notFound: true, + }; + } + + // Otherwise, all good + return { + props: {}, + }; +};