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(