diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/attributes/[id]/edit/page.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/attributes/[id]/edit/page.tsx similarity index 100% rename from apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/attributes/[id]/edit/page.tsx rename to apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/attributes/[id]/edit/page.tsx diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/attributes/create/page.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/attributes/create/page.tsx similarity index 100% rename from apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/attributes/create/page.tsx rename to apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/attributes/create/page.tsx diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/attributes/page.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/attributes/page.tsx similarity index 100% rename from apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/attributes/page.tsx rename to apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/attributes/page.tsx diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/billing/page.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/billing/page.tsx new file mode 100644 index 0000000000..268371cb2d --- /dev/null +++ b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/billing/page.tsx @@ -0,0 +1,5 @@ +import BillingPage, { generateMetadata } from "../../../billing/page"; + +export { generateMetadata }; + +export default BillingPage; diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/delegation-credential/page.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/delegation-credential/page.tsx similarity index 100% rename from apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/delegation-credential/page.tsx rename to apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/delegation-credential/page.tsx diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/dsync/page.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/dsync/page.tsx similarity index 100% rename from apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/dsync/page.tsx rename to apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/dsync/page.tsx diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/layout.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/layout.tsx new file mode 100644 index 0000000000..3800799f09 --- /dev/null +++ b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/layout.tsx @@ -0,0 +1,20 @@ +import { cookies, headers } from "next/headers"; +import { redirect } from "next/navigation"; + +import { checkAdminOrOwner } from "@calcom/features/auth/lib/checkAdminOrOwner"; +import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; + +import { buildLegacyRequest } from "@lib/buildLegacyCtx"; + +const OrgAdminOnlyLayout = async ({ children }: { children: React.ReactNode }) => { + const session = await getServerSession({ req: buildLegacyRequest(await headers(), await cookies()) }); + const isOrgAdminOrOwner = checkAdminOrOwner(session?.user?.org?.role); + + if (!isOrgAdminOrOwner) { + return redirect("/settings/organizations/profile"); + } + + return children; +}; + +export default OrgAdminOnlyLayout; diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/privacy/page.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/privacy/page.tsx similarity index 100% rename from apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/privacy/page.tsx rename to apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/privacy/page.tsx diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/sso/page.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/sso/page.tsx similarity index 100% rename from apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/sso/page.tsx rename to apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/sso/page.tsx diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/billing/page.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/billing/page.tsx deleted file mode 100644 index 7993b194a4..0000000000 --- a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/billing/page.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import BillingPage, { generateMetadata } from "../../billing/page"; - -export { generateMetadata }; - -export default BillingPage; diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/layout.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/layout.tsx new file mode 100644 index 0000000000..fb858f6132 --- /dev/null +++ b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/layout.tsx @@ -0,0 +1,20 @@ +import { cookies, headers } from "next/headers"; +import { redirect } from "next/navigation"; + +import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; + +import { buildLegacyRequest } from "@lib/buildLegacyCtx"; + +const SettingsOrganizationsLayout = async ({ children }: { children: React.ReactNode }) => { + const session = await getServerSession({ req: buildLegacyRequest(await headers(), await cookies()) }); + + const orgExists = + session?.user?.org || session?.user?.profile?.organizationId || session?.user?.profile?.organization; + if (!orgExists) { + return redirect("/settings/my-account/profile"); + } + + return children; +}; + +export default SettingsOrganizationsLayout; diff --git a/apps/web/app/(use-page-wrapper)/settings/organizations/appearance/page.tsx b/apps/web/app/(use-page-wrapper)/settings/organizations/(org-admin-only)/appearance/page.tsx similarity index 100% rename from apps/web/app/(use-page-wrapper)/settings/organizations/appearance/page.tsx rename to apps/web/app/(use-page-wrapper)/settings/organizations/(org-admin-only)/appearance/page.tsx diff --git a/apps/web/app/(use-page-wrapper)/settings/organizations/(org-admin-only)/layout.tsx b/apps/web/app/(use-page-wrapper)/settings/organizations/(org-admin-only)/layout.tsx new file mode 100644 index 0000000000..3800799f09 --- /dev/null +++ b/apps/web/app/(use-page-wrapper)/settings/organizations/(org-admin-only)/layout.tsx @@ -0,0 +1,20 @@ +import { cookies, headers } from "next/headers"; +import { redirect } from "next/navigation"; + +import { checkAdminOrOwner } from "@calcom/features/auth/lib/checkAdminOrOwner"; +import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; + +import { buildLegacyRequest } from "@lib/buildLegacyCtx"; + +const OrgAdminOnlyLayout = async ({ children }: { children: React.ReactNode }) => { + const session = await getServerSession({ req: buildLegacyRequest(await headers(), await cookies()) }); + const isOrgAdminOrOwner = checkAdminOrOwner(session?.user?.org?.role); + + if (!isOrgAdminOrOwner) { + return redirect("/settings/organizations/profile"); + } + + return children; +}; + +export default OrgAdminOnlyLayout; diff --git a/apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/layout.tsx b/apps/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/[id]/members/layout.tsx similarity index 100% rename from apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/layout.tsx rename to apps/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/[id]/members/layout.tsx diff --git a/apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/loading.tsx b/apps/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/[id]/members/loading.tsx similarity index 100% rename from apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/loading.tsx rename to apps/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/[id]/members/loading.tsx diff --git a/apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/page.tsx b/apps/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/[id]/members/page.tsx similarity index 100% rename from apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/page.tsx rename to apps/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/[id]/members/page.tsx diff --git a/apps/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/layout.tsx b/apps/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/layout.tsx new file mode 100644 index 0000000000..04408c6f22 --- /dev/null +++ b/apps/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/layout.tsx @@ -0,0 +1,19 @@ +import { cookies, headers } from "next/headers"; +import { redirect } from "next/navigation"; + +import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; + +import { buildLegacyRequest } from "@lib/buildLegacyCtx"; + +const SettingsOrganizationsLayout = async ({ children }: { children: React.ReactNode }) => { + const session = await getServerSession({ req: buildLegacyRequest(await headers(), await cookies()) }); + const orgExists = + session?.user?.org || session?.user?.profile?.organizationId || session?.user?.profile?.organization; + if (!orgExists) { + return redirect("/settings/my-account/profile"); + } + + return children; +}; + +export default SettingsOrganizationsLayout; diff --git a/apps/web/app/(use-page-wrapper)/settings/organizations/members/actions.ts b/apps/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/members/actions.ts similarity index 100% rename from apps/web/app/(use-page-wrapper)/settings/organizations/members/actions.ts rename to apps/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/members/actions.ts diff --git a/apps/web/app/(use-page-wrapper)/settings/organizations/members/layout.tsx b/apps/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/members/layout.tsx similarity index 100% rename from apps/web/app/(use-page-wrapper)/settings/organizations/members/layout.tsx rename to apps/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/members/layout.tsx diff --git a/apps/web/app/(use-page-wrapper)/settings/organizations/members/loading.tsx b/apps/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/members/loading.tsx similarity index 100% rename from apps/web/app/(use-page-wrapper)/settings/organizations/members/loading.tsx rename to apps/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/members/loading.tsx diff --git a/apps/web/app/(use-page-wrapper)/settings/organizations/members/page.tsx b/apps/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/members/page.tsx similarity index 100% rename from apps/web/app/(use-page-wrapper)/settings/organizations/members/page.tsx rename to apps/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/members/page.tsx diff --git a/packages/features/ee/organizations/pages/settings/attributes/DeleteAttributeModal.tsx b/packages/features/ee/organizations/pages/settings/attributes/DeleteAttributeModal.tsx index 5dc4a80d43..53b9fac436 100644 --- a/packages/features/ee/organizations/pages/settings/attributes/DeleteAttributeModal.tsx +++ b/packages/features/ee/organizations/pages/settings/attributes/DeleteAttributeModal.tsx @@ -6,7 +6,7 @@ import type { RouterOutputs } from "@calcom/trpc/react"; import { trpc } from "@calcom/trpc/react"; import { ConfirmationDialogContent } from "@calcom/ui/components/dialog"; import { showToast } from "@calcom/ui/components/toast"; -import { revalidateAttributesList } from "@calcom/web/app/(use-page-wrapper)/settings/organizations/members/actions"; +import { revalidateAttributesList } from "@calcom/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/members/actions"; type AttributeItemProps = RouterOutputs["viewer"]["attributes"]["list"][number]; diff --git a/packages/features/ee/organizations/pages/settings/attributes/attributes-create-view.tsx b/packages/features/ee/organizations/pages/settings/attributes/attributes-create-view.tsx index f037611650..faaff41451 100644 --- a/packages/features/ee/organizations/pages/settings/attributes/attributes-create-view.tsx +++ b/packages/features/ee/organizations/pages/settings/attributes/attributes-create-view.tsx @@ -9,7 +9,7 @@ import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; import { Button } from "@calcom/ui/components/button"; import { showToast } from "@calcom/ui/components/toast"; -import { revalidateAttributesList } from "@calcom/web/app/(use-page-wrapper)/settings/organizations/members/actions"; +import { revalidateAttributesList } from "@calcom/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/members/actions"; import { AttributeForm } from "./AttributesForm"; diff --git a/packages/features/ee/organizations/pages/settings/attributes/attributes-edit-view.tsx b/packages/features/ee/organizations/pages/settings/attributes/attributes-edit-view.tsx index 52cce1dcc1..76f6a2d061 100644 --- a/packages/features/ee/organizations/pages/settings/attributes/attributes-edit-view.tsx +++ b/packages/features/ee/organizations/pages/settings/attributes/attributes-edit-view.tsx @@ -9,7 +9,7 @@ import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; import { Button } from "@calcom/ui/components/button"; import { showToast } from "@calcom/ui/components/toast"; -import { revalidateAttributesList } from "@calcom/web/app/(use-page-wrapper)/settings/organizations/members/actions"; +import { revalidateAttributesList } from "@calcom/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/members/actions"; import { AttributeForm } from "./AttributesForm"; diff --git a/packages/features/ee/organizations/pages/settings/attributes/attributes-list-view.tsx b/packages/features/ee/organizations/pages/settings/attributes/attributes-list-view.tsx index 0a0f4dae15..b7311efa16 100644 --- a/packages/features/ee/organizations/pages/settings/attributes/attributes-list-view.tsx +++ b/packages/features/ee/organizations/pages/settings/attributes/attributes-list-view.tsx @@ -19,7 +19,7 @@ import { import { Switch } from "@calcom/ui/components/form"; import { Icon } from "@calcom/ui/components/icon"; import { showToast } from "@calcom/ui/components/toast"; -import { revalidateAttributesList } from "@calcom/web/app/(use-page-wrapper)/settings/organizations/members/actions"; +import { revalidateAttributesList } from "@calcom/web/app/(use-page-wrapper)/settings/organizations/(org-user-only)/members/actions"; import { DeleteAttributeModal } from "./DeleteAttributeModal"; import { ListSkeleton } from "./ListSkeleton";