Files
speckle-server/packages/server/modules/shared/helpers/errorHelper.ts
T
Gergő Jedlicska 84ed580ea4 feat(dashboards): create new dashboard share api (#5468)
* feat(dashboards): create new dashboard share api

* feat(dashboards): add enable / disable dashboard share flows

* test(dashboards): add more unittests to dashboard sharing

* Add sharing modal

* Update sidebar

* Update share token mutation

* feat(dashboards): share check for projects, tokens return modified
objects

* Updated tokens

* Fix

* Middleware

* Add default case

* fix(tokens): respect the tokens.revoked parameter

* fix(shared): can read dashboard now requires an active server session

* fix(server): handle dashboard no projects error in server

---------

Co-authored-by: Mike Tasset <mike.tasset@gmail.com>
2025-09-18 16:01:07 +02:00

93 lines
3.7 KiB
TypeScript

import { AccModuleDisabledError } from '@/modules/acc/errors/acc'
import { AutomateModuleDisabledError } from '@/modules/core/errors/automate'
import { StreamNotFoundError } from '@/modules/core/errors/stream'
import { WorkspacesModuleDisabledError } from '@/modules/core/errors/workspaces'
import { DashboardsModuleDisabledError } from '@/modules/dashboards/errors/dashboards'
import type { BaseError } from '@/modules/shared/errors'
import { BadRequestError, ForbiddenError, NotFoundError } 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:
case Authz.WorkspaceProjectMoveInvalidError.code:
case Authz.CommentNoAccessError.code:
case Authz.ProjectNotEnoughPermissionsError.code:
case Authz.WorkspacePlanNoFeatureAccessError.code:
case Authz.EligibleForExclusiveWorkspaceError.code:
case Authz.AutomateFunctionNotCreatorError.code:
case Authz.SavedViewNoAccessError.code:
case Authz.DashboardNotOwnerError.code:
case Authz.DashboardProjectsNotEnoughPermissionsError.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:
case Authz.ServerNotEnoughPermissionsError.code:
return new ForbiddenError(e.message)
case Authz.WorkspacesNotEnabledError.code:
return new WorkspacesModuleDisabledError()
case Authz.AutomateNotEnabledError.code:
return new AutomateModuleDisabledError()
case Authz.AccIntegrationNotEnabledError.code:
return new AccModuleDisabledError()
case Authz.DashboardsNotEnabledError.code:
return new DashboardsModuleDisabledError()
case Authz.ProjectLastOwnerError.code:
case Authz.ReservedModelNotDeletableError.code:
return new BadRequestError(e.message)
case Authz.CommentNotFoundError.code:
case Authz.ModelNotFoundError.code:
case Authz.VersionNotFoundError.code:
case Authz.AutomateFunctionNotFoundError.code:
case Authz.SavedViewNotFoundError.code:
case Authz.SavedViewGroupNotFoundError.code:
case Authz.DashboardNotFoundError.code:
return new NotFoundError(e.message)
case Authz.PersonalProjectsLimitedError.code:
case Authz.UngroupedSavedViewGroupLockError.code:
return new BadRequestError(e.message)
case Authz.DashboardNoProjectsError.code:
return new BadRequestError(e.message)
default:
throwUncoveredError(e)
}
}
export const throwIfAuthNotOk = (result: Authz.AuthPolicyResult) => {
if (result.isOk) return
throw mapAuthToServerError(result.error)
}