Files
speckle-server/packages/server/modules/gatekeeper/services/featureAuthorization.ts
T
2025-06-19 16:15:29 +02:00

54 lines
1.7 KiB
TypeScript

import { GetWorkspacePlan } from '@/modules/gatekeeper/domain/billing'
import {
CanWorkspaceAccessFeature,
WorkspaceFeatureAccessFunction
} from '@/modules/gatekeeper/domain/operations'
import { throwUncoveredError, workspacePlanHasAccessToFeature } from '@speckle/shared'
export const canWorkspaceAccessFeatureFactory =
({
getWorkspacePlan
}: {
getWorkspacePlan: GetWorkspacePlan
}): CanWorkspaceAccessFeature =>
async ({ workspaceId, workspaceFeature }) => {
const workspacePlan = await getWorkspacePlan({ workspaceId })
if (!workspacePlan) return false
switch (workspacePlan.status) {
case 'valid':
case 'paymentFailed':
case 'cancelationScheduled':
break
case 'canceled':
return false
default:
throwUncoveredError(workspacePlan)
}
return workspacePlanHasAccessToFeature({
plan: workspacePlan.name,
feature: workspaceFeature
})
}
export const canWorkspaceUseOidcSsoFactory =
(deps: { getWorkspacePlan: GetWorkspacePlan }): WorkspaceFeatureAccessFunction =>
async ({ workspaceId }) =>
canWorkspaceAccessFeatureFactory(deps)({ workspaceId, workspaceFeature: 'oidcSso' })
export const canWorkspaceUseRegionsFactory =
(deps: { getWorkspacePlan: GetWorkspacePlan }): WorkspaceFeatureAccessFunction =>
async ({ workspaceId }) =>
canWorkspaceAccessFeatureFactory(deps)({
workspaceId,
workspaceFeature: 'workspaceDataRegionSpecificity'
})
export const canWorkspaceUseDomainBasedSecurityPolicies =
(deps: { getWorkspacePlan: GetWorkspacePlan }): WorkspaceFeatureAccessFunction =>
async ({ workspaceId }) =>
canWorkspaceAccessFeatureFactory(deps)({
workspaceId,
workspaceFeature: 'domainBasedSecurityPolicies'
})