Files
speckle-server/packages/server/modules/gatekeeper/services/featureAuthorization.ts
T
Kristaps Fabians Geikins a6287fc06d feat(fe2 & server): saved views foundation (list & view) + bits n bobs (#5163)
* init db migration

* WIP store view

* create service call

* WIP insertion

* insert sort of works

* moving code arounmd

* creation tests

* avoid duplicate entries

* fixes from main

* basic group retrieval works

* group filtering works

* WIP view listing

* filter by acl

* fixes + WIP single group retrieval

* wip pivot

* more pivot query fixes

* tests fixed after pivot

* views list tests

* fixing test command

* business plan only checks

* more tests for coverage

* .dts import fix

* cli fix

* anutha one

* auth policy tests for business plan access

* WIP saved views panel base

* BE listing adjustments

* WIP group rendering

* group render done

* WIP post create cache updates

* listing fine?

* my vs theirs

* auto open

* minor fixes

* click load omg

* nicely loading views

* type fix

* less spammy loading

* another type fix:

* more lint fix

* test fix

* codecov disable

* moar coverage

* fix sidebar flashin

* more test coverage

* more test cvoverage

* minor adfjustments

* adj

* saved view wipe fixes

* CSR viewer

* more improvements

* extra feature flag checks

* lint fix

* feature flags fix

* more test fixes
2025-08-05 11:52:50 +03:00

56 lines
1.9 KiB
TypeScript

import type { GetWorkspacePlan } from '@/modules/gatekeeper/domain/billing'
import type {
CanWorkspaceAccessFeature,
WorkspaceFeatureAccessFunction
} from '@/modules/gatekeeper/domain/operations'
import { getFeatureFlags } from '@/modules/shared/helpers/envHelper'
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,
featureFlags: getFeatureFlags()
})
}
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'
})