diff --git a/apps/webapp/app/components/billing/OrgBanner.tsx b/apps/webapp/app/components/billing/OrgBanner.tsx index b413039390..df86f1471f 100644 --- a/apps/webapp/app/components/billing/OrgBanner.tsx +++ b/apps/webapp/app/components/billing/OrgBanner.tsx @@ -9,7 +9,7 @@ import { useOptionalOrganization, useOrganization, useBillingLimit, - useCanManageBilling, + useCanManageBillingLimits, } from "~/hooks/useOrganizations"; import { useOptionalProject, useProject } from "~/hooks/useProject"; import { useShowSelfServe } from "~/hooks/useShowSelfServe"; @@ -80,8 +80,8 @@ export function OrgBanner() { function LimitRejectedBanner() { const organization = useOrganization(); const showSelfServe = useShowSelfServe(); - const canManageBilling = useCanManageBilling(); - const canResolve = showSelfServe && canManageBilling; + const canManageBillingLimits = useCanManageBillingLimits(); + const canResolve = showSelfServe && canManageBillingLimits; return ( Configure billing limit ) : undefined } > - {canManageBilling + {canManageBillingLimits ? "Protect your organization from unexpected usage spikes." : "Billing limits are not configured for this organization. Contact an organization administrator to configure them."} diff --git a/apps/webapp/app/hooks/useOrganizations.ts b/apps/webapp/app/hooks/useOrganizations.ts index a546227582..ea40cf5e65 100644 --- a/apps/webapp/app/hooks/useOrganizations.ts +++ b/apps/webapp/app/hooks/useOrganizations.ts @@ -96,10 +96,10 @@ export function useBillingLimit(matches?: UIMatch[]) { return data?.billingLimit; } -export function useCanManageBilling(matches?: UIMatch[]) { +export function useCanManageBillingLimits(matches?: UIMatch[]) { const data = useTypedMatchesData({ id: "routes/_app.orgs.$organizationSlug", matches, }); - return data?.canManageBilling === true; + return data?.canManageBillingLimits === true; } diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings.billing-limits/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings.billing-limits/route.tsx index e5160765fe..4900e59b05 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings.billing-limits/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings.billing-limits/route.tsx @@ -77,7 +77,7 @@ import { const billingLimitsAuthorization = { action: "manage" as const, - resource: { type: "billing" as const }, + resource: { type: "billing-limits" as const }, }; export const meta: MetaFunction = () => { diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug/route.tsx index ebed894411..cfe74e9ccc 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug/route.tsx @@ -11,7 +11,7 @@ import { RegionsPresenter, type Region } from "~/presenters/v3/RegionsPresenter. import { getImpersonationId } from "~/services/impersonation.server"; import { getCachedUsage, getBillingLimit, getCurrentPlan } from "~/services/platform.v3.server"; import { rbac } from "~/services/rbac.server"; -import { canManageBilling } from "~/services/routeBuilders/permissions.server"; +import { canManageBillingLimits } from "~/services/routeBuilders/permissions.server"; import { requireUser } from "~/services/session.server"; import { telemetry } from "~/services/telemetry.server"; import { organizationPath } from "~/utils/pathBuilder"; @@ -124,7 +124,9 @@ export const loader = async ({ request, params }: LoaderFunctionArgs) => { .catch(() => [] as Region[]) : Promise.resolve([] as Region[]), ]); - const userCanManageBilling = sessionAuth.ok ? canManageBilling(sessionAuth.ability) : false; + const userCanManageBillingLimits = sessionAuth.ok + ? canManageBillingLimits(sessionAuth.ability) + : false; let hasExceededFreeTier = false; let usagePercentage = 0; @@ -181,7 +183,7 @@ export const loader = async ({ request, params }: LoaderFunctionArgs) => { limit: dashboardLimit, }, widgetLimitPerDashboard, - canManageBilling: userCanManageBilling, + canManageBillingLimits: userCanManageBillingLimits, }); }; diff --git a/apps/webapp/app/services/routeBuilders/permissions.server.ts b/apps/webapp/app/services/routeBuilders/permissions.server.ts index 7efdbc6de7..9dcfbc81d9 100644 --- a/apps/webapp/app/services/routeBuilders/permissions.server.ts +++ b/apps/webapp/app/services/routeBuilders/permissions.server.ts @@ -19,8 +19,8 @@ export type PermissionCheck = * returned booleans are display-only: the route builder's `authorization` * block is the real security boundary. */ -export function canManageBilling(ability: RbacAbility): boolean { - return ability.can("manage", { type: "billing" }); +export function canManageBillingLimits(ability: RbacAbility): boolean { + return ability.can("manage", { type: "billing-limits" }); } export function checkPermissions(