Files
speckle-server/packages/server/modules/shared/helpers/errorHelper.ts
T
Kristaps Fabians Geikins 820a1e2ebf feat(server): workspace roles taken into account in project queries (#4319)
* Workspace.projects fixed

* Query.project tested & fixed

* personalOnly flag added

* withProjectRoleOnly flag

* authorizeResolver implicit workspace roles

* minor cleanup

* reorg + support for throwing auth errors

* global error mapping

* undo special borkage

* CR fixes

* more CR fixes

* shared tests fix

* minor adjustment

* tests fix

* see if removing cached roles fixes it?

* more fixes

* clean up debugging garbage
2025-04-07 12:52:07 +03:00

57 lines
1.9 KiB
TypeScript

import { StreamNotFoundError } from '@/modules/core/errors/stream'
import { WorkspacesModuleDisabledError } from '@/modules/core/errors/workspaces'
import { BaseError, ForbiddenError } from '@/modules/shared/errors'
import { SsoSessionMissingOrExpiredError } from '@/modules/workspacesCore/errors'
import { Authz, ensureError, throwUncoveredError } from '@speckle/shared'
import { VError } from 'verror'
/**
* Resolve cause correctly depending on whether its a VError or basic Error
* object
*/
export function getCause(e: Error) {
if (e instanceof VError) {
return VError.cause(e)
} else {
const unknownCause = e.cause
return unknownCause ? ensureError(e.cause) : null
}
}
export { ensureError }
/**
* Global mapping for mapping any kind of auth error to a server thrown error
*/
export const mapAuthToServerError = (e: Authz.AllAuthErrors): BaseError => {
switch (e.code) {
case Authz.ProjectNotFoundError.code:
return new StreamNotFoundError(e.message)
case Authz.ProjectNoAccessError.code:
case Authz.WorkspaceNoAccessError.code:
case Authz.WorkspaceNotEnoughPermissionsError.code:
case Authz.WorkspaceReadOnlyError.code:
case Authz.WorkspaceLimitsReachedError.code:
case Authz.WorkspaceNoEditorSeatError.code:
return new ForbiddenError(e.message)
case Authz.WorkspaceSsoSessionNoAccessError.code:
throw new SsoSessionMissingOrExpiredError(e.message, {
info: {
workspaceSlug: e.payload.workspaceSlug
}
})
case Authz.ServerNoAccessError.code:
case Authz.ServerNoSessionError.code:
return new ForbiddenError(e.message)
case Authz.WorkspacesNotEnabledError.code:
return new WorkspacesModuleDisabledError()
default:
throwUncoveredError(e)
}
}
export const throwIfAuthNotOk = (result: Authz.AuthPolicyResult) => {
if (result.isOk) return
throw mapAuthToServerError(result.error)
}