Files
speckle-server/packages/frontend-2/middleware/requireValidProject.ts
T
Kristaps Fabians Geikins c54d15fd93 feat: authz frontend foundation + reworked errors (#4275)
* feat: authz frontend foundation + reworked errors

* lint fixes

* test fix

* fixed noCache() util
2025-03-27 16:13:35 +02:00

54 lines
1.7 KiB
TypeScript

import { throwUncoveredError } from '@speckle/shared'
import {
ProjectNoAccessError,
ProjectNotFoundError,
ServerNoAccessError,
ServerNoSessionError,
WorkspaceNoAccessError,
WorkspaceSsoSessionNoAccessError
} from '@speckle/shared/authz'
import { useAuthPolicies } from '~/lib/auth/composables/authPolicies'
import { ActiveUserId } from '~/lib/auth/helpers/authPolicies'
import { loginRoute } from '~/lib/common/helpers/route'
/**
* Used in project page to validate that project ID refers to a valid project and redirects to 404 if not
*/
export default defineNuxtRouteMiddleware(async (to) => {
const projectId = to.params.id as string
const authPolicies = useAuthPolicies()
const canAccess = await authPolicies.noCache().project.canQuery({
projectId,
userId: ActiveUserId
})
if (canAccess.isErr) {
switch (canAccess.error.code) {
case WorkspaceSsoSessionNoAccessError.code: {
// Redirect to the SSO error page
const workspaceSlug = canAccess.error.payload.workspaceSlug
return navigateTo(`/workspaces/${workspaceSlug}/sso/session-error`)
}
case ProjectNotFoundError.code: {
return abortNavigation(
createError({ statusCode: 404, message: 'Project not found' })
)
}
case WorkspaceNoAccessError.code:
case ProjectNoAccessError.code: {
return abortNavigation(
createError({
statusCode: 403,
message: 'You do not have access to this project'
})
)
}
case ServerNoAccessError.code:
case ServerNoSessionError.code:
return navigateTo(loginRoute)
default: {
throwUncoveredError(canAccess.error)
}
}
}
})