chore(server): run TS files directly (no compilation) (#5134)

* sort of works

* type fixes

* added option to run old way too
This commit is contained in:
Kristaps Fabians Geikins
2025-07-23 12:20:40 +03:00
committed by GitHub
parent e34a44bf66
commit 4b06f42db7
734 changed files with 2713 additions and 2644 deletions
@@ -1,6 +1,6 @@
/* eslint-disable camelcase */
import { BaseError } from '@/modules/shared/errors'
import {
import type {
OidcProvider,
OidcProviderAttributes
} from '@/modules/workspaces/domain/sso/types'
@@ -1,11 +1,12 @@
import { UserEmail } from '@/modules/core/domain/userEmails/types'
import type { UserEmail } from '@/modules/core/domain/userEmails/types'
import { WorkspaceDomainsInvalidState } from '@/modules/workspaces/errors/workspace'
import {
import type {
LimitedWorkspace,
Workspace,
WorkspaceDomain
} from '@/modules/workspacesCore/domain/types'
import { Roles, WorkspaceRoles } from '@speckle/shared'
import type { WorkspaceRoles } from '@speckle/shared'
import { Roles } from '@speckle/shared'
export const userEmailsCompliantWithWorkspaceDomains = ({
userEmails,
@@ -1,5 +1,5 @@
import { WorkspaceEvents } from '@/modules/workspacesCore/domain/events'
import {
import type { WorkspaceEvents } from '@/modules/workspacesCore/domain/events'
import type {
LimitedWorkspace,
Workspace,
WorkspaceAcl,
@@ -10,8 +10,8 @@ import {
WorkspaceWithDomains,
WorkspaceWithOptionalRole
} from '@/modules/workspacesCore/domain/types'
import { EventBusPayloads } from '@/modules/shared/services/eventBus'
import {
import type { EventBusPayloads } from '@/modules/shared/services/eventBus'
import type {
MaybeNullOrUndefined,
Nullable,
NullableKeysToOptional,
@@ -20,14 +20,17 @@ import {
StreamRoles,
WorkspaceRoles
} from '@speckle/shared'
import { WorkspaceCreationState } from '@/modules/workspaces/domain/types'
import { WorkspaceTeam } from '@/modules/workspaces/domain/types'
import { Stream } from '@/modules/core/domain/streams/types'
import { TokenResourceIdentifier } from '@/modules/core/domain/tokens/types'
import { ServerRegion } from '@/modules/multiregion/domain/types'
import { SetOptional } from 'type-fest'
import { WorkspaceSeat, WorkspaceSeatType } from '@/modules/gatekeeper/domain/billing'
import { UserRecord } from '@/modules/core/helpers/userHelper'
import type { WorkspaceCreationState } from '@/modules/workspaces/domain/types'
import type { WorkspaceTeam } from '@/modules/workspaces/domain/types'
import type { Stream } from '@/modules/core/domain/streams/types'
import type { TokenResourceIdentifier } from '@/modules/core/domain/tokens/types'
import type { ServerRegion } from '@/modules/multiregion/domain/types'
import type { SetOptional } from 'type-fest'
import type {
WorkspaceSeat,
WorkspaceSeatType
} from '@/modules/gatekeeper/domain/billing'
import type { UserRecord } from '@/modules/core/helpers/userHelper'
/** Workspace */
@@ -1,9 +1,9 @@
import {
import type {
OidcProfile,
SpeckleOidcProfile,
UserSsoSessionRecord
} from '@/modules/workspaces/domain/sso/types'
import { UnknownObject, UserinfoResponse } from 'openid-client'
import type { UnknownObject, UserinfoResponse } from 'openid-client'
/**
* Get the default expiration time for an SSO session based on the current time.
@@ -7,7 +7,7 @@ import type {
OidcProviderValidationRequest,
WorkspaceSsoProviderRecord
} from '@/modules/workspaces/domain/sso/types'
import { Workspace } from '@/modules/workspacesCore/domain/types'
import type { Workspace } from '@/modules/workspacesCore/domain/types'
// Workspace SSO provider management
@@ -1,4 +1,4 @@
import { oidcProvider } from '@/modules/workspaces/domain/sso/models'
import type { oidcProvider } from '@/modules/workspaces/domain/sso/models'
import type { infer as Infer } from 'zod'
type ProviderBaseRecord = {
@@ -1,6 +1,6 @@
export { WorkspaceInviteResourceTarget } from '@/modules/workspacesCore/domain/types'
import { LimitedUserRecord, UserWithRole } from '@/modules/core/helpers/types'
import { WorkspaceRoles } from '@speckle/shared'
import type { LimitedUserRecord, UserWithRole } from '@/modules/core/helpers/types'
import type { WorkspaceRoles } from '@speckle/shared'
export type WorkspaceTeamMember = UserWithRole<LimitedUserRecord> & {
email: string | null
@@ -1,5 +1,5 @@
import { UserEmail } from '@/modules/core/domain/userEmails/types'
import { User } from '@/modules/core/domain/users/types'
import type { UserEmail } from '@/modules/core/domain/userEmails/types'
import type { User } from '@/modules/core/domain/users/types'
import { BaseError } from '@/modules/shared/errors/base'
export { SsoSessionMissingOrExpiredError } from '@/modules/workspacesCore/errors'
@@ -7,7 +7,7 @@ import {
revokeStreamPermissionsFactory,
upsertProjectRoleFactory
} from '@/modules/core/repositories/streams'
import {
import type {
CountWorkspaceRoleWithOptionalProjectRole,
GetDefaultRegion,
GetProjectWorkspace,
@@ -20,36 +20,26 @@ import {
GetWorkspacesProjectsCounts,
ValidateWorkspaceMemberProjectRole
} from '@/modules/workspaces/domain/operations'
import {
ServerInvitesEvents,
ServerInvitesEventsPayloads
} from '@/modules/serverinvites/domain/events'
import type { ServerInvitesEventsPayloads } from '@/modules/serverinvites/domain/events'
import { ServerInvitesEvents } from '@/modules/serverinvites/domain/events'
import {
isProjectResourceTarget,
resolveTarget
} from '@/modules/serverinvites/helpers/core'
import { logger, moduleLogger } from '@/observability/logging'
import type { logger } from '@/observability/logging'
import { moduleLogger } from '@/observability/logging'
import { addOrUpdateWorkspaceRoleFactory } from '@/modules/workspaces/services/management'
import {
EventBusEmit,
EventPayload,
getEventBus
} from '@/modules/shared/services/eventBus'
import type { EventBusEmit, EventPayload } from '@/modules/shared/services/eventBus'
import { getEventBus } from '@/modules/shared/services/eventBus'
import { WorkspaceInviteResourceType } from '@/modules/workspacesCore/domain/constants'
import {
isPaidPlan,
MaybeNullOrUndefined,
Roles,
StreamRoles,
throwUncoveredError,
WorkspaceRoles
} from '@speckle/shared'
import {
import type { MaybeNullOrUndefined, StreamRoles, WorkspaceRoles } from '@speckle/shared'
import { isPaidPlan, Roles, throwUncoveredError } from '@speckle/shared'
import type {
QueryAllProjects,
UpsertProjectRole
} from '@/modules/core/domain/projects/operations'
import { WorkspaceEvents } from '@/modules/workspacesCore/domain/events'
import { Knex } from 'knex'
import type { Knex } from 'knex'
import {
countWorkspaceRoleWithOptionalProjectRoleFactory,
getWorkspaceCollaboratorsFactory,
@@ -71,12 +61,12 @@ import {
findEmailsByUserIdFactory,
findVerifiedEmailsByUserIdFactory
} from '@/modules/core/repositories/userEmails'
import {
import type {
GetStream,
GetStreamsCollaboratorCounts,
SetStreamCollaborator
} from '@/modules/core/domain/streams/operations'
import {
import type {
GetUserSsoSession,
GetWorkspaceSsoProviderRecord
} from '@/modules/workspaces/domain/sso/operations'
@@ -90,21 +80,22 @@ import { WorkspacesNotAuthorizedError } from '@/modules/workspaces/errors/worksp
import { publish, WorkspaceSubscriptions } from '@/modules/shared/utils/subscriptions'
import { isWorkspaceResourceTarget } from '@/modules/workspaces/services/invites'
import { ProjectEvents } from '@/modules/core/domain/projects/events'
import type { MixpanelClient } from '@/modules/shared/utils/mixpanel'
import {
getBaseTrackingProperties,
getClient,
mapPlanStatusToMixpanelEvent as mapNonValidPlanStatusToMixpanelEventName,
MixpanelClient,
MixpanelEvents,
WORKSPACE_TRACKING_ID_KEY
} from '@/modules/shared/utils/mixpanel'
import {
import type {
GetWorkspacePlan,
GetWorkspaceSubscription,
GetWorkspaceWithPlan
} from '@/modules/gatekeeper/domain/billing'
import { Workspace, WorkspaceSeatType } from '@/modules/workspacesCore/domain/types'
import { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import type { Workspace } from '@/modules/workspacesCore/domain/types'
import { WorkspaceSeatType } from '@/modules/workspacesCore/domain/types'
import type { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import { getDefaultRegionFactory } from '@/modules/workspaces/repositories/regions'
import {
getWorkspacePlanFactory,
@@ -123,7 +114,7 @@ import {
getWorkspaceRoleAndSeatFactory,
getWorkspaceUserSeatFactory
} from '@/modules/gatekeeper/repositories/workspaceSeat'
import {
import type {
DeleteWorkspaceSeat,
GetWorkspaceUserSeat
} from '@/modules/gatekeeper/domain/operations'
@@ -142,7 +133,7 @@ import { buildWorkspaceTrackingPropertiesFactory } from '@/modules/workspaces/se
import { assign } from 'lodash-es'
import { WorkspacePlanStatuses } from '@/modules/core/graph/generated/graphql'
import { GatekeeperEvents } from '@/modules/gatekeeperCore/domain/events'
import { GetUser } from '@/modules/core/domain/users/operations'
import type { GetUser } from '@/modules/core/domain/users/operations'
import { WorkspacePlans } from '@/modules/core/graph/generated/graphql'
import { queryAllProjectsFactory } from '@/modules/core/services/projects'
@@ -6,7 +6,7 @@ import {
getWorkspacesProjectsCountsFactory,
getWorkspacesRolesForUsersFactory
} from '@/modules/workspaces/repositories/workspaces'
import {
import type {
WorkspaceAcl,
WorkspaceDomain,
WorkspaceWithOptionalRole
@@ -1,4 +1,4 @@
import { GraphqlDirectiveBuilder } from '@/modules/core/graph/helpers/directiveHelper'
import type { GraphqlDirectiveBuilder } from '@/modules/core/graph/helpers/directiveHelper'
import { authorizeResolver } from '@/modules/shared'
import { ForbiddenError } from '@/modules/shared/errors'
import { mapGqlWorkspaceRoleToMainRole } from '@/modules/workspaces/helpers/roles'
@@ -1,5 +1,6 @@
/* eslint-disable @typescript-eslint/no-unsafe-return */
import { listMock, SpeckleModuleMocksConfig } from '@/modules/shared/helpers/mocks'
import type { SpeckleModuleMocksConfig } from '@/modules/shared/helpers/mocks'
import { listMock } from '@/modules/shared/helpers/mocks'
import { getFeatureFlags } from '@/modules/shared/helpers/envHelper'
import { faker } from '@faker-js/faker'
import { Roles } from '@speckle/shared'
@@ -1,4 +1,4 @@
import { Resolvers } from '@/modules/core/graph/generated/graphql'
import type { Resolvers } from '@/modules/core/graph/generated/graphql'
import { Authz, WorkspacePlanFeatures } from '@speckle/shared'
export default {
@@ -1,9 +1,9 @@
import { db } from '@/db/knex'
import { StreamNotFoundError } from '@/modules/core/errors/stream'
import { Resolvers } from '@/modules/core/graph/generated/graphql'
import type { Resolvers } from '@/modules/core/graph/generated/graphql'
import { getFeatureFlags } from '@/modules/shared/helpers/envHelper'
import { getPaginatedItemsFactory } from '@/modules/shared/services/paginatedItems'
import { WorkspaceTeamMember } from '@/modules/workspaces/domain/types'
import type { WorkspaceTeamMember } from '@/modules/workspaces/domain/types'
import { WorkspaceNotFoundError } from '@/modules/workspaces/errors/workspace'
import { intersectProjectCollaboratorsAndWorkspaceCollaboratorsFactory } from '@/modules/workspaces/repositories/projects'
import {
@@ -1,5 +1,5 @@
import { db } from '@/db/knex'
import { Resolvers } from '@/modules/core/graph/generated/graphql'
import type { Resolvers } from '@/modules/core/graph/generated/graphql'
import { getWorkspacePlanFactory } from '@/modules/gatekeeper/repositories/billing'
import { canWorkspaceUseRegionsFactory } from '@/modules/gatekeeper/services/featureAuthorization'
import { getDb } from '@/modules/multiregion/utils/dbSelector'
@@ -1,5 +1,5 @@
import { db } from '@/db/knex'
import { Resolvers } from '@/modules/core/graph/generated/graphql'
import type { Resolvers } from '@/modules/core/graph/generated/graphql'
import { getServerInfoFactory } from '@/modules/core/repositories/server'
import {
findEmailsByUserIdFactory,
@@ -16,7 +16,7 @@ import { commandFactory } from '@/modules/shared/command'
import { getFeatureFlags } from '@/modules/shared/helpers/envHelper'
import { getEventBus } from '@/modules/shared/services/eventBus'
import { getPaginatedItemsFactory } from '@/modules/shared/services/paginatedItems'
import {
import type {
ApproveWorkspaceJoinRequest,
DenyWorkspaceJoinRequest
} from '@/modules/workspaces/domain/operations'
@@ -47,8 +47,8 @@ import {
ensureValidWorkspaceRoleSeatFactory,
getWorkspaceDefaultSeatTypeFactory
} from '@/modules/workspaces/services/workspaceSeat'
import { WorkspaceJoinRequestStatus } from '@/modules/workspacesCore/domain/types'
import { WorkspaceJoinRequestGraphQLReturn } from '@/modules/workspacesCore/helpers/graphTypes'
import type { WorkspaceJoinRequestStatus } from '@/modules/workspacesCore/domain/types'
import type { WorkspaceJoinRequestGraphQLReturn } from '@/modules/workspacesCore/helpers/graphTypes'
import { withOperationLogging } from '@/observability/domain/businessLogging'
const eventBus = getEventBus()
@@ -1,8 +1,6 @@
import { db } from '@/db/knex'
import {
Resolvers,
TokenResourceIdentifierType
} from '@/modules/core/graph/generated/graphql'
import type { Resolvers } from '@/modules/core/graph/generated/graphql'
import { TokenResourceIdentifierType } from '@/modules/core/graph/generated/graphql'
import { removePrivateFields } from '@/modules/core/helpers/userHelper'
import {
updateProjectFactory,
@@ -113,11 +111,11 @@ import {
getDiscoverableWorkspacesForUserFactory,
getWorkspacesForUserFactory
} from '@/modules/workspaces/services/retrieval'
import type { WorkspaceRoles } from '@speckle/shared'
import {
Roles,
WorkspacePlanFeatures,
WorkspacePlans,
WorkspaceRoles,
removeNullOrUndefinedKeys,
throwUncoveredError
} from '@speckle/shared'
@@ -181,7 +179,7 @@ import {
getWorkspaceWithPlanFactory,
upsertWorkspacePlanFactory
} from '@/modules/gatekeeper/repositories/billing'
import { Knex } from 'knex'
import type { Knex } from 'knex'
import { getPaginatedItemsFactory } from '@/modules/shared/services/paginatedItems'
import { BadRequestError, UnauthorizedError } from '@/modules/shared/errors'
import {
@@ -1,5 +1,6 @@
import { Roles, WorkspaceRoles } from '@speckle/shared'
import { WorkspaceAcl } from '@/modules/workspacesCore/domain/types'
import type { WorkspaceRoles } from '@speckle/shared'
import { Roles } from '@speckle/shared'
import type { WorkspaceAcl } from '@/modules/workspacesCore/domain/types'
import { WorkspaceRole } from '@/modules/core/graph/generated/graphql'
export const isUserLastWorkspaceAdmin = (
@@ -2,14 +2,14 @@ import { getEncryptionKeyPair } from '@/modules/automate/services/encryption'
import { base64Decode } from '@/modules/shared/helpers/cryptoHelper'
import { getFrontendOrigin, getServerOrigin } from '@/modules/shared/helpers/envHelper'
import { buildDecryptor, buildEncryptor } from '@/modules/shared/utils/libsodium'
import { SsoSessionState } from '@/modules/workspaces/domain/sso/types'
import type { SsoSessionState } from '@/modules/workspaces/domain/sso/types'
import {
OidcStateInvalidError,
OidcStateMissingError,
SsoVerificationCodeMissingError
} from '@/modules/workspaces/errors/sso'
import { OidcProvider } from '@/modules/workspaces/domain/sso/types'
import { Request } from 'express'
import type { OidcProvider } from '@/modules/workspaces/domain/sso/types'
import type { Request } from 'express'
import { omit } from 'lodash-es'
declare module 'express-session' {
+3 -3
View File
@@ -1,9 +1,9 @@
import cron from 'node-cron'
import type cron from 'node-cron'
import { moduleLogger } from '@/observability/logging'
import { getFeatureFlags } from '@/modules/shared/helpers/envHelper'
import { registerOrUpdateScopeFactory } from '@/modules/shared/repositories/scopes'
import db from '@/db/knex'
import { Optional, SpeckleModule } from '@/modules/shared/helpers/typeHelper'
import type { Optional, SpeckleModule } from '@/modules/shared/helpers/typeHelper'
import { workspaceRoles } from '@/modules/workspaces/roles'
import { workspaceScopes } from '@/modules/workspaces/scopes'
import { registerOrUpdateRole } from '@/modules/shared/repositories/roles'
@@ -11,7 +11,7 @@ import { initializeEventListenersFactory } from '@/modules/workspaces/events/eve
import { validateModuleLicense } from '@/modules/gatekeeper/services/validateLicense'
import { getSsoRouter } from '@/modules/workspaces/rest/sso'
import { InvalidLicenseError } from '@/modules/gatekeeper/errors/license'
import { ScheduleExecution } from '@/modules/core/domain/scheduledTasks/operations'
import type { ScheduleExecution } from '@/modules/core/domain/scheduledTasks/operations'
import { scheduleExecutionFactory } from '@/modules/core/services/taskScheduler'
import {
acquireTaskLockFactory,
@@ -20,10 +20,10 @@ import {
Streams,
StreamsMeta
} from '@/modules/core/dbSchema'
import { Branch } from '@/modules/core/domain/branches/types'
import { Commit } from '@/modules/core/domain/commits/types'
import { Stream } from '@/modules/core/domain/streams/types'
import {
import type { Branch } from '@/modules/core/domain/branches/types'
import type { Commit } from '@/modules/core/domain/commits/types'
import type { Stream } from '@/modules/core/domain/streams/types'
import type {
BranchCommitRecord,
ObjectRecord,
CommitRecord,
@@ -32,7 +32,7 @@ import {
StreamRecord
} from '@/modules/core/helpers/types'
import { executeBatchedSelect } from '@/modules/shared/helpers/dbHelper'
import {
import type {
CopyProjectAutomations,
CopyProjectBlobs,
CopyProjectComments,
@@ -50,11 +50,11 @@ import {
CountProjectWebhooks
} from '@/modules/workspaces/domain/operations'
import { WorkspaceNotFoundError } from '@/modules/workspaces/errors/workspace'
import { Knex } from 'knex'
import { Workspace } from '@/modules/workspacesCore/domain/types'
import type { Knex } from 'knex'
import type { Workspace } from '@/modules/workspacesCore/domain/types'
import { Workspaces } from '@/modules/workspacesCore/helpers/db'
import { ObjectPreview } from '@/modules/previews/domain/types'
import {
import type { ObjectPreview } from '@/modules/previews/domain/types'
import type {
AutomationFunctionRunRecord,
AutomationRecord,
AutomationRevisionFunctionRecord,
@@ -64,17 +64,17 @@ import {
AutomationTokenRecord,
AutomationTriggerDefinitionRecord
} from '@/modules/automate/helpers/types'
import {
import type {
CommentLinkRecord,
CommentRecord,
CommentViewRecord
} from '@/modules/comments/helpers/types'
import { Webhook, WebhookEvent } from '@/modules/webhooks/domain/types'
import { ObjectStorage } from '@/modules/blobstorage/clients/objectStorage'
import type { Webhook, WebhookEvent } from '@/modules/webhooks/domain/types'
import type { ObjectStorage } from '@/modules/blobstorage/clients/objectStorage'
import { BlobStorage } from '@/modules/blobstorage/repositories'
import { BlobStorageItem } from '@/modules/blobstorage/domain/types'
import type { BlobStorageItem } from '@/modules/blobstorage/domain/types'
import { GetObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3'
import { FileUploadRecord } from '@/modules/fileuploads/helpers/types'
import type { FileUploadRecord } from '@/modules/fileuploads/helpers/types'
import { getObjectKey } from '@/modules/blobstorage/helpers/blobs'
const tables = {
@@ -1,13 +1,13 @@
import { StreamAcl, Streams, Users } from '@/modules/core/dbSchema'
import { StreamAclRecord, StreamRecord } from '@/modules/core/helpers/types'
import { UserRecord } from '@/modules/core/helpers/userHelper'
import {
import type { StreamAclRecord, StreamRecord } from '@/modules/core/helpers/types'
import type { UserRecord } from '@/modules/core/helpers/userHelper'
import type {
GetProjectWorkspace,
IntersectProjectCollaboratorsAndWorkspaceCollaborators
} from '@/modules/workspaces/domain/operations'
import { Workspace } from '@/modules/workspacesCore/domain/types'
import type { Workspace } from '@/modules/workspacesCore/domain/types'
import { WorkspaceAcl, Workspaces } from '@/modules/workspacesCore/helpers/db'
import { Knex } from 'knex'
import type { Knex } from 'knex'
const tables = {
streamAcl: (db: Knex) => db.table<StreamAclRecord>(StreamAcl.name),
@@ -1,12 +1,12 @@
import { buildTableHelper } from '@/modules/core/dbSchema'
import { RegionRecord } from '@/modules/multiregion/helpers/types'
import type { RegionRecord } from '@/modules/multiregion/helpers/types'
import { Regions } from '@/modules/multiregion/repositories'
import {
import type {
GetDefaultRegion,
UpsertRegionAssignment
} from '@/modules/workspaces/domain/operations'
import { WorkspaceRegionAssignment } from '@/modules/workspacesCore/domain/types'
import { Knex } from 'knex'
import type { WorkspaceRegionAssignment } from '@/modules/workspacesCore/domain/types'
import type { Knex } from 'knex'
export const WorkspaceRegions = buildTableHelper('workspace_regions', [
'workspaceId',
@@ -1,5 +1,5 @@
import { oidcProvider } from '@/modules/workspaces/domain/sso/models'
import {
import type {
AssociateSsoProviderWithWorkspace,
GetOidcProviderData,
GetWorkspaceSsoProvider,
@@ -12,15 +12,15 @@ import {
GetUserSsoSession,
DeleteSsoProvider
} from '@/modules/workspaces/domain/sso/operations'
import {
import type {
SsoProviderRecord,
UserSsoSessionRecord,
WorkspaceSsoProviderRecord
} from '@/modules/workspaces/domain/sso/types'
import { SsoProviderTypeNotSupportedError } from '@/modules/workspaces/errors/sso'
import { Workspace, WorkspaceAcl } from '@/modules/workspacesCore/domain/types'
import Redis from 'ioredis'
import { Knex } from 'knex'
import type { Workspace, WorkspaceAcl } from '@/modules/workspacesCore/domain/types'
import type Redis from 'ioredis'
import type { Knex } from 'knex'
import { omit } from 'lodash-es'
type Crypt = (input: string) => Promise<string>
@@ -5,18 +5,18 @@ import {
UserEmails,
Users
} from '@/modules/core/dbSchema'
import { UserEmail } from '@/modules/core/domain/userEmails/types'
import type { UserEmail } from '@/modules/core/domain/userEmails/types'
import { metaHelpers } from '@/modules/core/helpers/meta'
import { StreamAclRecord, UserRecord } from '@/modules/core/helpers/types'
import type { StreamAclRecord, UserRecord } from '@/modules/core/helpers/types'
import { removePrivateFields } from '@/modules/core/helpers/userHelper'
import { formatJsonArrayRecords } from '@/modules/shared/helpers/dbHelper'
import { compositeCursorTools } from '@/modules/shared/helpers/dbHelper'
import { SetUserActiveWorkspace } from '@/modules/workspaces/domain/operations'
import { WorkspaceTeamMember } from '@/modules/workspaces/domain/types'
import { WorkspaceAcl as WorkspaceAclRecord } from '@/modules/workspacesCore/domain/types'
import type { SetUserActiveWorkspace } from '@/modules/workspaces/domain/operations'
import type { WorkspaceTeamMember } from '@/modules/workspaces/domain/types'
import type { WorkspaceAcl as WorkspaceAclRecord } from '@/modules/workspacesCore/domain/types'
import { WorkspaceAcl } from '@/modules/workspacesCore/helpers/db'
import { ServerRoles } from '@speckle/shared'
import { Knex } from 'knex'
import type { ServerRoles } from '@speckle/shared'
import type { Knex } from 'knex'
const tables = {
users: (db: Knex) => db<UserRecord>(Users.name),
@@ -1,11 +1,11 @@
import { UserEmails } from '@/modules/core/dbSchema'
import { compositeCursorTools } from '@/modules/shared/helpers/dbHelper'
import {
import type {
CreateWorkspaceJoinRequest,
GetWorkspaceJoinRequest,
UpdateWorkspaceJoinRequestStatus
} from '@/modules/workspaces/domain/operations'
import {
import type {
WorkspaceJoinRequest,
WorkspaceJoinRequestStatus
} from '@/modules/workspacesCore/domain/types'
@@ -14,8 +14,8 @@ import {
WorkspaceJoinRequests
} from '@/modules/workspacesCore/helpers/db'
import { Roles } from '@speckle/shared'
import { Knex } from 'knex'
import { SetRequired } from 'type-fest'
import type { Knex } from 'knex'
import type { SetRequired } from 'type-fest'
const tables = {
workspaceJoinRequests: (db: Knex) =>
@@ -1,4 +1,4 @@
import {
import type {
LimitedWorkspace,
Workspace,
WorkspaceAcl,
@@ -6,7 +6,7 @@ import {
WorkspaceJoinRequest,
WorkspaceWithOptionalRole
} from '@/modules/workspacesCore/domain/types'
import {
import type {
CountDomainsByWorkspaceId,
CountWorkspaceRoleWithOptionalProjectRole,
CountWorkspaces,
@@ -45,15 +45,15 @@ import {
UpsertWorkspaceCreationState,
UpsertWorkspaceRole
} from '@/modules/workspaces/domain/operations'
import { Knex } from 'knex'
import type { Knex } from 'knex'
import { isNullOrUndefined, Roles } from '@speckle/shared'
import {
import type {
ServerAclRecord,
BranchRecord,
StreamAclRecord,
StreamRecord,
ProjectRecordVisibility
StreamRecord
} from '@/modules/core/helpers/types'
import { ProjectRecordVisibility } from '@/modules/core/helpers/types'
import { WorkspaceInvalidRoleError } from '@/modules/workspaces/errors/workspace'
import {
WorkspaceAcl as DbWorkspaceAcl,
@@ -71,10 +71,11 @@ import {
UserEmails,
Users
} from '@/modules/core/dbSchema'
import { removePrivateFields, UserRecord } from '@/modules/core/helpers/userHelper'
import type { UserRecord } from '@/modules/core/helpers/userHelper'
import { removePrivateFields } from '@/modules/core/helpers/userHelper'
import { clamp, has, isObjectLike } from 'lodash-es'
import {
import type {
WorkspaceCreationState,
WorkspaceTeamMember
} from '@/modules/workspaces/domain/types'
+11 -9
View File
@@ -2,7 +2,8 @@
import { db } from '@/db/knex'
import { validateRequest } from 'zod-express'
import { Request, RequestHandler, Router } from 'express'
import type { Request, RequestHandler } from 'express'
import { Router } from 'express'
import { z } from 'zod'
import {
createWorkspaceUserFromSsoProfileFactory,
@@ -25,9 +26,10 @@ import {
getWorkspaceSsoProviderFactory
} from '@/modules/workspaces/repositories/sso'
import { getGenericRedis } from '@/modules/shared/redis/redis'
import { generators, UserinfoResponse } from 'openid-client'
import type { UserinfoResponse } from 'openid-client'
import { generators } from 'openid-client'
import { oidcProvider } from '@/modules/workspaces/domain/sso/models'
import {
import type {
OidcProfile,
OidcProvider,
SsoSessionState,
@@ -56,13 +58,13 @@ import {
updateUserEmailFactory
} from '@/modules/core/repositories/userEmails'
import { withTransaction } from '@/modules/shared/helpers/dbHelper'
import type { UserWithOptionalRole } from '@/modules/core/repositories/users'
import {
countAdminUsersFactory,
getUserFactory,
legacyGetUserFactory,
storeUserAclFactory,
storeUserFactory,
UserWithOptionalRole
storeUserFactory
} from '@/modules/core/repositories/users'
import {
finalizeAuthMiddlewareFactory,
@@ -89,16 +91,16 @@ import {
isValidOidcProfile,
getEmailFromOidcProfile
} from '@/modules/workspaces/domain/sso/logic'
import {
import type {
GetWorkspaceBySlug,
GetWorkspaceRoles
} from '@/modules/workspaces/domain/operations'
import {
import type {
GetWorkspaceSsoProvider,
UpsertUserSsoSession
} from '@/modules/workspaces/domain/sso/operations'
import { GetUser } from '@/modules/core/domain/users/operations'
import {
import type { GetUser } from '@/modules/core/domain/users/operations'
import type {
FindEmail,
FindEmailsByUserId
} from '@/modules/core/domain/userEmails/operations'
+1 -1
View File
@@ -1,4 +1,4 @@
import { UserWorkspaceRole } from '@/modules/shared/domain/rolesAndScopes/types'
import type { UserWorkspaceRole } from '@/modules/shared/domain/rolesAndScopes/types'
import { Roles, RoleInfo } from '@speckle/shared'
import { pick } from 'lodash-es'
+1 -1
View File
@@ -1,4 +1,4 @@
import { TokenScopeData } from '@/modules/shared/domain/rolesAndScopes/types'
import type { TokenScopeData } from '@/modules/shared/domain/rolesAndScopes/types'
import { Scopes } from '@speckle/shared'
export const workspaceScopes: TokenScopeData[] = [
@@ -1,6 +1,6 @@
import { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import type { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import { userEmailsCompliantWithWorkspaceDomains } from '@/modules/workspaces/domain/logic'
import {
import type {
DeleteWorkspaceDomain,
CountDomainsByWorkspaceId,
UpdateWorkspace,
@@ -1,24 +1,24 @@
import { TokenResourceIdentifier } from '@/modules/core/domain/tokens/types'
import {
import type { TokenResourceIdentifier } from '@/modules/core/domain/tokens/types'
import type {
PendingWorkspaceCollaboratorsFilter,
TokenResourceIdentifierType,
WorkspaceInviteCreateInput
} from '@/modules/core/graph/generated/graphql'
import { TokenResourceIdentifierType } from '@/modules/core/graph/generated/graphql'
import { mapServerRoleToValue } from '@/modules/core/helpers/graphTypes'
import { getWorkspaceRoute } from '@/modules/core/helpers/routeHelper'
import { isResourceAllowed } from '@/modules/core/helpers/token'
import { UserRecord } from '@/modules/core/helpers/types'
import type { UserRecord } from '@/modules/core/helpers/types'
import { removePrivateFields } from '@/modules/core/helpers/userHelper'
import {
ProjectInviteResourceType,
ServerInviteResourceType
} from '@/modules/serverinvites/domain/constants'
import {
import type {
FindInvite,
QueryAllResourceInvites,
QueryAllUserResourceInvites
} from '@/modules/serverinvites/domain/operations'
import {
import type {
ExtendedInvite,
InviteResourceTarget,
PrimaryInviteResourceTarget,
@@ -36,46 +36,43 @@ import {
resolveInviteTargetTitle,
resolveTarget
} from '@/modules/serverinvites/helpers/core'
import {
buildCoreInviteEmailContentsFactory,
BuildInviteContentsFactoryDeps
} from '@/modules/serverinvites/services/coreEmailContents'
import {
collectAndValidateCoreTargetsFactory,
CollectAndValidateCoreTargetsFactoryDeps
} from '@/modules/serverinvites/services/coreResourceCollection'
import {
import type { BuildInviteContentsFactoryDeps } from '@/modules/serverinvites/services/coreEmailContents'
import { buildCoreInviteEmailContentsFactory } from '@/modules/serverinvites/services/coreEmailContents'
import type { CollectAndValidateCoreTargetsFactoryDeps } from '@/modules/serverinvites/services/coreResourceCollection'
import { collectAndValidateCoreTargetsFactory } from '@/modules/serverinvites/services/coreResourceCollection'
import type {
BuildInviteEmailContents,
CollectAndValidateResourceTargets,
CreateAndSendInvite,
GetInvitationTargetUsers,
InviteFinalizationAction,
ProcessFinalizedResourceInvite,
ValidateResourceInviteBeforeFinalization
} from '@/modules/serverinvites/services/operations'
import { InviteFinalizationAction } from '@/modules/serverinvites/services/operations'
import { authorizeResolver } from '@/modules/shared'
import { getFrontendOrigin } from '@/modules/shared/helpers/envHelper'
import { WorkspaceInviteResourceType } from '@/modules/workspacesCore/domain/constants'
import {
import type {
GetWorkspace,
GetWorkspaceBySlug,
GetWorkspaceDomains,
ValidateWorkspaceMemberProjectRole
} from '@/modules/workspaces/domain/operations'
import { WorkspaceInviteResourceTarget } from '@/modules/workspaces/domain/types'
import type { WorkspaceInviteResourceTarget } from '@/modules/workspaces/domain/types'
import { mapGqlWorkspaceRoleToMainRole } from '@/modules/workspaces/helpers/roles'
import { addOrUpdateWorkspaceRoleFactory } from '@/modules/workspaces/services/management'
import { PendingWorkspaceCollaboratorGraphQLReturn } from '@/modules/workspacesCore/helpers/graphTypes'
import { MaybeNullOrUndefined, Nullable, Roles } from '@speckle/shared'
import type { addOrUpdateWorkspaceRoleFactory } from '@/modules/workspaces/services/management'
import type { PendingWorkspaceCollaboratorGraphQLReturn } from '@/modules/workspacesCore/helpers/graphTypes'
import type { MaybeNullOrUndefined, Nullable } from '@speckle/shared'
import { Roles } from '@speckle/shared'
import { WorkspaceProtectedError } from '@/modules/workspaces/errors/workspace'
import { FindVerifiedEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import type { FindVerifiedEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import {
anyEmailCompliantWithWorkspaceDomains,
userEmailsCompliantWithWorkspaceDomains
} from '@/modules/workspaces/domain/logic'
import { GetStream } from '@/modules/core/domain/streams/operations'
import { GetUser } from '@/modules/core/domain/users/operations'
import { GetWorkspaceRoleAndSeat } from '@/modules/workspacesCore/domain/operations'
import type { GetStream } from '@/modules/core/domain/streams/operations'
import type { GetUser } from '@/modules/core/domain/users/operations'
import type { GetWorkspaceRoleAndSeat } from '@/modules/workspacesCore/domain/operations'
import { LogicError } from '@/modules/shared/errors'
import { WorkspaceSeatType } from '@/modules/workspacesCore/domain/types'
@@ -1,5 +1,5 @@
import { WorkspaceEvents } from '@/modules/workspacesCore/domain/events'
import {
import type {
DeleteWorkspace,
EmitWorkspaceEvent,
GetWorkspace,
@@ -14,20 +14,16 @@ import {
EnsureValidWorkspaceRoleSeat,
AssignWorkspaceSeat
} from '@/modules/workspaces/domain/operations'
import {
import type {
Workspace,
WorkspaceAcl,
WorkspaceDomain,
WorkspaceWithDomains
} from '@/modules/workspacesCore/domain/types'
import {
generateSlugFromName,
MaybeNullOrUndefined,
Roles,
validateWorkspaceSlug
} from '@speckle/shared'
import type { MaybeNullOrUndefined } from '@speckle/shared'
import { generateSlugFromName, Roles, validateWorkspaceSlug } from '@speckle/shared'
import cryptoRandomString from 'crypto-random-string'
import {
import type {
DeleteWorkspaceRole,
GetWorkspaceRoleForUser,
GetWorkspaceRoles
@@ -44,32 +40,30 @@ import {
WorkspaceInvalidUpdateError
} from '@/modules/workspaces/errors/workspace'
import { isUserLastWorkspaceAdmin } from '@/modules/workspaces/helpers/roles'
import { EventBus } from '@/modules/shared/services/eventBus'
import type { EventBus } from '@/modules/shared/services/eventBus'
import { removeNullOrUndefinedKeys } from '@speckle/shared'
import { isNewResourceAllowed } from '@/modules/core/helpers/token'
import {
TokenResourceIdentifier,
TokenResourceIdentifierType
} from '@/modules/core/domain/tokens/types'
import type { TokenResourceIdentifier } from '@/modules/core/domain/tokens/types'
import { TokenResourceIdentifierType } from '@/modules/core/domain/tokens/types'
import { ForbiddenError } from '@/modules/shared/errors'
import { validateImageString } from '@/modules/workspaces/helpers/images'
import {
import type {
FindEmailsByUserId,
FindVerifiedEmailsByUserId
} from '@/modules/core/domain/userEmails/operations'
import { DeleteAllResourceInvites } from '@/modules/serverinvites/domain/operations'
import type { DeleteAllResourceInvites } from '@/modules/serverinvites/domain/operations'
import { WorkspaceInviteResourceType } from '@/modules/workspacesCore/domain/constants'
import { ProjectInviteResourceType } from '@/modules/serverinvites/domain/constants'
import { chunk, isEmpty, omit } from 'lodash-es'
import { userEmailsCompliantWithWorkspaceDomains } from '@/modules/workspaces/domain/logic'
import { workspaceRoles as workspaceRoleDefinitions } from '@/modules/workspaces/roles'
import { blockedDomains } from '@speckle/shared'
import { DeleteStreamRecord } from '@/modules/core/domain/streams/operations'
import {
import type { DeleteStreamRecord } from '@/modules/core/domain/streams/operations'
import type {
DeleteSsoProvider,
GetWorkspaceSsoProviderRecord
} from '@/modules/workspaces/domain/sso/operations'
import { QueryAllProjects } from '@/modules/core/domain/projects/operations'
import type { QueryAllProjects } from '@/modules/core/domain/projects/operations'
type WorkspaceCreateArgs = {
userId: string
@@ -1,6 +1,6 @@
import { GetProject } from '@/modules/core/domain/projects/operations'
import { UpdateProjectRegionKey } from '@/modules/multiregion/services/projectRegion'
import {
import type { GetProject } from '@/modules/core/domain/projects/operations'
import type { UpdateProjectRegionKey } from '@/modules/multiregion/services/projectRegion'
import type {
CopyProjectAutomations,
CopyProjectBlobs,
CopyProjectComments,
@@ -1,5 +1,6 @@
import { ProjectRecordVisibility, StreamRecord } from '@/modules/core/helpers/types'
import {
import type { StreamRecord } from '@/modules/core/helpers/types'
import { ProjectRecordVisibility } from '@/modules/core/helpers/types'
import type {
GetDefaultRegion,
GetWorkspaceDomains,
GetWorkspaceRoleToDefaultProjectRoleMapping,
@@ -14,15 +15,19 @@ import {
WorkspaceInvalidRoleError,
WorkspaceNotFoundError
} from '@/modules/workspaces/errors/workspace'
import { GetProject, UpdateProject } from '@/modules/core/domain/projects/operations'
import type {
GetProject,
UpdateProject
} from '@/modules/core/domain/projects/operations'
import { chunk } from 'lodash-es'
import { Roles, WorkspaceRoles } from '@speckle/shared'
import {
import type { WorkspaceRoles } from '@speckle/shared'
import { Roles } from '@speckle/shared'
import type {
GetStreamCollaborators,
UpdateStreamRole
} from '@/modules/core/domain/streams/operations'
import { ProjectNotFoundError } from '@/modules/core/errors/projects'
import { WorkspaceProjectCreateInput } from '@/modules/core/graph/generated/graphql'
import type { WorkspaceProjectCreateInput } from '@/modules/core/graph/generated/graphql'
import {
getDb,
getValidDefaultProjectRegionKey
@@ -44,16 +49,16 @@ import {
getWorkspaceFactory,
upsertWorkspaceFactory
} from '@/modules/workspaces/repositories/workspaces'
import {
import type {
GetWorkspaceRoleAndSeat,
GetWorkspaceRolesAndSeats,
GetWorkspaceWithPlan,
WorkspaceSeatType
GetWorkspaceWithPlan
} from '@/modules/gatekeeper/domain/billing'
import { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import { WorkspaceSeatType } from '@/modules/gatekeeper/domain/billing'
import type { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import { userEmailsCompliantWithWorkspaceDomains } from '@/modules/workspaces/domain/logic'
import { CreateWorkspaceSeat } from '@/modules/gatekeeper/domain/operations'
import { WorkspaceAcl } from '@/modules/workspacesCore/domain/types'
import type { CreateWorkspaceSeat } from '@/modules/gatekeeper/domain/operations'
import type { WorkspaceAcl } from '@/modules/workspacesCore/domain/types'
type MoveProjectToWorkspaceArgs = {
projectId: string
@@ -1,6 +1,6 @@
import { WorkspaceFeatureAccessFunction } from '@/modules/gatekeeper/domain/operations'
import { GetRegions } from '@/modules/multiregion/domain/operations'
import {
import type { WorkspaceFeatureAccessFunction } from '@/modules/gatekeeper/domain/operations'
import type { GetRegions } from '@/modules/multiregion/domain/operations'
import type {
AssignWorkspaceRegion,
GetAvailableRegions,
GetDefaultRegion,
@@ -1,12 +1,12 @@
import { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import { UserEmail } from '@/modules/core/domain/userEmails/types'
import {
import type { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import type { UserEmail } from '@/modules/core/domain/userEmails/types'
import type {
GetUserDiscoverableWorkspaces,
GetUsersCurrentAndEligibleToBecomeAMemberWorkspaces,
GetWorkspaceRolesForUser,
GetWorkspaces
} from '@/modules/workspaces/domain/operations'
import { LimitedWorkspace, Workspace } from '@/modules/workspacesCore/domain/types'
import type { LimitedWorkspace, Workspace } from '@/modules/workspacesCore/domain/types'
type GetDiscoverableWorkspaceForUserArgs = {
userId: string
@@ -1,4 +1,4 @@
import {
import type {
GetOidcProviderAttributes,
StoreOidcProviderValidationRequest,
StoreProviderRecord,
@@ -7,25 +7,28 @@ import {
ListWorkspaceSsoMemberships,
ListUserSsoSessions
} from '@/modules/workspaces/domain/sso/operations'
import {
import type {
OidcProvider,
OidcProviderRecord,
OidcProviderAttributes,
OidcProfile
} from '@/modules/workspaces/domain/sso/types'
import cryptoRandomString from 'crypto-random-string'
import { UserinfoResponse } from 'openid-client'
import {
import type { UserinfoResponse } from 'openid-client'
import type {
CreateUserEmail,
FindEmail,
FindEmailsByUserId,
UpdateUserEmail
} from '@/modules/core/domain/userEmails/operations'
import { isWorkspaceRole, toLimitedWorkspace } from '@/modules/workspaces/domain/logic'
import { UserWithOptionalRole } from '@/modules/core/repositories/users'
import { DeleteInvite, FindInvite } from '@/modules/serverinvites/domain/operations'
import { AddOrUpdateWorkspaceRole } from '@/modules/workspaces/domain/operations'
import { CreateValidatedUser } from '@/modules/core/domain/users/operations'
import type { UserWithOptionalRole } from '@/modules/core/repositories/users'
import type {
DeleteInvite,
FindInvite
} from '@/modules/serverinvites/domain/operations'
import type { AddOrUpdateWorkspaceRole } from '@/modules/workspaces/domain/operations'
import type { CreateValidatedUser } from '@/modules/core/domain/users/operations'
import {
OidcProviderMissingGrantTypeError,
SsoProviderExistsError,
@@ -33,7 +36,7 @@ import {
SsoUserInviteRequiredError
} from '@/modules/workspaces/errors/sso'
import { WorkspaceInvalidRoleError } from '@/modules/workspaces/errors/workspace'
import { LimitedWorkspace } from '@/modules/workspacesCore/domain/types'
import type { LimitedWorkspace } from '@/modules/workspacesCore/domain/types'
import {
getEmailFromOidcProfile,
isValidSsoSession
@@ -1,15 +1,15 @@
import { ScheduleExecution } from '@/modules/core/domain/scheduledTasks/operations'
import {
calculateSubscriptionSeats,
import type { ScheduleExecution } from '@/modules/core/domain/scheduledTasks/operations'
import type {
GetWorkspacePlan,
GetWorkspaceSubscription
} from '@/modules/gatekeeper/domain/billing'
import { calculateSubscriptionSeats } from '@/modules/gatekeeper/domain/billing'
import type { MixpanelClient } from '@/modules/shared/utils/mixpanel'
import {
getBaseTrackingProperties,
MixpanelClient,
WORKSPACE_TRACKING_ID_KEY
} from '@/modules/shared/utils/mixpanel'
import {
import type {
CountWorkspaceRoleWithOptionalProjectRole,
GetDefaultRegion,
GetWorkspaceModelCount,
@@ -17,9 +17,10 @@ import {
GetWorkspaceSeatCount,
GetAllWorkspaces
} from '@/modules/workspaces/domain/operations'
import { Workspace } from '@/modules/workspacesCore/domain/types'
import { Logger } from '@/observability/logging'
import { Nullable, Roles, SeatTypes } from '@speckle/shared'
import type { Workspace } from '@/modules/workspacesCore/domain/types'
import type { Logger } from '@/observability/logging'
import type { Nullable } from '@speckle/shared'
import { Roles, SeatTypes } from '@speckle/shared'
import {
countWorkspaceRoleWithOptionalProjectRoleFactory,
getAllWorkspacesFactory,
@@ -1,5 +1,5 @@
import { Logger } from '@/observability/logging'
import {
import type { Logger } from '@/observability/logging'
import type {
DeleteWorkspace,
GetWorkspacesNonComplete
} from '@/modules/workspaces/domain/operations'
@@ -1,8 +1,8 @@
import { GetServerInfo } from '@/modules/core/domain/server/operations'
import { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import { RenderEmail, SendEmail } from '@/modules/emails/domain/operations'
import type { GetServerInfo } from '@/modules/core/domain/server/operations'
import type { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import type { RenderEmail, SendEmail } from '@/modules/emails/domain/operations'
import { getFrontendOrigin } from '@/modules/shared/helpers/envHelper'
import { SendWorkspaceJoinRequestApprovedEmail } from '@/modules/workspaces/domain/operations'
import type { SendWorkspaceJoinRequestApprovedEmail } from '@/modules/workspaces/domain/operations'
type WorkspaceJoinRequestApprovedEmailArgs = {
workspace: { id: string; name: string; slug: string }
@@ -1,8 +1,8 @@
import { GetServerInfo } from '@/modules/core/domain/server/operations'
import { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import { RenderEmail, SendEmail } from '@/modules/emails/domain/operations'
import type { GetServerInfo } from '@/modules/core/domain/server/operations'
import type { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import type { RenderEmail, SendEmail } from '@/modules/emails/domain/operations'
import { getFrontendOrigin } from '@/modules/shared/helpers/envHelper'
import { SendWorkspaceJoinRequestApprovedEmail } from '@/modules/workspaces/domain/operations'
import type { SendWorkspaceJoinRequestApprovedEmail } from '@/modules/workspaces/domain/operations'
type WorkspaceJoinRequestDeniedEmailArgs = {
workspace: { id: string; name: string; slug: string }
@@ -1,8 +1,8 @@
import { GetServerInfo } from '@/modules/core/domain/server/operations'
import { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import { RenderEmail, SendEmail } from '@/modules/emails/domain/operations'
import type { GetServerInfo } from '@/modules/core/domain/server/operations'
import type { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import type { RenderEmail, SendEmail } from '@/modules/emails/domain/operations'
import { getFrontendOrigin } from '@/modules/shared/helpers/envHelper'
import {
import type {
GetWorkspaceCollaborators,
SendWorkspaceJoinRequestReceivedEmail
} from '@/modules/workspaces/domain/operations'
@@ -4,9 +4,9 @@ import {
WorkspaceNotJoinableError,
WorkspaceProtectedError
} from '@/modules/workspaces/errors/workspace'
import { GetUser } from '@/modules/core/domain/users/operations'
import type { GetUser } from '@/modules/core/domain/users/operations'
import { NotFoundError } from '@/modules/shared/errors'
import {
import type {
AddOrUpdateWorkspaceRole,
ApproveWorkspaceJoinRequest,
CreateWorkspaceJoinRequest,
@@ -21,9 +21,9 @@ import {
UpdateWorkspaceJoinRequestStatus
} from '@/modules/workspaces/domain/operations'
import { Roles } from '@speckle/shared'
import { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import type { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import { userEmailsCompliantWithWorkspaceDomains } from '@/modules/workspaces/domain/logic'
import { EventBus } from '@/modules/shared/services/eventBus'
import type { EventBus } from '@/modules/shared/services/eventBus'
import { WorkspaceEvents } from '@/modules/workspacesCore/domain/events'
export const dismissWorkspaceJoinRequestFactory =
@@ -1,6 +1,6 @@
import { GetPaginatedProjectModelsTotalCount } from '@/modules/core/domain/branches/operations'
import { QueryAllProjects } from '@/modules/core/domain/projects/operations'
import { GetWorkspaceModelCount } from '@/modules/workspaces/domain/operations'
import type { GetPaginatedProjectModelsTotalCount } from '@/modules/core/domain/branches/operations'
import type { QueryAllProjects } from '@/modules/core/domain/projects/operations'
import type { GetWorkspaceModelCount } from '@/modules/workspaces/domain/operations'
// TODO: Optimize with single model count query per regional db
export const getWorkspaceModelCountFactory =
@@ -1,12 +1,12 @@
import { WorkspaceSeatType } from '@/modules/gatekeeper/domain/billing'
import {
import type {
CreateWorkspaceSeat,
GetWorkspaceDefaultSeatType,
GetWorkspaceUserSeat
} from '@/modules/gatekeeper/domain/operations'
import { NotFoundError } from '@/modules/shared/errors'
import { EventBusEmit } from '@/modules/shared/services/eventBus'
import {
import type { EventBusEmit } from '@/modules/shared/services/eventBus'
import type {
AssignWorkspaceSeat,
EnsureValidWorkspaceRoleSeat,
GetWorkspace,
@@ -15,7 +15,8 @@ import {
import { InvalidWorkspaceSeatTypeError } from '@/modules/workspaces/errors/workspaceSeat'
import { WorkspaceDefaultSeatType } from '@/modules/workspacesCore/domain/constants'
import { WorkspaceEvents } from '@/modules/workspacesCore/domain/events'
import { Roles, WorkspaceRoles } from '@speckle/shared'
import type { WorkspaceRoles } from '@speckle/shared'
import { Roles } from '@speckle/shared'
import { z } from 'zod'
export const getWorkspaceDefaultSeatTypeFactory =
@@ -45,18 +45,16 @@ import {
validateSlugFactory,
generateValidSlugFactory
} from '@/modules/workspaces/services/management'
import { BasicTestUser } from '@/test/authHelper'
import { CreateWorkspaceInviteMutationVariables } from '@/modules/core/graph/generated/graphql'
import type { BasicTestUser } from '@/test/authHelper'
import type { CreateWorkspaceInviteMutationVariables } from '@/modules/core/graph/generated/graphql'
import cryptoRandomString from 'crypto-random-string'
import {
import type {
MaybeNullOrUndefined,
PaidWorkspacePlans,
Roles,
WorkspacePlan,
WorkspacePlans,
WorkspacePlanStatuses,
WorkspaceRoles
} from '@speckle/shared'
import { PaidWorkspacePlans, Roles, WorkspacePlanStatuses } from '@speckle/shared'
import {
getStreamFactory,
getStreamRolesFactory,
@@ -71,7 +69,7 @@ import {
upsertUserSsoSessionFactory
} from '@/modules/workspaces/repositories/sso'
import { getEncryptor } from '@/modules/workspaces/helpers/sso'
import { OidcProvider } from '@/modules/workspaces/domain/sso/types'
import type { OidcProvider } from '@/modules/workspaces/domain/sso/types'
import { getFeatureFlags, getFrontendOrigin } from '@/modules/shared/helpers/envHelper'
import { getDefaultSsoSessionExpirationDate } from '@/modules/workspaces/domain/sso/logic'
import {
@@ -80,7 +78,7 @@ import {
upsertWorkspacePlanFactory,
upsertWorkspaceSubscriptionFactory
} from '@/modules/gatekeeper/repositories/billing'
import { SetOptional } from 'type-fest'
import type { SetOptional } from 'type-fest'
import { isMultiRegionTestMode } from '@/test/speckle-helpers/regions'
import {
assignWorkspaceRegionFactory,
@@ -130,8 +128,8 @@ import {
validateStreamAccessFactory
} from '@/modules/core/services/streams/access'
import { authorizeResolver } from '@/modules/shared'
import { WorkspaceCreationState } from '@/modules/workspaces/domain/types'
import {
import type { WorkspaceCreationState } from '@/modules/workspaces/domain/types'
import type {
WorkspaceSeat,
WorkspaceWithOptionalRole
} from '@/modules/workspacesCore/domain/types'
@@ -1,39 +1,41 @@
import { ExecuteOperationOptions, TestApolloServer } from '@/test/graphqlHelper'
import type { ExecuteOperationOptions, TestApolloServer } from '@/test/graphqlHelper'
import {
BatchCreateWorkspaceInvitesDocument,
import type {
BatchCreateWorkspaceInvitesMutationVariables,
CancelWorkspaceInviteDocument,
CancelWorkspaceInviteMutationVariables,
CreateProjectInviteDocument,
CreateProjectInviteMutationVariables,
CreateWorkspaceInviteDocument,
CreateWorkspaceInviteMutationVariables,
CreateWorkspaceProjectInviteDocument,
CreateWorkspaceProjectInviteMutationVariables,
GetMyWorkspaceInvitesDocument,
GetProjectDocument,
GetProjectQueryVariables,
GetWorkspaceDocument,
GetWorkspaceInviteDocument,
GetWorkspaceInviteQueryVariables,
GetWorkspaceQueryVariables,
GetWorkspaceWithTeamDocument,
GetWorkspaceWithTeamQueryVariables,
ResendWorkspaceInviteDocument,
ResendWorkspaceInviteMutationVariables,
UseWorkspaceInviteDocument,
UseWorkspaceInviteMutationVariables,
UseWorkspaceProjectInviteDocument,
UseWorkspaceProjectInviteMutationVariables
} from '@/modules/core/graph/generated/graphql'
import {
BatchCreateWorkspaceInvitesDocument,
CancelWorkspaceInviteDocument,
CreateProjectInviteDocument,
CreateWorkspaceInviteDocument,
CreateWorkspaceProjectInviteDocument,
GetMyWorkspaceInvitesDocument,
GetProjectDocument,
GetWorkspaceDocument,
GetWorkspaceInviteDocument,
GetWorkspaceWithTeamDocument,
ResendWorkspaceInviteDocument,
UseWorkspaceInviteDocument,
UseWorkspaceProjectInviteDocument
} from '@/modules/core/graph/generated/graphql'
import { expect } from 'chai'
import { MaybeAsync, StreamRoles, WorkspaceRoles } from '@speckle/shared'
import type { MaybeAsync, StreamRoles, WorkspaceRoles } from '@speckle/shared'
import { expectToThrow } from '@/test/assertionHelper'
import { ForbiddenError } from '@/modules/shared/errors'
import { isBoolean } from 'lodash-es'
import { WorkspaceSeatType } from '@/modules/workspacesCore/domain/types'
import type { WorkspaceSeatType } from '@/modules/workspacesCore/domain/types'
export const buildInvitesGraphqlOperations = (deps: { apollo: TestApolloServer }) => {
const { apollo } = deps
@@ -1,6 +1,7 @@
import { basicWorkspaceFragment } from '@/modules/workspaces/tests/helpers/graphql'
import { ProjectImplicitRoleCheckFragment } from '@/modules/core/graph/generated/graphql'
import { MaybeNullOrUndefined, Roles } from '@speckle/shared'
import type { ProjectImplicitRoleCheckFragment } from '@/modules/core/graph/generated/graphql'
import type { MaybeNullOrUndefined } from '@speckle/shared'
import { Roles } from '@speckle/shared'
import { gql } from 'graphql-tag'
export const fullPermissionCheckResultFragment = gql(`
@@ -1,16 +1,14 @@
import type { BasicTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import {
assignToWorkspaces,
BasicTestWorkspace,
createTestWorkspaces,
createWorkspaceInviteDirectly,
unassignFromWorkspace
} from '@/modules/workspaces/tests/helpers/creation'
import { BasicTestUser, createTestUsers } from '@/test/authHelper'
import {
createTestContext,
testApolloServer,
TestApolloServer
} from '@/test/graphqlHelper'
import type { BasicTestUser } from '@/test/authHelper'
import { createTestUsers } from '@/test/authHelper'
import type { TestApolloServer } from '@/test/graphqlHelper'
import { createTestContext, testApolloServer } from '@/test/graphqlHelper'
import { beforeEachContext, truncateTables } from '@/test/hooks'
import { WorkspaceRole } from '@/modules/core/graph/generated/graphql'
import { expect } from 'chai'
@@ -18,23 +16,21 @@ import {
captureCreatedInvite,
validateInviteExistanceFromEmail
} from '@/test/speckle-helpers/inviteHelper'
import { Roles, StreamRoles, WorkspaceRoles } from '@speckle/shared'
import type { StreamRoles, WorkspaceRoles } from '@speckle/shared'
import { Roles } from '@speckle/shared'
import { itEach } from '@/test/assertionHelper'
import { ServerInvites } from '@/modules/core/dbSchema'
import { TokenResourceIdentifierType } from '@/modules/core/graph/generated/graphql'
import { times } from 'lodash-es'
import { findInviteFactory } from '@/modules/serverinvites/repositories/serverInvites'
import { db } from '@/db/knex'
import {
BasicTestStream,
createTestStreams,
leaveStream
} from '@/test/speckle-helpers/streamHelper'
import type { BasicTestStream } from '@/test/speckle-helpers/streamHelper'
import { createTestStreams, leaveStream } from '@/test/speckle-helpers/streamHelper'
import { Workspaces } from '@/modules/workspaces/helpers/db'
import type { LocalAuthRestApiHelpers } from '@/modules/auth/tests/helpers/registration'
import {
generateRegistrationParams,
localAuthRestApi,
LocalAuthRestApiHelpers
localAuthRestApi
} from '@/modules/auth/tests/helpers/registration'
import type { Express } from 'express'
import { AllScopes } from '@/modules/core/helpers/mainConstants'
@@ -62,15 +58,14 @@ import {
} from '@/modules/core/services/streams/access'
import { authorizeResolver } from '@/modules/shared'
import { getUserFactory } from '@/modules/core/repositories/users'
import {
TestInvitesGraphQLOperations,
buildInvitesGraphqlOperations
} from '@/modules/workspaces/tests/helpers/invites'
import type { TestInvitesGraphQLOperations } from '@/modules/workspaces/tests/helpers/invites'
import { buildInvitesGraphqlOperations } from '@/modules/workspaces/tests/helpers/invites'
import { getEventBus } from '@/modules/shared/services/eventBus'
import { WorkspaceSeatType } from '@/modules/workspacesCore/domain/types'
import { ProjectRecordVisibility } from '@/modules/core/helpers/types'
import { getFeatureFlags } from '@/modules/shared/helpers/envHelper'
import { createEmailListener, TestEmailListener } from '@/test/speckle-helpers/email'
import type { TestEmailListener } from '@/test/speckle-helpers/email'
import { createEmailListener } from '@/test/speckle-helpers/email'
enum InviteByTarget {
Email = 'email',
@@ -1,6 +1,7 @@
import { db } from '@/db/knex'
import { StreamAcl, Streams } from '@/modules/core/dbSchema'
import { ProjectRecordVisibility, StreamRecord } from '@/modules/core/helpers/types'
import type { StreamRecord } from '@/modules/core/helpers/types'
import { ProjectRecordVisibility } from '@/modules/core/helpers/types'
import {
deleteProjectFactory,
getProjectFactory
@@ -11,19 +12,19 @@ import { WorkspaceSeatType } from '@/modules/gatekeeper/domain/billing'
import { getWorkspaceUserSeatsFactory } from '@/modules/gatekeeper/repositories/workspaceSeat'
import { getRegionDb } from '@/modules/multiregion/utils/dbSelector'
import { WorkspaceInvalidRoleError } from '@/modules/workspaces/errors/workspace'
import type { BasicTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import {
assignToWorkspace,
assignToWorkspaces,
BasicTestWorkspace,
createTestWorkspace
} from '@/modules/workspaces/tests/helpers/creation'
import { describeEach, itEach } from '@/test/assertionHelper'
import {
BasicTestUser,
createTestUser,
createTestUsers,
login
} from '@/test/authHelper'
import type { BasicTestUser } from '@/test/authHelper'
import { createTestUser, createTestUsers, login } from '@/test/authHelper'
import type {
GetWorkspaceProjectsQuery,
ProjectUpdateRoleInput
} from '@/modules/core/graph/generated/graphql'
import {
ActiveUserProjectsDocument,
ActiveUserProjectsWorkspaceDocument,
@@ -31,33 +32,27 @@ import {
GetProjectDocument,
GetWorkspaceDocument,
GetWorkspaceProjectsDocument,
GetWorkspaceProjectsQuery,
GetWorkspaceTeamDocument,
MoveProjectToWorkspaceDocument,
ProjectUpdateRoleInput,
ProjectVisibility,
UpdateProjectDocument,
UpdateProjectRoleDocument,
UpdateWorkspaceProjectRoleDocument
} from '@/modules/core/graph/generated/graphql'
import {
ExecuteOperationResponse,
testApolloServer,
TestApolloServer
} from '@/test/graphqlHelper'
import type { ExecuteOperationResponse, TestApolloServer } from '@/test/graphqlHelper'
import { testApolloServer } from '@/test/graphqlHelper'
import { beforeEachContext } from '@/test/hooks'
import { mockAdminOverride } from '@/test/mocks/global'
import { isMultiRegionTestMode } from '@/test/speckle-helpers/regions'
import type { BasicTestStream } from '@/test/speckle-helpers/streamHelper'
import {
addToStream,
BasicTestStream,
createTestStream,
getUserStreamRole
} from '@/test/speckle-helpers/streamHelper'
import type { Nullable, Optional } from '@speckle/shared'
import {
isNonNullable,
Nullable,
Optional,
PaidWorkspacePlans,
Roles,
WorkspacePlans
@@ -65,7 +60,7 @@ import {
import { expect } from 'chai'
import cryptoRandomString from 'crypto-random-string'
import dayjs from 'dayjs'
import { Knex } from 'knex'
import type { Knex } from 'knex'
import { times } from 'lodash-es'
const grantStreamPermissions = grantStreamPermissionsFactory({ db })
@@ -3,18 +3,20 @@ import { isMultiRegionEnabled } from '@/modules/multiregion/helpers'
import { setMultiRegionConfig } from '@/modules/multiregion/regionConfig'
import { storeRegionFactory } from '@/modules/multiregion/repositories'
import { WorkspaceRegions } from '@/modules/workspaces/repositories/regions'
import type { BasicTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import {
assignToWorkspace,
BasicTestWorkspace,
createTestWorkspace
} from '@/modules/workspaces/tests/helpers/creation'
import { BasicTestUser, createTestUser } from '@/test/authHelper'
import type { BasicTestUser } from '@/test/authHelper'
import { createTestUser } from '@/test/authHelper'
import {
GetAvailableRegionsDocument,
GetWorkspaceDefaultRegionDocument,
SetWorkspaceDefaultRegionDocument
} from '@/modules/core/graph/generated/graphql'
import { testApolloServer, TestApolloServer } from '@/test/graphqlHelper'
import type { TestApolloServer } from '@/test/graphqlHelper'
import { testApolloServer } from '@/test/graphqlHelper'
import { beforeEachContext, getRegionKeys } from '@/test/hooks'
import { truncateRegionsSafely } from '@/test/speckle-helpers/regions'
import { PaidWorkspacePlans, Roles } from '@speckle/shared'
@@ -19,16 +19,12 @@ import {
import db from '@/db/knex'
import cryptoRandomString from 'crypto-random-string'
import { expect } from 'chai'
import { Workspace, WorkspaceAcl } from '@/modules/workspacesCore/domain/types'
import type { Workspace, WorkspaceAcl } from '@/modules/workspacesCore/domain/types'
import { expectToThrow } from '@/test/assertionHelper'
import type { BasicTestUser } from '@/test/authHelper'
import { buildBasicTestUser, createTestUser, createTestUsers } from '@/test/authHelper'
import type { BasicTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import {
BasicTestUser,
buildBasicTestUser,
createTestUser,
createTestUsers
} from '@/test/authHelper'
import {
BasicTestWorkspace,
assignToWorkspace,
buildBasicTestWorkspace,
createTestWorkspace,
@@ -1,16 +1,14 @@
import { createRandomEmail } from '@/modules/core/helpers/testHelpers'
import { intersectProjectCollaboratorsAndWorkspaceCollaboratorsFactory } from '@/modules/workspaces/repositories/projects'
import type { BasicTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import {
assignToWorkspaces,
BasicTestWorkspace,
createTestWorkspace
} from '@/modules/workspaces/tests/helpers/creation'
import { BasicTestUser, createTestUser, createTestUsers } from '@/test/authHelper'
import {
addAllToStream,
BasicTestStream,
createTestStream
} from '@/test/speckle-helpers/streamHelper'
import type { BasicTestUser } from '@/test/authHelper'
import { createTestUser, createTestUsers } from '@/test/authHelper'
import type { BasicTestStream } from '@/test/speckle-helpers/streamHelper'
import { addAllToStream, createTestStream } from '@/test/speckle-helpers/streamHelper'
import cryptoRandomString from 'crypto-random-string'
import { db } from '@/db/knex'
import { expect } from 'chai'
@@ -4,13 +4,15 @@ import {
createRandomString
} from '@/modules/core/helpers/testHelpers'
import { getInvitableCollaboratorsByProjectIdFactory } from '@/modules/workspaces/repositories/users'
import type { BasicTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import {
assignToWorkspace,
BasicTestWorkspace,
createTestWorkspace
} from '@/modules/workspaces/tests/helpers/creation'
import { BasicTestUser, createTestUser, createTestUsers } from '@/test/authHelper'
import { BasicTestStream, createTestStream } from '@/test/speckle-helpers/streamHelper'
import type { BasicTestUser } from '@/test/authHelper'
import { createTestUser, createTestUsers } from '@/test/authHelper'
import type { BasicTestStream } from '@/test/speckle-helpers/streamHelper'
import { createTestStream } from '@/test/speckle-helpers/streamHelper'
import { expect } from 'chai'
import { pick } from 'lodash-es'
@@ -1,27 +1,22 @@
import { Streams } from '@/modules/core/dbSchema'
import { AllScopes } from '@/modules/core/helpers/mainConstants'
import { ProjectRecordVisibility } from '@/modules/core/helpers/types'
import type { BasicTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import {
assignToWorkspace,
BasicTestWorkspace,
createTestWorkspace,
unassignFromWorkspace
} from '@/modules/workspaces/tests/helpers/creation'
import {
ProjectImplicitRoleCheck,
projectImplicitRoleCheck
} from '@/modules/workspaces/tests/helpers/rolesGraphql'
import type { ProjectImplicitRoleCheck } from '@/modules/workspaces/tests/helpers/rolesGraphql'
import { projectImplicitRoleCheck } from '@/modules/workspaces/tests/helpers/rolesGraphql'
import { WorkspaceSeatType } from '@/modules/workspacesCore/domain/types'
import {
WorkspaceAcl,
Workspaces,
WorkspaceSeats
} from '@/modules/workspacesCore/helpers/db'
import {
BasicTestUser,
createAuthTokenForUser,
createTestUsers
} from '@/test/authHelper'
import type { BasicTestUser } from '@/test/authHelper'
import { createAuthTokenForUser, createTestUsers } from '@/test/authHelper'
import {
ActiveUserLeaveWorkspaceDocument,
GetUserProjectsWithAccessChecksDocument,
@@ -31,17 +26,11 @@ import {
UpdateWorkspaceRoleDocument,
UpdateWorkspaceSeatTypeDocument
} from '@/modules/core/graph/generated/graphql'
import {
createTestContext,
testApolloServer,
TestApolloServer
} from '@/test/graphqlHelper'
import type { TestApolloServer } from '@/test/graphqlHelper'
import { createTestContext, testApolloServer } from '@/test/graphqlHelper'
import { beforeEachContext, truncateTables } from '@/test/hooks'
import {
addToStream,
BasicTestStream,
createTestStream
} from '@/test/speckle-helpers/streamHelper'
import type { BasicTestStream } from '@/test/speckle-helpers/streamHelper'
import { addToStream, createTestStream } from '@/test/speckle-helpers/streamHelper'
import { Roles } from '@speckle/shared'
import { expect } from 'chai'
import cryptoRandomString from 'crypto-random-string'
@@ -1,17 +1,14 @@
import { ProjectRecordVisibility } from '@/modules/core/helpers/types'
import { getFeatureFlags } from '@/modules/shared/helpers/envHelper'
import type { BasicTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import {
assignToWorkspaces,
BasicTestWorkspace,
createTestOidcProvider,
createTestSsoSession,
createTestWorkspaces
} from '@/modules/workspaces/tests/helpers/creation'
import {
BasicTestUser,
createAuthTokenForUser,
createTestUsers
} from '@/test/authHelper'
import type { BasicTestUser } from '@/test/authHelper'
import { createAuthTokenForUser, createTestUsers } from '@/test/authHelper'
import {
ActiveUserExpiredSsoSessionsDocument,
GetActiveUserWorkspacesDocument,
@@ -20,13 +17,11 @@ import {
GetWorkspaceProjectsDocument,
GetWorkspaceSsoDocument
} from '@/modules/core/graph/generated/graphql'
import {
createTestContext,
testApolloServer,
TestApolloServer
} from '@/test/graphqlHelper'
import type { TestApolloServer } from '@/test/graphqlHelper'
import { createTestContext, testApolloServer } from '@/test/graphqlHelper'
import { truncateTables } from '@/test/hooks'
import { BasicTestStream, createTestStream } from '@/test/speckle-helpers/streamHelper'
import type { BasicTestStream } from '@/test/speckle-helpers/streamHelper'
import { createTestStream } from '@/test/speckle-helpers/streamHelper'
import { AllScopes, Roles } from '@speckle/shared'
import { expect } from 'chai'
import cryptoRandomString from 'crypto-random-string'
@@ -7,21 +7,22 @@ import {
listWorkspaceSsoMembershipsFactory,
upsertUserSsoSessionFactory
} from '@/modules/workspaces/repositories/sso'
import type { BasicTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import {
assignToWorkspace,
BasicTestWorkspace,
createTestOidcProvider,
createTestSsoSession,
createTestWorkspace,
createTestWorkspaces
} from '@/modules/workspaces/tests/helpers/creation'
import { BasicTestUser, createTestUser, createTestUsers } from '@/test/authHelper'
import type { BasicTestUser } from '@/test/authHelper'
import { createTestUser, createTestUsers } from '@/test/authHelper'
import { Roles, wait } from '@speckle/shared'
import db from '@/db/knex'
import { getDecryptor } from '@/modules/workspaces/helpers/sso'
import cryptoRandomString from 'crypto-random-string'
import { expect } from 'chai'
import { UserSsoSessionRecord } from '@/modules/workspaces/domain/sso/types'
import type { UserSsoSessionRecord } from '@/modules/workspaces/domain/sso/types'
import { truncateTables } from '@/test/hooks'
import { isValidSsoSession } from '@/modules/workspaces/domain/sso/logic'
import { getFeatureFlags } from '@/modules/shared/helpers/envHelper'
@@ -13,29 +13,27 @@ import {
validateSlugFactory
} from '@/modules/workspaces/services/management'
import { createWorkspaceProjectFactory } from '@/modules/workspaces/services/projects'
import type { BasicTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import {
BasicTestWorkspace,
createTestWorkspace,
unassignFromWorkspace
} from '@/modules/workspaces/tests/helpers/creation'
import {
buildInvitesGraphqlOperations,
TestInvitesGraphQLOperations
} from '@/modules/workspaces/tests/helpers/invites'
import type { TestInvitesGraphQLOperations } from '@/modules/workspaces/tests/helpers/invites'
import { buildInvitesGraphqlOperations } from '@/modules/workspaces/tests/helpers/invites'
import { itEach } from '@/test/assertionHelper'
import { BasicTestUser, createTestUser } from '@/test/authHelper'
import type { BasicTestUser } from '@/test/authHelper'
import { createTestUser } from '@/test/authHelper'
import {
OnWorkspaceProjectsUpdatedDocument,
OnWorkspaceUpdatedDocument,
WorkspaceProjectsUpdatedMessageType
} from '@/modules/core/graph/generated/graphql'
import {
testApolloServer,
import type {
TestApolloServer,
TestApolloSubscriptionClient,
testApolloSubscriptionServer,
TestApolloSubscriptionServer
} from '@/test/graphqlHelper'
import { testApolloServer, testApolloSubscriptionServer } from '@/test/graphqlHelper'
import { beforeEachContext, truncateTables } from '@/test/hooks'
import { captureCreatedInvite } from '@/test/speckle-helpers/inviteHelper'
import {
@@ -1,4 +1,5 @@
import { BasicTestUser, createTestUser } from '@/test/authHelper'
import type { BasicTestUser } from '@/test/authHelper'
import { createTestUser } from '@/test/authHelper'
import { createTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import {
createRandomEmail,
@@ -2,17 +2,13 @@ import {
createRandomEmail,
createRandomString
} from '@/modules/core/helpers/testHelpers'
import type { BasicTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import {
assignToWorkspace,
BasicTestWorkspace,
createTestWorkspace
} from '@/modules/workspaces/tests/helpers/creation'
import {
BasicTestUser,
createTestUser,
createTestUsers,
login
} from '@/test/authHelper'
import type { BasicTestUser } from '@/test/authHelper'
import { createTestUser, createTestUsers, login } from '@/test/authHelper'
import {
ActiveUserUpdateMutationDocument,
GetActiveUserDocument,
@@ -20,9 +16,11 @@ import {
SetUserActiveWorkspaceDocument,
UserActiveResourcesDocument
} from '@/modules/core/graph/generated/graphql'
import { testApolloServer, TestApolloServer } from '@/test/graphqlHelper'
import type { TestApolloServer } from '@/test/graphqlHelper'
import { testApolloServer } from '@/test/graphqlHelper'
import { beforeEachContext } from '@/test/hooks'
import { BasicTestStream, createTestStream } from '@/test/speckle-helpers/streamHelper'
import type { BasicTestStream } from '@/test/speckle-helpers/streamHelper'
import { createTestStream } from '@/test/speckle-helpers/streamHelper'
import { expect } from 'chai'
import cryptoRandomString from 'crypto-random-string'
@@ -16,8 +16,9 @@ import {
getWorkspaceWithDomainsFactory,
upsertWorkspaceRoleFactory
} from '@/modules/workspaces/repositories/workspaces'
import { getUserFactory, UserWithOptionalRole } from '@/modules/core/repositories/users'
import {
import type { UserWithOptionalRole } from '@/modules/core/repositories/users'
import { getUserFactory } from '@/modules/core/repositories/users'
import type {
AddOrUpdateWorkspaceRole,
CreateWorkspaceJoinRequest,
SendWorkspaceJoinRequestApprovedEmail,
@@ -31,18 +32,17 @@ import {
dismissWorkspaceJoinRequestFactory,
requestToJoinWorkspaceFactory
} from '@/modules/workspaces/services/workspaceJoinRequests'
import {
BasicTestWorkspace,
createTestWorkspace
} from '@/modules/workspaces/tests/helpers/creation'
import {
import type { BasicTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import { createTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import type {
Workspace,
WorkspaceJoinRequest,
WorkspaceWithDomains
} from '@/modules/workspacesCore/domain/types'
import { WorkspaceJoinRequests } from '@/modules/workspacesCore/helpers/db'
import { expectToThrow } from '@/test/assertionHelper'
import { BasicTestUser, createTestUser, createTestUsers } from '@/test/authHelper'
import type { BasicTestUser } from '@/test/authHelper'
import { createTestUser, createTestUsers } from '@/test/authHelper'
import { Roles } from '@speckle/shared'
import { expect } from 'chai'
import cryptoRandomString from 'crypto-random-string'
@@ -50,7 +50,7 @@ import {
createWorkspaceJoinRequestFactory,
updateWorkspaceJoinRequestStatusFactory
} from '@/modules/workspaces/repositories/workspaceJoinRequests'
import { UserEmail } from '@/modules/core/domain/userEmails/types'
import type { UserEmail } from '@/modules/core/domain/userEmails/types'
import {
findEmailsByUserIdFactory,
findVerifiedEmailsByUserIdFactory
@@ -7,24 +7,23 @@ import {
import { setStripeClient } from '@/modules/gatekeeper/clients/stripe'
import { WorkspaceSeatType } from '@/modules/gatekeeper/domain/billing'
import { getWorkspaceUserSeatFactory } from '@/modules/gatekeeper/repositories/workspaceSeat'
import type { BasicTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import {
assignToWorkspace,
BasicTestWorkspace,
createTestWorkspace
} from '@/modules/workspaces/tests/helpers/creation'
import { BasicTestUser, createTestUser, createTestUsers } from '@/test/authHelper'
import type { BasicTestUser } from '@/test/authHelper'
import { createTestUser, createTestUsers } from '@/test/authHelper'
import type { WorkspaceUpdateSeatTypeInput } from '@/modules/core/graph/generated/graphql'
import {
GetProjectCollaboratorsDocument,
UpdateWorkspaceSeatTypeDocument,
WorkspaceUpdateSeatTypeInput
UpdateWorkspaceSeatTypeDocument
} from '@/modules/core/graph/generated/graphql'
import { testApolloServer, TestApolloServer } from '@/test/graphqlHelper'
import type { TestApolloServer } from '@/test/graphqlHelper'
import { testApolloServer } from '@/test/graphqlHelper'
import { beforeEachContext } from '@/test/hooks'
import {
addToStream,
BasicTestStream,
createTestStream
} from '@/test/speckle-helpers/streamHelper'
import type { BasicTestStream } from '@/test/speckle-helpers/streamHelper'
import { addToStream, createTestStream } from '@/test/speckle-helpers/streamHelper'
import { Roles } from '@speckle/shared'
import { expect } from 'chai'
import dayjs from 'dayjs'
@@ -14,13 +14,14 @@ import {
ensureValidWorkspaceRoleSeatFactory,
getWorkspaceDefaultSeatTypeFactory
} from '@/modules/workspaces/services/workspaceSeat'
import type { BasicTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import {
assignToWorkspace,
BasicTestWorkspace,
createTestWorkspace,
unassignFromWorkspace
} from '@/modules/workspaces/tests/helpers/creation'
import { BasicTestUser, createTestUser, createTestUsers } from '@/test/authHelper'
import type { BasicTestUser } from '@/test/authHelper'
import { createTestUser, createTestUsers } from '@/test/authHelper'
import { beforeEachContext } from '@/test/hooks'
import { Roles } from '@speckle/shared'
import { expect } from 'chai'
@@ -1,19 +1,17 @@
import { expect } from 'chai'
import cryptoRandomString from 'crypto-random-string'
import type { TestApolloServer } from '@/test/graphqlHelper'
import { createTestContext, testApolloServer } from '@/test/graphqlHelper'
import type { BasicTestUser } from '@/test/authHelper'
import {
createTestContext,
testApolloServer,
TestApolloServer
} from '@/test/graphqlHelper'
import {
BasicTestUser,
buildBasicTestUser,
createAuthTokenForUser,
createTestUser,
createTestUsers,
login
} from '@/test/authHelper'
import { Roles, wait, WorkspaceRoles } from '@speckle/shared'
import type { WorkspaceRoles } from '@speckle/shared'
import { Roles, wait } from '@speckle/shared'
import {
CreateProjectInviteDocument,
CreateWorkspaceDocument,
@@ -38,15 +36,17 @@ import {
} from '@/modules/core/graph/generated/graphql'
import { beforeEachContext, truncateTables } from '@/test/hooks'
import { AllScopes } from '@/modules/core/helpers/mainConstants'
import type { BasicTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import {
assignToWorkspace,
BasicTestWorkspace,
buildBasicTestWorkspace,
createTestWorkspace,
createWorkspaceInviteDirectly
} from '@/modules/workspaces/tests/helpers/creation'
import { BasicTestCommit, createTestCommit } from '@/test/speckle-helpers/commitHelper'
import { BasicTestStream, createTestStream } from '@/test/speckle-helpers/streamHelper'
import type { BasicTestCommit } from '@/test/speckle-helpers/commitHelper'
import { createTestCommit } from '@/test/speckle-helpers/commitHelper'
import type { BasicTestStream } from '@/test/speckle-helpers/streamHelper'
import { createTestStream } from '@/test/speckle-helpers/streamHelper'
import { shuffle } from 'lodash-es'
import knex, { db } from '@/db/knex'
import {
@@ -1,7 +1,8 @@
import { db } from '@/db/knex'
import { BasicTestUser, buildBasicTestUser, createTestUser } from '@/test/authHelper'
import type { BasicTestUser } from '@/test/authHelper'
import { buildBasicTestUser, createTestUser } from '@/test/authHelper'
import type { BasicTestWorkspace } from '@/modules/workspaces/tests/helpers/creation'
import {
BasicTestWorkspace,
buildBasicTestWorkspace,
createTestWorkspace
} from '@/modules/workspaces/tests/helpers/creation'
@@ -1,4 +1,4 @@
import { UserEmail } from '@/modules/core/domain/userEmails/types'
import type { UserEmail } from '@/modules/core/domain/userEmails/types'
import {
anyEmailCompliantWithWorkspaceDomains,
isWorkspaceRole,
@@ -9,7 +9,7 @@ import {
isValidSsoSession
} from '@/modules/workspaces/domain/sso/logic'
import { WorkspaceDomainsInvalidState } from '@/modules/workspaces/errors/workspace'
import { WorkspaceDomain } from '@/modules/workspacesCore/domain/types'
import type { WorkspaceDomain } from '@/modules/workspacesCore/domain/types'
import { expectToThrow } from '@/test/assertionHelper'
import { Roles } from '@speckle/shared'
import { expect } from 'chai'
@@ -4,7 +4,7 @@ import {
buildTestWorkspaceSeat,
buildTestWorkspaceWithOptionalRole
} from '@/modules/workspaces/tests/helpers/creation'
import {
import type {
CountWorkspaceRoleWithOptionalProjectRole,
GetDefaultRegion,
GetWorkspace,
@@ -16,16 +16,14 @@ import {
buildTestWorkspacePlan,
buildTestWorkspaceSubscription
} from '@/modules/gatekeeper/tests/helpers/workspacePlan'
import {
import type {
GetWorkspacePlan,
GetWorkspaceSubscription,
WorkspaceSeatType
GetWorkspaceSubscription
} from '@/modules/gatekeeper/domain/billing'
import { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import {
buildMixpanelFake,
MixpanelFakeEventRecord
} from '@/modules/shared/test/helpers/mixpanel'
import { WorkspaceSeatType } from '@/modules/gatekeeper/domain/billing'
import type { FindEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import type { MixpanelFakeEventRecord } from '@/modules/shared/test/helpers/mixpanel'
import { buildMixpanelFake } from '@/modules/shared/test/helpers/mixpanel'
import { getFeatureFlags } from '@speckle/shared/environment'
import { GatekeeperEvents } from '@/modules/gatekeeperCore/domain/events'
import {
@@ -35,7 +33,7 @@ import {
import { expect } from 'chai'
import { WorkspacePlans, WorkspacePlanStatuses } from '@speckle/shared'
import { WorkspaceEvents } from '@/modules/workspacesCore/domain/events'
import { GetUser } from '@/modules/core/domain/users/operations'
import type { GetUser } from '@/modules/core/domain/users/operations'
import cryptoRandomString from 'crypto-random-string'
import { BillingInterval } from '@/modules/core/graph/generated/graphql'
@@ -1,6 +1,6 @@
import { WorkspaceNotFoundError } from '@/modules/workspaces/errors/workspace'
import { isUserWorkspaceDomainPolicyCompliantFactory } from '@/modules/workspaces/services/domains'
import { Workspace } from '@/modules/workspacesCore/domain/types'
import type { Workspace } from '@/modules/workspacesCore/domain/types'
import { expectToThrow } from '@/test/assertionHelper'
import { expect } from 'chai'
import cryptoRandomString from 'crypto-random-string'
@@ -1,10 +1,10 @@
import {
import type {
Workspace,
WorkspaceAcl,
WorkspaceDomain,
WorkspaceSeatType,
WorkspaceWithDomains
} from '@/modules/workspacesCore/domain/types'
import { WorkspaceSeatType } from '@/modules/workspacesCore/domain/types'
import {
addDomainToWorkspaceFactory,
createWorkspaceFactory,
@@ -17,11 +17,9 @@ import {
import { Roles, validateWorkspaceSlug } from '@speckle/shared'
import { expect } from 'chai'
import cryptoRandomString from 'crypto-random-string'
import {
WorkspaceEvents,
WorkspaceEventsPayloads
} from '@/modules/workspacesCore/domain/events'
import { StreamAclRecord, StreamRecord } from '@/modules/core/helpers/types'
import type { WorkspaceEventsPayloads } from '@/modules/workspacesCore/domain/events'
import { WorkspaceEvents } from '@/modules/workspacesCore/domain/events'
import type { StreamAclRecord, StreamRecord } from '@/modules/core/helpers/types'
import { expectToThrow } from '@/test/assertionHelper'
import { createRandomPassword } from '@/modules/core/helpers/testHelpers'
import {
@@ -34,13 +32,13 @@ import {
WorkspaceSlugTakenError,
WorkspaceUnverifiedDomainError
} from '@/modules/workspaces/errors/workspace'
import { UserEmail } from '@/modules/core/domain/userEmails/types'
import type { UserEmail } from '@/modules/core/domain/userEmails/types'
import { merge, omit } from 'lodash-es'
import {
import type {
GetWorkspaceWithDomains,
UpsertWorkspaceArgs
} from '@/modules/workspaces/domain/operations'
import { FindVerifiedEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
import type { FindVerifiedEmailsByUserId } from '@/modules/core/domain/userEmails/operations'
type WorkspaceTestContext = {
storedWorkspaces: UpsertWorkspaceArgs['workspace'][]
@@ -1,21 +1,23 @@
import { ProjectTeamMember } from '@/modules/core/domain/projects/types'
import type { ProjectTeamMember } from '@/modules/core/domain/projects/types'
import { ProjectNotFoundError } from '@/modules/core/errors/projects'
import { StreamRecord } from '@/modules/core/helpers/types'
import type { StreamRecord } from '@/modules/core/helpers/types'
import { queryAllProjectsFactory } from '@/modules/core/services/projects'
import { WorkspaceSeat, WorkspaceSeatType } from '@/modules/gatekeeper/domain/billing'
import type { WorkspaceSeat } from '@/modules/gatekeeper/domain/billing'
import { WorkspaceSeatType } from '@/modules/gatekeeper/domain/billing'
import { WorkspaceInvalidProjectError } from '@/modules/workspaces/errors/workspace'
import { moveProjectToWorkspaceFactory } from '@/modules/workspaces/services/projects'
import {
import type {
Workspace,
WorkspaceAcl,
WorkspaceDomain
} from '@/modules/workspacesCore/domain/types'
import { expectToThrow } from '@/test/assertionHelper'
import { ProjectUpdateRoleInput } from '@/modules/core/graph/generated/graphql'
import { Roles, StreamRoles, WorkspaceRoles } from '@speckle/shared'
import type { ProjectUpdateRoleInput } from '@/modules/core/graph/generated/graphql'
import type { StreamRoles, WorkspaceRoles } from '@speckle/shared'
import { Roles } from '@speckle/shared'
import { expect } from 'chai'
import cryptoRandomString from 'crypto-random-string'
import { StreamWithOptionalRole } from '@/modules/core/repositories/streams'
import type { StreamWithOptionalRole } from '@/modules/core/repositories/streams'
describe('Project retrieval services', () => {
describe('queryAllWorkspaceProjectFactory returns a generator, that', () => {
@@ -1,8 +1,8 @@
/* eslint-disable camelcase */
import { UserEmail } from '@/modules/core/domain/userEmails/types'
import type { UserEmail } from '@/modules/core/domain/userEmails/types'
import { getDefaultSsoSessionExpirationDate } from '@/modules/workspaces/domain/sso/logic'
import {
import type {
OidcProvider,
UserSsoSessionRecord,
WorkspaceSsoProvider,
@@ -22,7 +22,7 @@ import {
saveSsoProviderRegistrationFactory,
startOidcSsoProviderValidationFactory
} from '@/modules/workspaces/services/sso'
import { Workspace } from '@/modules/workspacesCore/domain/types'
import type { Workspace } from '@/modules/workspacesCore/domain/types'
import { expectToThrow } from '@/test/assertionHelper'
import { wait } from '@speckle/shared'
import { assert, expect } from 'chai'
@@ -2,7 +2,8 @@ import {
getWorkspaceDefaultSeatTypeFactory,
isWorkspaceRoleWorkspaceSeatTypeValid
} from '@/modules/workspaces/services/workspaceSeat'
import { Workspace, WorkspaceSeatType } from '@/modules/workspacesCore/domain/types'
import type { Workspace } from '@/modules/workspacesCore/domain/types'
import { WorkspaceSeatType } from '@/modules/workspacesCore/domain/types'
import { Roles } from '@speckle/shared'
import { expect } from 'chai'
@@ -1,4 +1,4 @@
import { WorkspaceAcl } from '@/modules/workspacesCore/domain/types'
import type { WorkspaceAcl } from '@/modules/workspacesCore/domain/types'
import { expect } from 'chai'
import { Roles } from '@speckle/shared'
import { isUserLastWorkspaceAdmin } from '@/modules/workspaces/helpers/roles'