diff --git a/packages/server/app.ts b/packages/server/app.ts index 249b37f09..6713a4ee1 100644 --- a/packages/server/app.ts +++ b/packages/server/app.ts @@ -32,7 +32,7 @@ import type { ConnectionContext, ExecutionParams } from 'subscriptions-transport import { SubscriptionServer } from 'subscriptions-transport-ws' import { execute, subscribe } from 'graphql' -import knex from '@/db/knex' +import knex, { db } from '@/db/knex' import { monitorActiveConnections } from '@/logging/httpServerMonitoring' import { buildErrorFormatter } from '@/modules/core/graph/setup' import { @@ -64,7 +64,7 @@ import { statusCodePlugin } from '@/modules/core/graph/plugins/statusCode' import { BaseError, ForbiddenError } from '@/modules/shared/errors' import { loggingPlugin } from '@/modules/core/graph/plugins/logging' import { shouldLogAsInfoLevel } from '@/logging/graphqlError' -import { getUser } from '@/modules/core/repositories/users' +import { getUserFactory } from '@/modules/core/repositories/users' const GRAPHQL_PATH = '/graphql' @@ -385,7 +385,8 @@ export async function init() { next() } ) - if (enableMixpanel()) app.use(mixpanelTrackerHelperMiddlewareFactory({ getUser })) + if (enableMixpanel()) + app.use(mixpanelTrackerHelperMiddlewareFactory({ getUser: getUserFactory({ db }) })) // Initialize default modules, including rest api handlers await ModulesSetup.init(app) diff --git a/packages/server/modules/accessrequests/graph/resolvers/index.ts b/packages/server/modules/accessrequests/graph/resolvers/index.ts index ef23446f5..f0935f8a9 100644 --- a/packages/server/modules/accessrequests/graph/resolvers/index.ts +++ b/packages/server/modules/accessrequests/graph/resolvers/index.ts @@ -29,7 +29,7 @@ import { getStreamFactory, grantStreamPermissionsFactory } from '@/modules/core/repositories/streams' -import { getUser } from '@/modules/core/repositories/users' +import { getUserFactory } from '@/modules/core/repositories/users' import { addOrUpdateStreamCollaboratorFactory, validateStreamAccessFactory @@ -38,6 +38,7 @@ import { authorizeResolver } from '@/modules/shared' import { LogicError } from '@/modules/shared/errors' import { publish } from '@/modules/shared/utils/subscriptions' +const getUser = getUserFactory({ db }) const getStream = getStreamFactory({ db }) const getUserProjectAccessRequest = getUserProjectAccessRequestFactory({ getUsersPendingAccessRequest: getUsersPendingAccessRequestFactory({ db }) diff --git a/packages/server/modules/accessrequests/tests/projectAccessRequests.spec.ts b/packages/server/modules/accessrequests/tests/projectAccessRequests.spec.ts index 0371b7ebd..edb8a658e 100644 --- a/packages/server/modules/accessrequests/tests/projectAccessRequests.spec.ts +++ b/packages/server/modules/accessrequests/tests/projectAccessRequests.spec.ts @@ -33,7 +33,7 @@ import { grantStreamPermissionsFactory, revokeStreamPermissionsFactory } from '@/modules/core/repositories/streams' -import { getUser } from '@/modules/core/repositories/users' +import { getUserFactory } from '@/modules/core/repositories/users' import { addOrUpdateStreamCollaboratorFactory, isStreamCollaboratorFactory, @@ -64,6 +64,7 @@ import { BasicTestStream, createTestStreams } from '@/test/speckle-helpers/strea import { expect } from 'chai' import { noop } from 'lodash' +const getUser = getUserFactory({ db }) const getStream = getStreamFactory({ db }) const getStreamCollaborators = getStreamCollaboratorsFactory({ db }) const requestProjectAccess = requestProjectAccessFactory({ diff --git a/packages/server/modules/accessrequests/tests/streamAccessRequests.spec.ts b/packages/server/modules/accessrequests/tests/streamAccessRequests.spec.ts index 43962701a..863c70c01 100644 --- a/packages/server/modules/accessrequests/tests/streamAccessRequests.spec.ts +++ b/packages/server/modules/accessrequests/tests/streamAccessRequests.spec.ts @@ -35,7 +35,7 @@ import { grantStreamPermissionsFactory, revokeStreamPermissionsFactory } from '@/modules/core/repositories/streams' -import { getUser } from '@/modules/core/repositories/users' +import { getUserFactory } from '@/modules/core/repositories/users' import { addOrUpdateStreamCollaboratorFactory, isStreamCollaboratorFactory, @@ -66,6 +66,7 @@ import { BasicTestStream, createTestStreams } from '@/test/speckle-helpers/strea import { expect } from 'chai' import { noop } from 'lodash' +const getUser = getUserFactory({ db }) const getStreamCollaborators = getStreamCollaboratorsFactory({ db }) const getStream = getStreamFactory({ db }) const requestStreamAccess = requestStreamAccessFactory({ diff --git a/packages/server/modules/activitystream/repositories/index.ts b/packages/server/modules/activitystream/repositories/index.ts index e801e052d..08f691799 100644 --- a/packages/server/modules/activitystream/repositories/index.ts +++ b/packages/server/modules/activitystream/repositories/index.ts @@ -19,11 +19,11 @@ import { StreamAcl, StreamActivity } from '@/modules/core/dbSchema' import { Roles } from '@/modules/core/helpers/mainConstants' import { StreamAclRecord } from '@/modules/core/helpers/types' import { getServerInfo } from '@/modules/core/services/generic' -import { getUser } from '@/modules/core/repositories/users' import { createWebhookEventFactory } from '@/modules/webhooks/repositories/webhooks' import { dispatchStreamEventFactory } from '@/modules/webhooks/services/webhooks' import { Knex } from 'knex' import { getStreamFactory } from '@/modules/core/repositories/streams' +import { getUserFactory } from '@/modules/core/repositories/users' const tables = { streamActivity: (db: Knex) => @@ -255,7 +255,7 @@ export const saveActivityFactory = getServerInfo, getStream: getStreamFactory({ db }), createWebhookEvent: createWebhookEventFactory({ db }), - getUser + getUser: getUserFactory({ db }) })({ streamId, event: actionType, diff --git a/packages/server/modules/activitystream/services/summary.ts b/packages/server/modules/activitystream/services/summary.ts index c2d106848..ef777b10a 100644 --- a/packages/server/modules/activitystream/services/summary.ts +++ b/packages/server/modules/activitystream/services/summary.ts @@ -2,21 +2,23 @@ import { NotificationPublisher, NotificationType } from '@/modules/notifications/helpers/types' -import { getUser } from '@/modules/core/repositories/users' import { CreateActivitySummary, GetActiveUserStreams, GetActivity } from '@/modules/activitystream/domain/operations' import { GetStream } from '@/modules/core/domain/streams/operations' +import { GetUser } from '@/modules/core/domain/users/operations' export const createActivitySummaryFactory = ({ getStream, - getActivity + getActivity, + getUser }: { getStream: GetStream getActivity: GetActivity + getUser: GetUser }): CreateActivitySummary => async ({ userId, diff --git a/packages/server/modules/activitystream/tests/activity.spec.js b/packages/server/modules/activitystream/tests/activity.spec.js index 9e0c7425d..0806949c2 100644 --- a/packages/server/modules/activitystream/tests/activity.spec.js +++ b/packages/server/modules/activitystream/tests/activity.spec.js @@ -19,14 +19,15 @@ const { addOrUpdateStreamCollaboratorFactory } = require('@/modules/core/services/streams/access') const { authorizeResolver } = require('@/modules/shared') -const { getUser } = require('@/modules/core/repositories/users') const { grantStreamPermissionsFactory } = require('@/modules/core/repositories/streams') const { addStreamInviteAcceptedActivityFactory, addStreamPermissionsAddedActivityFactory } = require('@/modules/activitystream/services/streamActivity') const { publish } = require('@/modules/shared/utils/subscriptions') +const { getUserFactory } = require('@/modules/core/repositories/users') +const getUser = getUserFactory({ db }) const getUserActivity = getUserActivityFactory({ db }) const saveActivity = saveActivityFactory({ db }) const validateStreamAccess = validateStreamAccessFactory({ authorizeResolver }) diff --git a/packages/server/modules/activitystream/tests/activitySummary.spec.ts b/packages/server/modules/activitystream/tests/activitySummary.spec.ts index 559165f10..7e73e1758 100644 --- a/packages/server/modules/activitystream/tests/activitySummary.spec.ts +++ b/packages/server/modules/activitystream/tests/activitySummary.spec.ts @@ -36,21 +36,24 @@ import { import { collectAndValidateCoreTargetsFactory } from '@/modules/serverinvites/services/coreResourceCollection' import { buildCoreInviteEmailContentsFactory } from '@/modules/serverinvites/services/coreEmailContents' import { getEventBus } from '@/modules/shared/services/eventBus' -import { getUsers } from '@/modules/core/repositories/users' import { addStreamCreatedActivityFactory } from '@/modules/activitystream/services/streamActivity' import { ProjectsEmitter } from '@/modules/core/events/projectsEmitter' import { createBranchFactory } from '@/modules/core/repositories/branches' import { publish } from '@/modules/shared/utils/subscriptions' +import { getUserFactory, getUsersFactory } from '@/modules/core/repositories/users' const cleanup = async () => { await truncateTables([StreamActivity.name, Users.name]) } +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const getStream = getStreamFactory({ db }) const saveActivity = saveActivityFactory({ db }) const createActivitySummary = createActivitySummaryFactory({ getStream, - getActivity: getActivityFactory({ db }) + getActivity: getActivityFactory({ db }), + getUser }) const addStreamCreatedActivity = addStreamCreatedActivityFactory({ saveActivity: saveActivityFactory({ db }), @@ -60,7 +63,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -72,7 +75,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/auth/services/mailchimp.ts b/packages/server/modules/auth/services/mailchimp.ts index db1de6b97..e2341a4b9 100644 --- a/packages/server/modules/auth/services/mailchimp.ts +++ b/packages/server/modules/auth/services/mailchimp.ts @@ -2,7 +2,6 @@ import mailchimp from '@mailchimp/mailchimp_marketing' import { md5 } from '@/modules/shared/helpers/cryptoHelper' import { getMailchimpConfig } from '@/modules/shared/helpers/envHelper' -// import { getUserById } from '@/modules/core/services/users' import { UserRecord } from '@/modules/core/helpers/types' let mailchimpInitialized = false diff --git a/packages/server/modules/auth/tests/auth.spec.js b/packages/server/modules/auth/tests/auth.spec.js index 5efae8808..00debf94f 100644 --- a/packages/server/modules/auth/tests/auth.spec.js +++ b/packages/server/modules/auth/tests/auth.spec.js @@ -37,7 +37,6 @@ const { buildCoreInviteEmailContentsFactory } = require('@/modules/serverinvites/services/coreEmailContents') const { getEventBus } = require('@/modules/shared/services/eventBus') -const { getUsers } = require('@/modules/core/repositories/users') const { createBranchFactory } = require('@/modules/core/repositories/branches') const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter') const { @@ -45,7 +44,10 @@ const { } = require('@/modules/activitystream/services/streamActivity') const { saveActivityFactory } = require('@/modules/activitystream/repositories') const { publish } = require('@/modules/shared/utils/subscriptions') +const { getUsersFactory, getUserFactory } = require('@/modules/core/repositories/users') +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const addStreamCreatedActivity = addStreamCreatedActivityFactory({ saveActivity: saveActivityFactory({ db }), publish @@ -57,7 +59,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -69,7 +71,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/automate/graph/resolvers/automate.ts b/packages/server/modules/automate/graph/resolvers/automate.ts index 198fad66b..493926ffa 100644 --- a/packages/server/modules/automate/graph/resolvers/automate.ts +++ b/packages/server/modules/automate/graph/resolvers/automate.ts @@ -53,7 +53,6 @@ import { AutomateRunTriggerType } from '@/modules/core/graph/generated/graphql' import { getGenericRedis } from '@/modules/core/index' -import { getUser } from '@/modules/core/repositories/users' import { createAutomation as clientCreateAutomation } from '@/modules/automate/clients/executionEngine' import { Automate, Roles, isNullOrUndefined, isNonNullable } from '@speckle/shared' import { getFeatureFlags, getServerOrigin } from '@/modules/shared/helpers/envHelper' @@ -110,9 +109,11 @@ import { AutomateRunsEmitter } from '@/modules/automate/events/runs' import { createAppToken } from '@/modules/core/services/tokens' import { getCommitFactory } from '@/modules/core/repositories/commits' import { validateStreamAccessFactory } from '@/modules/core/services/streams/access' +import { getUserFactory } from '@/modules/core/repositories/users' const { FF_AUTOMATE_MODULE_ENABLED } = getFeatureFlags() +const getUser = getUserFactory({ db }) const storeAutomation = storeAutomationFactory({ db }) const storeAutomationToken = storeAutomationTokenFactory({ db }) const storeAutomationRevision = storeAutomationRevisionFactory({ db }) diff --git a/packages/server/modules/automate/services/functionManagement.ts b/packages/server/modules/automate/services/functionManagement.ts index 00800a8ce..cd2ac398b 100644 --- a/packages/server/modules/automate/services/functionManagement.ts +++ b/packages/server/modules/automate/services/functionManagement.ts @@ -16,7 +16,6 @@ import { CreateAutomateFunctionInput, AutomateFunctionTemplateLanguage } from '@/modules/core/graph/generated/graphql' -import { getUser } from '@/modules/core/repositories/users' import { MaybeNullOrUndefined, Nullable, @@ -46,6 +45,7 @@ import { import { getFunctionsMarketplaceUrl } from '@/modules/core/helpers/routeHelper' import { automateLogger } from '@/logging/logging' import { CreateStoredAuthCode } from '@/modules/automate/domain/operations' +import { GetUser } from '@/modules/core/domain/users/operations' const mapGqlTemplateIdToExecEngineTemplateId = ( id: AutomateFunctionTemplateLanguage @@ -119,7 +119,7 @@ export const convertFunctionReleaseToGraphQLReturn = ( export type CreateFunctionDeps = { createStoredAuthCode: CreateStoredAuthCode createExecutionEngineFn: typeof createFunction - getUser: typeof getUser + getUser: GetUser } export const createFunctionFromTemplateFactory = diff --git a/packages/server/modules/automate/tests/automations.spec.ts b/packages/server/modules/automate/tests/automations.spec.ts index d57669cb2..7fdd7ffab 100644 --- a/packages/server/modules/automate/tests/automations.spec.ts +++ b/packages/server/modules/automate/tests/automations.spec.ts @@ -48,7 +48,6 @@ import { validateStreamAccessFactory } from '@/modules/core/services/streams/access' import { authorizeResolver } from '@/modules/shared' -import { getUser } from '@/modules/core/repositories/users' import { grantStreamPermissionsFactory } from '@/modules/core/repositories/streams' import { addStreamInviteAcceptedActivityFactory, @@ -56,6 +55,7 @@ import { } from '@/modules/activitystream/services/streamActivity' import { saveActivityFactory } from '@/modules/activitystream/repositories' import { publish } from '@/modules/shared/utils/subscriptions' +import { getUserFactory } from '@/modules/core/repositories/users' /** * TODO: Extra test ideas @@ -65,6 +65,7 @@ import { publish } from '@/modules/shared/utils/subscriptions' const { FF_AUTOMATE_MODULE_ENABLED } = getFeatureFlags() +const getUser = getUserFactory({ db }) const saveActivity = saveActivityFactory({ db }) const validateStreamAccess = validateStreamAccessFactory({ authorizeResolver }) const addOrUpdateStreamCollaborator = addOrUpdateStreamCollaboratorFactory({ diff --git a/packages/server/modules/blobstorage/tests/blobstorage.graph.spec.js b/packages/server/modules/blobstorage/tests/blobstorage.graph.spec.js index 68f82035b..303244843 100644 --- a/packages/server/modules/blobstorage/tests/blobstorage.graph.spec.js +++ b/packages/server/modules/blobstorage/tests/blobstorage.graph.spec.js @@ -32,7 +32,6 @@ const { buildCoreInviteEmailContentsFactory } = require('@/modules/serverinvites/services/coreEmailContents') const { getEventBus } = require('@/modules/shared/services/eventBus') -const { getUsers } = require('@/modules/core/repositories/users') const { createBranchFactory } = require('@/modules/core/repositories/branches') const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter') const { @@ -40,7 +39,10 @@ const { } = require('@/modules/activitystream/services/streamActivity') const { saveActivityFactory } = require('@/modules/activitystream/repositories') const { publish } = require('@/modules/shared/utils/subscriptions') +const { getUsersFactory, getUserFactory } = require('@/modules/core/repositories/users') +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const addStreamCreatedActivity = addStreamCreatedActivityFactory({ saveActivity: saveActivityFactory({ db }), publish @@ -50,7 +52,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -62,7 +64,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/blobstorage/tests/blobstorage.integration.spec.js b/packages/server/modules/blobstorage/tests/blobstorage.integration.spec.js index a33f7e6bc..00ae31018 100644 --- a/packages/server/modules/blobstorage/tests/blobstorage.integration.spec.js +++ b/packages/server/modules/blobstorage/tests/blobstorage.integration.spec.js @@ -31,7 +31,6 @@ const { buildCoreInviteEmailContentsFactory } = require('@/modules/serverinvites/services/coreEmailContents') const { getEventBus } = require('@/modules/shared/services/eventBus') -const { getUsers } = require('@/modules/core/repositories/users') const { createBranchFactory } = require('@/modules/core/repositories/branches') const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter') const { @@ -39,7 +38,10 @@ const { } = require('@/modules/activitystream/services/streamActivity') const { saveActivityFactory } = require('@/modules/activitystream/repositories') const { publish } = require('@/modules/shared/utils/subscriptions') +const { getUsersFactory, getUserFactory } = require('@/modules/core/repositories/users') +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const addStreamCreatedActivity = addStreamCreatedActivityFactory({ saveActivity: saveActivityFactory({ db }), publish @@ -49,7 +51,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -61,7 +63,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/cli/commands/db/seed/commits.ts b/packages/server/modules/cli/commands/db/seed/commits.ts index 184d6b1a4..37733566a 100644 --- a/packages/server/modules/cli/commands/db/seed/commits.ts +++ b/packages/server/modules/cli/commands/db/seed/commits.ts @@ -1,7 +1,7 @@ import { db } from '@/db/knex' import { cliLogger } from '@/logging/logging' import { getStreamFactory } from '@/modules/core/repositories/streams' -import { getUser } from '@/modules/core/repositories/users' +import { getUserFactory } from '@/modules/core/repositories/users' import { BasicTestCommit, createTestCommits } from '@/test/speckle-helpers/commitHelper' import dayjs from 'dayjs' import { times } from 'lodash' @@ -29,6 +29,7 @@ const command: CommandModule< } }, handler: async (argv) => { + const getUser = getUserFactory({ db }) const getStream = getStreamFactory({ db }) const count = argv.count diff --git a/packages/server/modules/cli/commands/download/commit.ts b/packages/server/modules/cli/commands/download/commit.ts index 994a356af..a91bd8d63 100644 --- a/packages/server/modules/cli/commands/download/commit.ts +++ b/packages/server/modules/cli/commands/download/commit.ts @@ -13,7 +13,6 @@ import { getStreamBranchesByNameFactory, markCommitBranchUpdatedFactory } from '@/modules/core/repositories/branches' -import { getUser } from '@/modules/core/repositories/users' import { createObject } from '@/modules/core/services/objects' import { getObjectFactory, @@ -54,6 +53,7 @@ import { VersionsEmitter } from '@/modules/core/events/versionsEmitter' import { addCommitCreatedActivityFactory } from '@/modules/activitystream/services/commitActivity' import { saveActivityFactory } from '@/modules/activitystream/repositories' import { publish } from '@/modules/shared/utils/subscriptions' +import { getUserFactory } from '@/modules/core/repositories/users' const command: CommandModule< unknown, @@ -149,6 +149,7 @@ const command: CommandModule< }) }) + const getUser = getUserFactory({ db }) const getStreamCollaborators = getStreamCollaboratorsFactory({ db }) const downloadCommit = downloadCommitFactory({ getStream, diff --git a/packages/server/modules/cli/commands/download/project.ts b/packages/server/modules/cli/commands/download/project.ts index 6ab5f5d39..33af01bf0 100644 --- a/packages/server/modules/cli/commands/download/project.ts +++ b/packages/server/modules/cli/commands/download/project.ts @@ -16,7 +16,6 @@ import { getStreamBranchesByNameFactory, markCommitBranchUpdatedFactory } from '@/modules/core/repositories/branches' -import { getUser, getUsers } from '@/modules/core/repositories/users' import { createCommitByBranchIdFactory } from '@/modules/core/services/commit/management' import { createObject } from '@/modules/core/services/objects' import { @@ -71,6 +70,7 @@ import { addStreamCreatedActivityFactory } from '@/modules/activitystream/servic import { saveActivityFactory } from '@/modules/activitystream/repositories' import { publish } from '@/modules/shared/utils/subscriptions' import { addCommitCreatedActivityFactory } from '@/modules/activitystream/services/commitActivity' +import { getUserFactory, getUsersFactory } from '@/modules/core/repositories/users' const command: CommandModule< unknown, @@ -158,10 +158,12 @@ const command: CommandModule< }) }) + const getUser = getUserFactory({ db }) + const getUsers = getUsersFactory({ db }) const createStreamReturnRecord = createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -173,7 +175,8 @@ const command: CommandModule< getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/cli/commands/stream/clone.ts b/packages/server/modules/cli/commands/stream/clone.ts index 7be5281d8..44d66e2fc 100644 --- a/packages/server/modules/cli/commands/stream/clone.ts +++ b/packages/server/modules/cli/commands/stream/clone.ts @@ -23,7 +23,7 @@ import { createStreamFactory, getStreamFactory } from '@/modules/core/repositories/streams' -import { getUser } from '@/modules/core/repositories/users' +import { getUserFactory } from '@/modules/core/repositories/users' import { cloneStreamFactory } from '@/modules/core/services/streams/clone' import { publish } from '@/modules/shared/utils/subscriptions' import { CommandModule } from 'yargs' @@ -46,6 +46,8 @@ const command: CommandModule< }, handler: async (argv) => { const { sourceStreamId, targetUserId } = argv + + const getUser = getUserFactory({ db }) const cloneStream = cloneStreamFactory({ getStream: getStreamFactory({ db }), getUser, diff --git a/packages/server/modules/comments/tests/comments.graph.spec.js b/packages/server/modules/comments/tests/comments.graph.spec.js index c68393c99..21c074ce6 100644 --- a/packages/server/modules/comments/tests/comments.graph.spec.js +++ b/packages/server/modules/comments/tests/comments.graph.spec.js @@ -78,7 +78,6 @@ const { buildCoreInviteEmailContentsFactory } = require('@/modules/serverinvites/services/coreEmailContents') const { getEventBus } = require('@/modules/shared/services/eventBus') -const { getUsers } = require('@/modules/core/repositories/users') const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter') const { addStreamCreatedActivityFactory @@ -88,7 +87,10 @@ const { publish } = require('@/modules/shared/utils/subscriptions') const { addCommitCreatedActivityFactory } = require('@/modules/activitystream/services/commitActivity') +const { getUsersFactory, getUserFactory } = require('@/modules/core/repositories/users') +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const markCommitStreamUpdated = markCommitStreamUpdatedFactory({ db }) const streamResourceCheck = streamResourceCheckFactory({ checkStreamResourceAccess: checkStreamResourceAccessFactory({ db }) @@ -137,7 +139,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -149,7 +151,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/comments/tests/comments.spec.js b/packages/server/modules/comments/tests/comments.spec.js index 7280b65eb..1c97dd48d 100644 --- a/packages/server/modules/comments/tests/comments.spec.js +++ b/packages/server/modules/comments/tests/comments.spec.js @@ -97,7 +97,6 @@ const { buildCoreInviteEmailContentsFactory } = require('@/modules/serverinvites/services/coreEmailContents') const { getEventBus } = require('@/modules/shared/services/eventBus') -const { getUsers } = require('@/modules/core/repositories/users') const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter') const { addStreamCreatedActivityFactory @@ -107,7 +106,10 @@ const { publish } = require('@/modules/shared/utils/subscriptions') const { addCommitCreatedActivityFactory } = require('@/modules/activitystream/services/commitActivity') +const { getUsersFactory, getUserFactory } = require('@/modules/core/repositories/users') +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const getStream = getStreamFactory({ db }) const streamResourceCheck = streamResourceCheckFactory({ checkStreamResourceAccess: checkStreamResourceAccessFactory({ db }) @@ -185,7 +187,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -197,7 +199,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/core/domain/users/operations.ts b/packages/server/modules/core/domain/users/operations.ts new file mode 100644 index 000000000..24414bd24 --- /dev/null +++ b/packages/server/modules/core/domain/users/operations.ts @@ -0,0 +1,24 @@ +import { UserWithOptionalRole } from '@/modules/core/domain/users/types' +import { Nullable } from '@speckle/shared' + +export type GetUserParams = Partial<{ + /** + * Join server_acl and get user role info + */ + withRole: boolean + + /** + * Skip record sanitization. ONLY use when you wish to work with a user's password digest + */ + skipClean: boolean +}> + +export type GetUsers = ( + userIds: string | string[], + params?: GetUserParams +) => Promise + +export type GetUser = ( + userId: string, + params?: GetUserParams +) => Promise> diff --git a/packages/server/modules/core/domain/users/types.ts b/packages/server/modules/core/domain/users/types.ts new file mode 100644 index 000000000..619b22ed4 --- /dev/null +++ b/packages/server/modules/core/domain/users/types.ts @@ -0,0 +1,14 @@ +import { LimitedUserRecord, UserRecord } from '@/modules/core/helpers/userHelper' +import { ServerRoles } from '@speckle/shared' + +export type User = UserRecord +export type LimitedUser = LimitedUserRecord + +export type UserWithOptionalRole = + UserType & { + /** + * Available, if query joined this data from server_acl + * (this can be the server role or stream role depending on how and where this was retrieved) + */ + role?: ServerRoles + } diff --git a/packages/server/modules/core/graph/resolvers/projects.ts b/packages/server/modules/core/graph/resolvers/projects.ts index 696ac17cb..dea234574 100644 --- a/packages/server/modules/core/graph/resolvers/projects.ts +++ b/packages/server/modules/core/graph/resolvers/projects.ts @@ -51,7 +51,7 @@ import { getUserStreamsPageFactory, getUserStreamsCountFactory } from '@/modules/core/repositories/streams' -import { getUser, getUsers } from '@/modules/core/repositories/users' +import { getUserFactory, getUsersFactory } from '@/modules/core/repositories/users' import { getRateLimitResult, isRateLimitBreached @@ -91,13 +91,15 @@ import { } from '@/modules/shared/utils/subscriptions' import { has } from 'lodash' +const getUsers = getUsersFactory({ db }) +const getUser = getUserFactory({ db }) const saveActivity = saveActivityFactory({ db }) const getStream = getStreamFactory({ db }) const getStreamCollaborators = getStreamCollaboratorsFactory({ db }) const createStreamReturnRecord = createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -109,7 +111,8 @@ const createStreamReturnRecord = createStreamReturnRecordFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/core/graph/resolvers/streams.ts b/packages/server/modules/core/graph/resolvers/streams.ts index 689395303..35a203442 100644 --- a/packages/server/modules/core/graph/resolvers/streams.ts +++ b/packages/server/modules/core/graph/resolvers/streams.ts @@ -59,7 +59,6 @@ import { } from '@/modules/serverinvites/repositories/serverInvites' import db from '@/db/knex' import { getInvitationTargetUsersFactory } from '@/modules/serverinvites/services/retrieval' -import { getUser, getUsers } from '@/modules/core/repositories/users' import { BadRequestError, InvalidArgumentError } from '@/modules/shared/errors' import { createAndSendInviteFactory } from '@/modules/serverinvites/services/creation' import { collectAndValidateCoreTargetsFactory } from '@/modules/serverinvites/services/coreResourceCollection' @@ -87,7 +86,10 @@ import { favoriteStreamFactory, getFavoriteStreamsCollectionFactory } from '@/modules/core/services/streams/favorite' +import { getUserFactory, getUsersFactory } from '@/modules/core/repositories/users' +const getUsers = getUsersFactory({ db }) +const getUser = getUserFactory({ db }) const getFavoriteStreamsCollection = getFavoriteStreamsCollectionFactory({ getFavoritedStreamsCount: getFavoritedStreamsCountFactory({ db }), getFavoritedStreamsPage: getFavoritedStreamsPageFactory({ db }) @@ -97,7 +99,7 @@ const getStream = getStreamFactory({ db }) const createStreamReturnRecord = createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -109,7 +111,8 @@ const createStreamReturnRecord = createStreamReturnRecordFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/core/graph/resolvers/userEmails.ts b/packages/server/modules/core/graph/resolvers/userEmails.ts index bac38f0f2..49c34c34c 100644 --- a/packages/server/modules/core/graph/resolvers/userEmails.ts +++ b/packages/server/modules/core/graph/resolvers/userEmails.ts @@ -15,12 +15,13 @@ import { updateAllInviteTargetsFactory } from '@/modules/serverinvites/repositories/serverInvites' import { validateAndCreateUserEmailFactory } from '@/modules/core/services/userEmails' -import { getUser } from '@/modules/core/repositories/users' import { getServerInfo } from '@/modules/core/services/generic' import { deleteOldAndInsertNewVerificationFactory } from '@/modules/emails/repositories' import { renderEmail } from '@/modules/emails/services/emailRendering' import { sendEmail } from '@/modules/emails/services/sending' +import { getUserFactory } from '@/modules/core/repositories/users' +const getUser = getUserFactory({ db }) const requestNewEmailVerification = requestNewEmailVerificationFactory({ findEmail: findEmailFactory({ db }), getUser, diff --git a/packages/server/modules/core/loaders.ts b/packages/server/modules/core/loaders.ts index 728f883c0..2f37fc8ff 100644 --- a/packages/server/modules/core/loaders.ts +++ b/packages/server/modules/core/loaders.ts @@ -9,7 +9,6 @@ import { getUserStreamCountsFactory, getStreamsSourceAppsFactory } from '@/modules/core/repositories/streams' -import { UserWithOptionalRole, getUsers } from '@/modules/core/repositories/users' import { keyBy } from 'lodash' import { AuthContext } from '@/modules/shared/authz' import { @@ -85,6 +84,10 @@ import db from '@/db/knex' import { graphDataloadersBuilders } from '@/modules' import { getAppScopesFactory } from '@/modules/auth/repositories' import { StreamWithCommitId } from '@/modules/core/domain/streams/types' +import { + getUsersFactory, + UserWithOptionalRole +} from '@/modules/core/repositories/users' const simpleTupleCacheKey = (key: [string, string]) => `${key[0]}:${key[1]}` @@ -124,6 +127,7 @@ const getOwnedFavoritesCountByUserIds = getOwnedFavoritesCountByUserIdsFactory({ const getStreamRoles = getStreamRolesFactory({ db }) const getUserStreamCounts = getUserStreamCountsFactory({ db }) const getStreamsSourceApps = getStreamsSourceAppsFactory({ db }) +const getUsers = getUsersFactory({ db }) /** * TODO: Lazy load DataLoaders to reduce memory usage diff --git a/packages/server/modules/core/repositories/users.ts b/packages/server/modules/core/repositories/users.ts index 66bbf178d..a583c9460 100644 --- a/packages/server/modules/core/repositories/users.ts +++ b/packages/server/modules/core/repositories/users.ts @@ -1,9 +1,5 @@ import { ServerAcl, UserEmails, Users, knex } from '@/modules/core/dbSchema' -import { - LimitedUserRecord, - UserRecord, - UserWithRole -} from '@/modules/core/helpers/types' +import { UserRecord, UserWithRole } from '@/modules/core/helpers/types' import { Nullable } from '@/modules/shared/helpers/typeHelper' import { clamp, isArray, omit } from 'lodash' import { metaHelpers } from '@/modules/core/helpers/meta' @@ -13,27 +9,18 @@ import { Roles, ServerRoles } from '@speckle/shared' import { updateUserEmailFactory } from '@/modules/core/repositories/userEmails' import { db } from '@/db/knex' import { markUserEmailAsVerifiedFactory } from '@/modules/core/services/users/emailVerification' +import { UserWithOptionalRole } from '@/modules/core/domain/users/types' +import { + GetUser, + GetUserParams, + GetUsers +} from '@/modules/core/domain/users/operations' +export type { UserWithOptionalRole, GetUserParams } -export type UserWithOptionalRole = User & { - /** - * Available, if query joined this data from server_acl - * (this can be the server role or stream role depending on how and where this was retrieved) - */ - role?: ServerRoles +const tables = { + users: (db: Knex) => db(Users.name) } -export type GetUserParams = Partial<{ - /** - * Join server_acl and get user role info - */ - withRole: boolean - - /** - * Skip record sanitization. ONLY use when you wish to work with a user's password digest - */ - skipClean: boolean -}> - function sanitizeUserRecord>(user: T): T { if (!user) return user delete user.passwordDigest @@ -65,35 +52,37 @@ export const getUsersBaseQuery = ( /** * Get users by ID */ -export async function getUsers( - userIds: string | string[], - params?: GetUserParams -): Promise { - const { withRole, skipClean } = params || {} - userIds = isArray(userIds) ? userIds : [userIds] +export const getUsersFactory = + (deps: { db: Knex }): GetUsers => + async ( + userIds: string | string[], + params?: GetUserParams + ): Promise => { + const { withRole, skipClean } = params || {} + userIds = isArray(userIds) ? userIds : [userIds] - const q = Users.knex().whereIn(Users.col.id, userIds) - q.leftJoin(UserEmails.name, UserEmails.col.userId, Users.col.id).where({ - [UserEmails.col.primary]: true - }) + const q = tables.users(deps.db).whereIn(Users.col.id, userIds) + q.leftJoin(UserEmails.name, UserEmails.col.userId, Users.col.id).where({ + [UserEmails.col.primary]: true + }) - const columns: (Knex.Raw | string)[] = [ - ...Object.values(omit(Users.col, ['email', 'verified'])), - knex.raw(`(array_agg("user_emails"."email"))[1] as email`), - knex.raw(`(array_agg("user_emails"."verified"))[1] as verified`) - ] - if (withRole) { - // Getting first role from grouped results - columns.push(knex.raw(`(array_agg("server_acl"."role"))[1] as role`)) - q.leftJoin(ServerAcl.name, ServerAcl.col.userId, Users.col.id) + const columns: (Knex.Raw | string)[] = [ + ...Object.values(omit(Users.col, ['email', 'verified'])), + knex.raw(`(array_agg("user_emails"."email"))[1] as email`), + knex.raw(`(array_agg("user_emails"."verified"))[1] as verified`) + ] + if (withRole) { + // Getting first role from grouped results + columns.push(knex.raw(`(array_agg("server_acl"."role"))[1] as role`)) + q.leftJoin(ServerAcl.name, ServerAcl.col.userId, Users.col.id) + } + + q.columns(columns) + q.groupBy(Users.col.id) + + return (await q).map((u) => (skipClean ? u : sanitizeUserRecord(u))) } - q.columns(columns) - q.groupBy(Users.col.id) - - return (await q).map((u) => (skipClean ? u : sanitizeUserRecord(u))) -} - type UserQuery = { query: string | null role?: ServerRoles | null @@ -149,11 +138,13 @@ export async function countUsers(args: UserQuery): Promise { /** * Get user by ID */ -export async function getUser(userId: string, params?: GetUserParams) { - if (!userId) return null - const users = await getUsers([userId], params) - return users?.[0] || null -} +export const getUserFactory = + (deps: { db: Knex }): GetUser => + async (userId: string, params?: GetUserParams) => { + if (!userId) return null + const users = await getUsersFactory(deps)([userId], params) + return users?.[0] || null + } /** * Get user by e-mail address diff --git a/packages/server/modules/core/services/streams/access.ts b/packages/server/modules/core/services/streams/access.ts index 6279469c9..32ca4bd78 100644 --- a/packages/server/modules/core/services/streams/access.ts +++ b/packages/server/modules/core/services/streams/access.ts @@ -12,12 +12,12 @@ import { RevokeStreamPermissions, ValidateStreamAccess } from '@/modules/core/domain/streams/operations' +import { GetUser } from '@/modules/core/domain/users/operations' import { StreamAccessUpdateError, StreamInvalidAccessError } from '@/modules/core/errors/stream' import { StreamRecord } from '@/modules/core/helpers/types' -import { getUser } from '@/modules/core/repositories/users' import { AuthorizeResolver } from '@/modules/shared/domain/operations' import { BadRequestError, ForbiddenError, LogicError } from '@/modules/shared/errors' import { ensureError, Roles, StreamRoles } from '@speckle/shared' @@ -142,7 +142,7 @@ export const removeStreamCollaboratorFactory = export const addOrUpdateStreamCollaboratorFactory = (deps: { validateStreamAccess: ValidateStreamAccess - getUser: typeof getUser + getUser: GetUser grantStreamPermissions: GrantStreamPermissions addStreamInviteAcceptedActivity: ReturnType< typeof addStreamInviteAcceptedActivityFactory diff --git a/packages/server/modules/core/services/streams/clone.ts b/packages/server/modules/core/services/streams/clone.ts index 2d810b521..03027b2d3 100644 --- a/packages/server/modules/core/services/streams/clone.ts +++ b/packages/server/modules/core/services/streams/clone.ts @@ -5,7 +5,7 @@ import { UserRecord } from '@/modules/core/helpers/types' import { StreamWithOptionalRole } from '@/modules/core/repositories/streams' -import { getUser, UserWithOptionalRole } from '@/modules/core/repositories/users' +import { UserWithOptionalRole } from '@/modules/core/repositories/users' import { generateCommitId } from '@/modules/core/repositories/commits' import { chunk } from 'lodash' import { generateBranchId } from '@/modules/core/repositories/branches' @@ -42,6 +42,7 @@ import { GetBatchedStreamBranches, InsertBranches } from '@/modules/core/domain/branches/operations' +import { GetUser } from '@/modules/core/domain/users/operations' type CloneStreamInitialState = { user: UserWithOptionalRole @@ -79,7 +80,7 @@ const decrementingDateGenerator = () => { type PrepareStateDeps = { getStream: GetStream - getUser: typeof getUser + getUser: GetUser db: Knex } diff --git a/packages/server/modules/core/services/streams/onboarding.ts b/packages/server/modules/core/services/streams/onboarding.ts index 878709be3..c1ba3db46 100644 --- a/packages/server/modules/core/services/streams/onboarding.ts +++ b/packages/server/modules/core/services/streams/onboarding.ts @@ -5,7 +5,6 @@ import { } from '@/modules/core/errors/stream' import { StreamRecord } from '@/modules/core/helpers/types' import { logger } from '@/logging/logging' -import { getUser } from '@/modules/core/services/users' import { ContextResourceAccessRules, isNewResourceAllowed @@ -18,13 +17,14 @@ import { UpdateStreamRecord } from '@/modules/core/domain/streams/operations' import { GetOnboardingBaseProject } from '@/modules/cross-server-sync/domain/operations' +import { GetUser } from '@/modules/core/domain/users/operations' export const createOnboardingStreamFactory = (deps: { getOnboardingBaseProject: GetOnboardingBaseProject cloneStream: CloneStream createStreamReturnRecord: CreateStream - getUser: typeof getUser + getUser: GetUser updateStream: UpdateStreamRecord }): CreateOnboardingStream => async ( @@ -69,7 +69,7 @@ export const createOnboardingStreamFactory = logger.info('Updating onboarding stream title') const user = await deps.getUser(targetUserId) - const name = user.name.split(' ')[0] + const name = user!.name.split(' ')[0] await deps.updateStream({ id: newStream.id, name: `${name}'s First Project`, diff --git a/packages/server/modules/core/services/users.js b/packages/server/modules/core/services/users.js index a6f59e988..2bdf6a169 100644 --- a/packages/server/modules/core/services/users.js +++ b/packages/server/modules/core/services/users.js @@ -20,7 +20,7 @@ const { LIMITED_USER_FIELDS } = require('@/modules/core/helpers/userHelper') const { getUserByEmail, getUsersBaseQuery, - getUser + getUserFactory } = require('@/modules/core/repositories/users') const { UsersEmitter, UsersEvents } = require('@/modules/core/events/usersEmitter') const { pick, omit } = require('lodash') @@ -75,6 +75,7 @@ const _ensureAtleastOneAdminRemains = async (userId) => { } } +const getUser = getUserFactory({ db }) const requestNewEmailVerification = requestNewEmailVerificationFactory({ findEmail: findEmailFactory({ db }), getUser, diff --git a/packages/server/modules/core/services/users/management.ts b/packages/server/modules/core/services/users/management.ts index 38f33c232..308beede9 100644 --- a/packages/server/modules/core/services/users/management.ts +++ b/packages/server/modules/core/services/users/management.ts @@ -5,7 +5,7 @@ import { UserUpdateError, UserValidationError } from '@/modules/core/errors/user import { PasswordTooShortError } from '@/modules/core/errors/userinput' import { UserUpdateInput } from '@/modules/core/graph/generated/graphql' import type { UserRecord } from '@/modules/core/helpers/userHelper' -import { getUser, updateUser } from '@/modules/core/repositories/users' +import { getUserFactory, updateUser } from '@/modules/core/repositories/users' import { sanitizeImageUrl } from '@/modules/shared/helpers/sanitization' import { isNullOrUndefined } from '@speckle/shared' import bcrypt from 'bcrypt' @@ -13,6 +13,7 @@ import bcrypt from 'bcrypt' export const MINIMUM_PASSWORD_LENGTH = 8 export async function updateUserAndNotify(userId: string, update: UserUpdateInput) { + const getUser = getUserFactory({ db }) const existingUser = await getUser(userId) if (!existingUser) { throw new UserUpdateError('Attempting to update a non-existant user') @@ -71,6 +72,7 @@ export async function changePassword( input: { oldPassword: string; newPassword: string } ) { const { oldPassword, newPassword } = input + const getUser = getUserFactory({ db }) const user = await getUser(userId, { skipClean: true }) if (!user) { throw new UserUpdateError('Could not find the user with the specified id') diff --git a/packages/server/modules/core/tests/batchCommits.spec.ts b/packages/server/modules/core/tests/batchCommits.spec.ts index 652490794..aed43905a 100644 --- a/packages/server/modules/core/tests/batchCommits.spec.ts +++ b/packages/server/modules/core/tests/batchCommits.spec.ts @@ -10,7 +10,7 @@ import { Roles } from '@/modules/core/helpers/mainConstants' import { createBranchFactory } from '@/modules/core/repositories/branches' import { getCommitsFactory } from '@/modules/core/repositories/commits' import { grantStreamPermissionsFactory } from '@/modules/core/repositories/streams' -import { getUser } from '@/modules/core/repositories/users' +import { getUserFactory } from '@/modules/core/repositories/users' import { addOrUpdateStreamCollaboratorFactory, validateStreamAccessFactory @@ -36,6 +36,7 @@ enum BatchActionType { Delete } +const getUser = getUserFactory({ db }) const createBranch = createBranchFactory({ db }) const getCommits = getCommitsFactory({ db }) const saveActivity = saveActivityFactory({ db }) diff --git a/packages/server/modules/core/tests/branches.spec.js b/packages/server/modules/core/tests/branches.spec.js index 42d356c5c..4ac0aec6d 100644 --- a/packages/server/modules/core/tests/branches.spec.js +++ b/packages/server/modules/core/tests/branches.spec.js @@ -67,7 +67,6 @@ const { buildCoreInviteEmailContentsFactory } = require('@/modules/serverinvites/services/coreEmailContents') const { getEventBus } = require('@/modules/shared/services/eventBus') -const { getUsers } = require('@/modules/core/repositories/users') const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter') const { addStreamCreatedActivityFactory @@ -77,10 +76,13 @@ const { publish } = require('@/modules/shared/utils/subscriptions') const { addCommitCreatedActivityFactory } = require('@/modules/activitystream/services/commitActivity') +const { getUsersFactory, getUserFactory } = require('@/modules/core/repositories/users') const db = knex const Commits = () => knex('commits') +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const markCommitStreamUpdated = markCommitStreamUpdatedFactory({ db }) const markBranchStreamUpdated = markBranchStreamUpdatedFactory({ db }) const getStream = getStreamFactory({ db: knex }) @@ -131,7 +133,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -143,7 +145,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/core/tests/commits.spec.js b/packages/server/modules/core/tests/commits.spec.js index ca78612d2..bc7f3a921 100644 --- a/packages/server/modules/core/tests/commits.spec.js +++ b/packages/server/modules/core/tests/commits.spec.js @@ -76,14 +76,16 @@ const { buildCoreInviteEmailContentsFactory } = require('@/modules/serverinvites/services/coreEmailContents') const { getEventBus } = require('@/modules/shared/services/eventBus') -const { getUsers } = require('@/modules/core/repositories/users') const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter') const { addStreamCreatedActivityFactory } = require('@/modules/activitystream/services/streamActivity') const { saveActivityFactory } = require('@/modules/activitystream/repositories') const { publish } = require('@/modules/shared/utils/subscriptions') +const { getUsersFactory, getUserFactory } = require('@/modules/core/repositories/users') +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const markCommitStreamUpdated = markCommitStreamUpdatedFactory({ db }) const getCommitStream = getCommitStreamFactory({ db }) const getStream = getStreamFactory({ db }) @@ -149,7 +151,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -161,7 +163,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/core/tests/commitsGraphql.spec.ts b/packages/server/modules/core/tests/commitsGraphql.spec.ts index a6fae0163..02d7bf1f8 100644 --- a/packages/server/modules/core/tests/commitsGraphql.spec.ts +++ b/packages/server/modules/core/tests/commitsGraphql.spec.ts @@ -8,7 +8,7 @@ import { import { Commits, Streams, Users } from '@/modules/core/dbSchema' import { Roles } from '@/modules/core/helpers/mainConstants' import { grantStreamPermissionsFactory } from '@/modules/core/repositories/streams' -import { getUser } from '@/modules/core/repositories/users' +import { getUserFactory } from '@/modules/core/repositories/users' import { addOrUpdateStreamCollaboratorFactory, validateStreamAccessFactory @@ -24,6 +24,7 @@ import { createTestCommit } from '@/test/speckle-helpers/commitHelper' import { BasicTestStream, createTestStreams } from '@/test/speckle-helpers/streamHelper' import { expect } from 'chai' +const getUser = getUserFactory({ db }) const saveActivity = saveActivityFactory({ db }) const validateStreamAccess = validateStreamAccessFactory({ authorizeResolver }) const addOrUpdateStreamCollaborator = addOrUpdateStreamCollaboratorFactory({ diff --git a/packages/server/modules/core/tests/favoriteStreams.spec.js b/packages/server/modules/core/tests/favoriteStreams.spec.js index 909eb3c89..b85f1ba2e 100644 --- a/packages/server/modules/core/tests/favoriteStreams.spec.js +++ b/packages/server/modules/core/tests/favoriteStreams.spec.js @@ -38,7 +38,6 @@ const { buildCoreInviteEmailContentsFactory } = require('@/modules/serverinvites/services/coreEmailContents') const { getEventBus } = require('@/modules/shared/services/eventBus') -const { getUsers } = require('@/modules/core/repositories/users') const { createBranchFactory } = require('@/modules/core/repositories/branches') const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter') const { @@ -46,7 +45,10 @@ const { } = require('@/modules/activitystream/services/streamActivity') const { saveActivityFactory } = require('@/modules/activitystream/repositories') const { publish } = require('@/modules/shared/utils/subscriptions') +const { getUsersFactory, getUserFactory } = require('@/modules/core/repositories/users') +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const addStreamCreatedActivity = addStreamCreatedActivityFactory({ saveActivity: saveActivityFactory({ db }), publish @@ -56,7 +58,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -68,7 +70,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/core/tests/generic.spec.js b/packages/server/modules/core/tests/generic.spec.js index 72d799d3c..d907f79ac 100644 --- a/packages/server/modules/core/tests/generic.spec.js +++ b/packages/server/modules/core/tests/generic.spec.js @@ -43,7 +43,6 @@ const { buildCoreInviteEmailContentsFactory } = require('@/modules/serverinvites/services/coreEmailContents') const { getEventBus } = require('@/modules/shared/services/eventBus') -const { getUsers } = require('@/modules/core/repositories/users') const { createBranchFactory } = require('@/modules/core/repositories/branches') const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter') const { @@ -51,7 +50,10 @@ const { } = require('@/modules/activitystream/services/streamActivity') const { saveActivityFactory } = require('@/modules/activitystream/repositories') const { publish } = require('@/modules/shared/utils/subscriptions') +const { getUsersFactory, getUserFactory } = require('@/modules/core/repositories/users') +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const addStreamCreatedActivity = addStreamCreatedActivityFactory({ saveActivity: saveActivityFactory({ db }), publish @@ -61,7 +63,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -73,7 +75,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/core/tests/graph.spec.js b/packages/server/modules/core/tests/graph.spec.js index cd65ad3c8..a62e24049 100644 --- a/packages/server/modules/core/tests/graph.spec.js +++ b/packages/server/modules/core/tests/graph.spec.js @@ -33,8 +33,9 @@ const { addStreamPermissionsAddedActivityFactory } = require('@/modules/activitystream/services/streamActivity') const { publish } = require('@/modules/shared/utils/subscriptions') -const { getUser } = require('@/modules/core/repositories/users') +const { getUserFactory } = require('@/modules/core/repositories/users') +const getUser = getUserFactory({ db }) const getStream = getStreamFactory({ db }) const saveActivity = saveActivityFactory({ db }) const validateStreamAccess = validateStreamAccessFactory({ authorizeResolver }) diff --git a/packages/server/modules/core/tests/graphSubs.spec.js b/packages/server/modules/core/tests/graphSubs.spec.js index 9e157631f..6770fcadf 100644 --- a/packages/server/modules/core/tests/graphSubs.spec.js +++ b/packages/server/modules/core/tests/graphSubs.spec.js @@ -22,17 +22,18 @@ const { addOrUpdateStreamCollaboratorFactory } = require('@/modules/core/services/streams/access') const { authorizeResolver } = require('@/modules/shared') -const { getUser } = require('@/modules/core/repositories/users') const { grantStreamPermissionsFactory } = require('@/modules/core/repositories/streams') const { addStreamInviteAcceptedActivityFactory, addStreamPermissionsAddedActivityFactory } = require('@/modules/activitystream/services/streamActivity') const { publish } = require('@/modules/shared/utils/subscriptions') +const { getUserFactory } = require('@/modules/core/repositories/users') const saveActivity = saveActivityFactory({ db }) const validateStreamAccess = validateStreamAccessFactory({ authorizeResolver }) +const getUser = getUserFactory({ db }) const addOrUpdateStreamCollaborator = addOrUpdateStreamCollaboratorFactory({ validateStreamAccess, getUser, diff --git a/packages/server/modules/core/tests/integration/findUsers.spec.ts b/packages/server/modules/core/tests/integration/findUsers.spec.ts index fa9c922bb..57f5eeb92 100644 --- a/packages/server/modules/core/tests/integration/findUsers.spec.ts +++ b/packages/server/modules/core/tests/integration/findUsers.spec.ts @@ -7,7 +7,13 @@ import { import { updateUserEmailFactory } from '@/modules/core/repositories/userEmails' import { db } from '@/db/knex' import { expect } from 'chai' -import { getUserByEmail, getUsers, listUsers } from '@/modules/core/repositories/users' +import { + getUserByEmail, + getUsersFactory, + listUsers +} from '@/modules/core/repositories/users' + +const getUsers = getUsersFactory({ db }) describe('Find users @core', () => { describe('getUsers', () => { diff --git a/packages/server/modules/core/tests/integration/userEmails.spec.ts b/packages/server/modules/core/tests/integration/userEmails.spec.ts index 8681684a7..3a9d8aa00 100644 --- a/packages/server/modules/core/tests/integration/userEmails.spec.ts +++ b/packages/server/modules/core/tests/integration/userEmails.spec.ts @@ -4,8 +4,8 @@ import { beforeEachContext } from '@/test/hooks' import { expect } from 'chai' import { countUsers, - getUser, getUserByEmail, + getUserFactory, listUsers, markUserAsVerified } from '@/modules/core/repositories/users' @@ -42,6 +42,7 @@ import { deleteOldAndInsertNewVerificationFactory } from '@/modules/emails/repos import { renderEmail } from '@/modules/emails/services/emailRendering' import { sendEmail } from '@/modules/emails/services/sending' +const getUser = getUserFactory({ db }) const requestNewEmailVerification = requestNewEmailVerificationFactory({ findEmail: findEmailFactory({ db }), getUser, diff --git a/packages/server/modules/core/tests/objects.spec.js b/packages/server/modules/core/tests/objects.spec.js index 320c86527..afb8ed78a 100644 --- a/packages/server/modules/core/tests/objects.spec.js +++ b/packages/server/modules/core/tests/objects.spec.js @@ -44,7 +44,6 @@ const { buildCoreInviteEmailContentsFactory } = require('@/modules/serverinvites/services/coreEmailContents') const { getEventBus } = require('@/modules/shared/services/eventBus') -const { getUsers } = require('@/modules/core/repositories/users') const { createBranchFactory } = require('@/modules/core/repositories/branches') const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter') const { @@ -52,6 +51,7 @@ const { } = require('@/modules/activitystream/services/streamActivity') const { saveActivityFactory } = require('@/modules/activitystream/repositories') const { publish } = require('@/modules/shared/utils/subscriptions') +const { getUsersFactory, getUserFactory } = require('@/modules/core/repositories/users') const sampleCommit = JSON.parse(`{ "Objects": [ @@ -76,6 +76,8 @@ const sampleObject = JSON.parse(`{ "speckleType": "Tests.Polyline" }`) +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const addStreamCreatedActivity = addStreamCreatedActivityFactory({ saveActivity: saveActivityFactory({ db }), publish @@ -85,7 +87,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -97,7 +99,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/core/tests/rest.spec.js b/packages/server/modules/core/tests/rest.spec.js index fb881dc27..4c2f3dc76 100644 --- a/packages/server/modules/core/tests/rest.spec.js +++ b/packages/server/modules/core/tests/rest.spec.js @@ -37,7 +37,6 @@ const { buildCoreInviteEmailContentsFactory } = require('@/modules/serverinvites/services/coreEmailContents') const { getEventBus } = require('@/modules/shared/services/eventBus') -const { getUsers } = require('@/modules/core/repositories/users') const { createBranchFactory } = require('@/modules/core/repositories/branches') const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter') const { @@ -45,7 +44,10 @@ const { } = require('@/modules/activitystream/services/streamActivity') const { saveActivityFactory } = require('@/modules/activitystream/repositories') const { publish } = require('@/modules/shared/utils/subscriptions') +const { getUsersFactory, getUserFactory } = require('@/modules/core/repositories/users') +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const addStreamCreatedActivity = addStreamCreatedActivityFactory({ saveActivity: saveActivityFactory({ db }), publish @@ -55,7 +57,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -67,7 +69,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/core/tests/streams.spec.ts b/packages/server/modules/core/tests/streams.spec.ts index dbdda0a62..fae556278 100644 --- a/packages/server/modules/core/tests/streams.spec.ts +++ b/packages/server/modules/core/tests/streams.spec.ts @@ -80,7 +80,6 @@ import { import { collectAndValidateCoreTargetsFactory } from '@/modules/serverinvites/services/coreResourceCollection' import { buildCoreInviteEmailContentsFactory } from '@/modules/serverinvites/services/coreEmailContents' import { getEventBus } from '@/modules/shared/services/eventBus' -import { getUser, getUsers } from '@/modules/core/repositories/users' import { ProjectsEmitter } from '@/modules/core/events/projectsEmitter' import { addStreamCreatedActivityFactory, @@ -95,7 +94,10 @@ import { validateStreamAccessFactory } from '@/modules/core/services/streams/access' import { authorizeResolver } from '@/modules/shared' +import { getUserFactory, getUsersFactory } from '@/modules/core/repositories/users' +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const markCommitStreamUpdated = markCommitStreamUpdatedFactory({ db }) const markBranchStreamUpdated = markBranchStreamUpdatedFactory({ db }) const getStream = getStreamFactory({ db }) @@ -140,7 +142,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -152,7 +154,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/core/tests/users.spec.js b/packages/server/modules/core/tests/users.spec.js index 1fb07625a..0c1855b3e 100644 --- a/packages/server/modules/core/tests/users.spec.js +++ b/packages/server/modules/core/tests/users.spec.js @@ -76,7 +76,6 @@ const { buildCoreInviteEmailContentsFactory } = require('@/modules/serverinvites/services/coreEmailContents') const { getEventBus } = require('@/modules/shared/services/eventBus') -const { getUsers } = require('@/modules/core/repositories/users') const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter') const { addStreamCreatedActivityFactory @@ -86,7 +85,9 @@ const { publish } = require('@/modules/shared/utils/subscriptions') const { addCommitCreatedActivityFactory } = require('@/modules/activitystream/services/commitActivity') +const { getUsersFactory, getUserFactory } = require('@/modules/core/repositories/users') +const getUsers = getUsersFactory({ db }) const markCommitStreamUpdated = markCommitStreamUpdatedFactory({ db }) const getStream = getStreamFactory({ db }) const createBranch = createBranchFactory({ db }) @@ -122,7 +123,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -134,7 +135,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser: getUserFactory({ db }) }), getUsers }), diff --git a/packages/server/modules/core/tests/usersAdminList.spec.ts b/packages/server/modules/core/tests/usersAdminList.spec.ts index 77533b997..63f440a63 100644 --- a/packages/server/modules/core/tests/usersAdminList.spec.ts +++ b/packages/server/modules/core/tests/usersAdminList.spec.ts @@ -28,16 +28,18 @@ import { import { collectAndValidateCoreTargetsFactory } from '@/modules/serverinvites/services/coreResourceCollection' import { buildCoreInviteEmailContentsFactory } from '@/modules/serverinvites/services/coreEmailContents' import { getEventBus } from '@/modules/shared/services/eventBus' -import { getUsers } from '@/modules/core/repositories/users' import { createBranchFactory } from '@/modules/core/repositories/branches' import { ProjectsEmitter } from '@/modules/core/events/projectsEmitter' import { addStreamCreatedActivityFactory } from '@/modules/activitystream/services/streamActivity' import { saveActivityFactory } from '@/modules/activitystream/repositories' import { publish } from '@/modules/shared/utils/subscriptions' +import { getUserFactory, getUsersFactory } from '@/modules/core/repositories/users' // To ensure that the invites are created in the correct order, we need to wait a bit between each creation const WAIT_TIMEOUT = 5 +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const addStreamCreatedActivity = addStreamCreatedActivityFactory({ saveActivity: saveActivityFactory({ db }), publish @@ -47,7 +49,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -59,7 +61,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/core/tests/usersGraphql.spec.ts b/packages/server/modules/core/tests/usersGraphql.spec.ts index 5024d79c3..57c273f3d 100644 --- a/packages/server/modules/core/tests/usersGraphql.spec.ts +++ b/packages/server/modules/core/tests/usersGraphql.spec.ts @@ -30,12 +30,13 @@ import { } from '@/modules/serverinvites/repositories/serverInvites' import { buildApolloServer } from '@/app' import { requestNewEmailVerificationFactory } from '@/modules/emails/services/verification/request' -import { getUser } from '@/modules/core/repositories/users' import { getServerInfo } from '@/modules/core/services/generic' import { deleteOldAndInsertNewVerificationFactory } from '@/modules/emails/repositories' import { renderEmail } from '@/modules/emails/services/emailRendering' import { sendEmail } from '@/modules/emails/services/sending' +import { getUserFactory } from '@/modules/core/repositories/users' +const getUser = getUserFactory({ db }) const requestNewEmailVerification = requestNewEmailVerificationFactory({ findEmail: findEmailFactory({ db }), getUser, diff --git a/packages/server/modules/cross-server-sync/index.ts b/packages/server/modules/cross-server-sync/index.ts index ad2563af0..c9746a593 100644 --- a/packages/server/modules/cross-server-sync/index.ts +++ b/packages/server/modules/cross-server-sync/index.ts @@ -51,7 +51,11 @@ import { markCommitStreamUpdatedFactory, markOnboardingBaseStreamFactory } from '@/modules/core/repositories/streams' -import { getFirstAdmin, getUser, getUsers } from '@/modules/core/repositories/users' +import { + getFirstAdmin, + getUserFactory, + getUsersFactory +} from '@/modules/core/repositories/users' import { createBranchAndNotifyFactory } from '@/modules/core/services/branch/management' import { createCommitByBranchIdFactory } from '@/modules/core/services/commit/management' import { @@ -82,6 +86,8 @@ const crossServerSyncModule: SpeckleModule = { finalize() { crossServerSyncLogger.info('⬇️ Ensuring base onboarding stream asynchronously...') + const getUser = getUserFactory({ db }) + const getUsers = getUsersFactory({ db }) const markOnboardingBaseStream = markOnboardingBaseStreamFactory({ db }) const markCommitStreamUpdated = markCommitStreamUpdatedFactory({ db }) const getStream = getStreamFactory({ db }) @@ -139,7 +145,7 @@ const crossServerSyncModule: SpeckleModule = { const createStreamReturnRecord = createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -151,7 +157,8 @@ const crossServerSyncModule: SpeckleModule = { getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/cross-server-sync/services/commit.ts b/packages/server/modules/cross-server-sync/services/commit.ts index 86619db9b..4053319ab 100644 --- a/packages/server/modules/cross-server-sync/services/commit.ts +++ b/packages/server/modules/cross-server-sync/services/commit.ts @@ -7,7 +7,6 @@ import { createObject } from '@/modules/core/services/objects' import ObjectLoader from '@speckle/objectloader' import { noop } from 'lodash' import { crossServerSyncLogger } from '@/logging/logging' -import { getUser } from '@/modules/core/repositories/users' import type { SpeckleViewer } from '@speckle/shared' import { retry } from '@speckle/shared' import { @@ -34,6 +33,7 @@ import { GetStream, GetStreamCollaborators } from '@/modules/core/domain/streams/operations' +import { GetUser } from '@/modules/core/domain/users/operations' type LocalResources = Awaited>> type LocalResourcesWithCommit = LocalResources & { newCommitId: string } @@ -224,7 +224,7 @@ type GetLocalResourcesDeps = { getStream: GetStream getStreamBranchByName: GetStreamBranchByName getStreamCollaborators: GetStreamCollaborators - getUser: typeof getUser + getUser: GetUser } const getLocalResourcesFactory = diff --git a/packages/server/modules/cross-server-sync/services/project.ts b/packages/server/modules/cross-server-sync/services/project.ts index a28cdc929..8c7dff001 100644 --- a/packages/server/modules/cross-server-sync/services/project.ts +++ b/packages/server/modules/cross-server-sync/services/project.ts @@ -1,5 +1,4 @@ import { crossServerSyncLogger, Logger } from '@/logging/logging' -import { getUser } from '@/modules/core/repositories/users' import { CrossServerProjectSyncError } from '@/modules/cross-server-sync/errors' import { createApolloClient, @@ -19,6 +18,7 @@ import { GetStreamBranchByName } from '@/modules/core/domain/branches/operations' import { CreateStream } from '@/modules/core/domain/streams/operations' +import { GetUser } from '@/modules/core/domain/users/operations' type ProjectMetadata = Awaited> @@ -48,7 +48,7 @@ const projectMetadataQuery = gql` ` type GetLocalResourcesDeps = { - getUser: typeof getUser + getUser: GetUser } const getLocalResourcesFactory = diff --git a/packages/server/modules/emails/graph/resolvers/index.ts b/packages/server/modules/emails/graph/resolvers/index.ts index 4c4cdd858..ca6a690f3 100644 --- a/packages/server/modules/emails/graph/resolvers/index.ts +++ b/packages/server/modules/emails/graph/resolvers/index.ts @@ -1,7 +1,7 @@ import { db } from '@/db/knex' import { Resolvers } from '@/modules/core/graph/generated/graphql' import { findPrimaryEmailForUserFactory } from '@/modules/core/repositories/userEmails' -import { getUser, getUserByEmail } from '@/modules/core/repositories/users' +import { getUserByEmail, getUserFactory } from '@/modules/core/repositories/users' import { getServerInfo } from '@/modules/core/services/generic' import { deleteOldAndInsertNewVerificationFactory, @@ -11,6 +11,7 @@ import { renderEmail } from '@/modules/emails/services/emailRendering' import { sendEmail } from '@/modules/emails/services/sending' import { requestEmailVerificationFactory } from '@/modules/emails/services/verification/request' +const getUser = getUserFactory({ db }) const requestEmailVerification = requestEmailVerificationFactory({ getUser, getServerInfo, diff --git a/packages/server/modules/emails/index.ts b/packages/server/modules/emails/index.ts index add8cd213..ce235b507 100644 --- a/packages/server/modules/emails/index.ts +++ b/packages/server/modules/emails/index.ts @@ -3,7 +3,7 @@ import { db } from '@/db/knex' import { moduleLogger } from '@/logging/logging' import { UsersEmitter } from '@/modules/core/events/usersEmitter' import { findPrimaryEmailForUserFactory } from '@/modules/core/repositories/userEmails' -import { getUser } from '@/modules/core/repositories/users' +import { getUserFactory } from '@/modules/core/repositories/users' import { getServerInfo } from '@/modules/core/services/generic' import { deleteOldAndInsertNewVerificationFactory } from '@/modules/emails/repositories' import { renderEmail } from '@/modules/emails/services/emailRendering' @@ -29,6 +29,7 @@ const emailsModule: SpeckleModule = { // init event listeners if (isInitial) { + const getUser = getUserFactory({ db }) const initializeVerificationOnRegistration = initializeVerificationOnRegistrationFactory({ userEmitterListener: UsersEmitter.listen, diff --git a/packages/server/modules/emails/services/verification/request.ts b/packages/server/modules/emails/services/verification/request.ts index ce117d537..ef8c34ca2 100644 --- a/packages/server/modules/emails/services/verification/request.ts +++ b/packages/server/modules/emails/services/verification/request.ts @@ -6,7 +6,6 @@ import { UserEmail } from '@/modules/core/domain/userEmails/types' import { UsersEmitter, UsersEvents } from '@/modules/core/events/usersEmitter' import { getEmailVerificationFinalizationRoute } from '@/modules/core/helpers/routeHelper' import { ServerInfo, UserRecord } from '@/modules/core/helpers/types' -import { getUser } from '@/modules/core/repositories/users' import { getServerInfo } from '@/modules/core/services/generic' import { EmailVerificationRequestError } from '@/modules/emails/errors' import { @@ -20,11 +19,12 @@ import { RequestEmailVerification, RequestNewEmailVerification } from '@/modules/emails/domain/operations' +import { GetUser } from '@/modules/core/domain/users/operations' const EMAIL_SUBJECT = 'Speckle Account E-mail Verification' type CreateNewVerificationDeps = { - getUser: typeof getUser + getUser: GetUser findPrimaryEmailForUser: FindPrimaryEmailForUser getServerInfo: typeof getServerInfo deleteOldAndInsertNewVerification: DeleteOldAndInsertNewVerification @@ -69,7 +69,7 @@ type VerificationRequestContext = { type CreateNewEmailVerificationFactoryDeps = { findEmail: FindEmail - getUser: typeof getUser + getUser: GetUser getServerInfo: typeof getServerInfo deleteOldAndInsertNewVerification: DeleteOldAndInsertNewVerification } diff --git a/packages/server/modules/emails/tests/verifications.spec.ts b/packages/server/modules/emails/tests/verifications.spec.ts index d2bbfba13..cee98cbec 100644 --- a/packages/server/modules/emails/tests/verifications.spec.ts +++ b/packages/server/modules/emails/tests/verifications.spec.ts @@ -14,7 +14,6 @@ import { } from '@/test/graphql/users' import { getEmailVerificationFinalizationRoute } from '@/modules/core/helpers/routeHelper' import { Express } from 'express' -import { getUser } from '@/modules/core/repositories/users' import dayjs from 'dayjs' import { EmailSendingServiceMock } from '@/test/mocks/global' import { @@ -29,8 +28,10 @@ import { getServerInfo } from '@/modules/core/services/generic' import { findPrimaryEmailForUserFactory } from '@/modules/core/repositories/userEmails' import { sendEmail } from '@/modules/emails/services/sending' import { renderEmail } from '@/modules/emails/services/emailRendering' +import { getUserFactory } from '@/modules/core/repositories/users' const mailerMock = EmailSendingServiceMock +const getUser = getUserFactory({ db }) const getPendingToken = getPendingTokenFactory({ db }) const deleteVerifications = deleteVerificationsFactory({ db }) const requestEmailVerification = requestEmailVerificationFactory({ diff --git a/packages/server/modules/fileuploads/tests/fileuploads.integration.spec.ts b/packages/server/modules/fileuploads/tests/fileuploads.integration.spec.ts index 41948a74d..e27b2cb00 100644 --- a/packages/server/modules/fileuploads/tests/fileuploads.integration.spec.ts +++ b/packages/server/modules/fileuploads/tests/fileuploads.integration.spec.ts @@ -29,13 +29,15 @@ import { import { collectAndValidateCoreTargetsFactory } from '@/modules/serverinvites/services/coreResourceCollection' import { buildCoreInviteEmailContentsFactory } from '@/modules/serverinvites/services/coreEmailContents' import { getEventBus } from '@/modules/shared/services/eventBus' -import { getUsers } from '@/modules/core/repositories/users' import { createBranchFactory } from '@/modules/core/repositories/branches' import { ProjectsEmitter } from '@/modules/core/events/projectsEmitter' import { addStreamCreatedActivityFactory } from '@/modules/activitystream/services/streamActivity' import { saveActivityFactory } from '@/modules/activitystream/repositories' import { publish } from '@/modules/shared/utils/subscriptions' +import { getUserFactory, getUsersFactory } from '@/modules/core/repositories/users' +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const addStreamCreatedActivity = addStreamCreatedActivityFactory({ saveActivity: saveActivityFactory({ db }), publish @@ -45,7 +47,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -57,7 +59,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/notifications/services/handlers/activityDigest.ts b/packages/server/modules/notifications/services/handlers/activityDigest.ts index 459f62a61..1c0e0f911 100644 --- a/packages/server/modules/notifications/services/handlers/activityDigest.ts +++ b/packages/server/modules/notifications/services/handlers/activityDigest.ts @@ -32,6 +32,7 @@ import { import { createActivitySummaryFactory } from '@/modules/activitystream/services/summary' import { getActivityFactory } from '@/modules/activitystream/repositories' import { getStreamFactory } from '@/modules/core/repositories/streams' +import { getUserFactory } from '@/modules/core/repositories/users' const digestNotificationEmailHandlerFactory = ( @@ -437,7 +438,8 @@ const digestNotificationEmailHandler = digestNotificationEmailHandlerFactory({ }), createActivitySummary: createActivitySummaryFactory({ getStream: getStreamFactory({ db }), - getActivity: getActivityFactory({ db }) + getActivity: getActivityFactory({ db }), + getUser: getUserFactory({ db }) }), getServerInfo, renderEmail diff --git a/packages/server/modules/notifications/services/handlers/mentionedInComment.ts b/packages/server/modules/notifications/services/handlers/mentionedInComment.ts index 77bcad522..769eaebf3 100644 --- a/packages/server/modules/notifications/services/handlers/mentionedInComment.ts +++ b/packages/server/modules/notifications/services/handlers/mentionedInComment.ts @@ -4,11 +4,12 @@ import { ExtendedComment } from '@/modules/comments/domain/types' import { getCommentFactory } from '@/modules/comments/repositories/comments' import { GetStream } from '@/modules/core/domain/streams/operations' import { StreamWithOptionalRole } from '@/modules/core/domain/streams/types' +import { GetUser } from '@/modules/core/domain/users/operations' import { Roles } from '@/modules/core/helpers/mainConstants' import { getCommentRoute } from '@/modules/core/helpers/routeHelper' import { ServerInfo } from '@/modules/core/helpers/types' import { getStreamFactory } from '@/modules/core/repositories/streams' -import { getUser, UserWithOptionalRole } from '@/modules/core/repositories/users' +import { getUserFactory, UserWithOptionalRole } from '@/modules/core/repositories/users' import { getServerInfo } from '@/modules/core/services/generic' import { EmailTemplateParams, @@ -164,7 +165,7 @@ function buildEmailTemplateParams( */ const mentionedInCommentHandlerFactory = (deps: { - getUser: typeof getUser + getUser: GetUser getStream: GetStream getComment: GetComment getServerInfo: typeof getServerInfo @@ -221,7 +222,7 @@ const mentionedInCommentHandlerFactory = */ const handler: NotificationHandler = async (...args) => { const mentionedInCommentHandler = mentionedInCommentHandlerFactory({ - getUser, + getUser: getUserFactory({ db }), getStream: getStreamFactory({ db }), getComment: getCommentFactory({ db }), getServerInfo, diff --git a/packages/server/modules/notifications/services/handlers/newStreamAccessRequest.ts b/packages/server/modules/notifications/services/handlers/newStreamAccessRequest.ts index e9dccc5bd..a1baee9e0 100644 --- a/packages/server/modules/notifications/services/handlers/newStreamAccessRequest.ts +++ b/packages/server/modules/notifications/services/handlers/newStreamAccessRequest.ts @@ -2,7 +2,6 @@ import { AccessRequestType, getPendingAccessRequestFactory } from '@/modules/accessrequests/repositories' -import { getUser } from '@/modules/core/repositories/users' import { NewStreamAccessRequestMessage, NotificationHandler @@ -23,10 +22,12 @@ import { db } from '@/db/knex' import { GetPendingAccessRequest } from '@/modules/accessrequests/domain/operations' import { GetStream } from '@/modules/core/domain/streams/operations' import { getStreamFactory } from '@/modules/core/repositories/streams' +import { GetUser } from '@/modules/core/domain/users/operations' +import { getUserFactory } from '@/modules/core/repositories/users' type ValidateMessageDeps = { getPendingAccessRequest: GetPendingAccessRequest - getUser: typeof getUser + getUser: GetUser getStream: GetStream } @@ -150,7 +151,7 @@ const handler: NotificationHandler = (...args) => getServerInfo, renderEmail, sendEmail, - getUser, + getUser: getUserFactory({ db }), getStream: getStreamFactory({ db }), getPendingAccessRequest: getPendingAccessRequestFactory({ db }) }) diff --git a/packages/server/modules/notifications/services/handlers/streamAccessRequestApproved.ts b/packages/server/modules/notifications/services/handlers/streamAccessRequestApproved.ts index 79b7ac43c..ed2db6dee 100644 --- a/packages/server/modules/notifications/services/handlers/streamAccessRequestApproved.ts +++ b/packages/server/modules/notifications/services/handlers/streamAccessRequestApproved.ts @@ -1,11 +1,12 @@ import { db } from '@/db/knex' import { GetStream } from '@/modules/core/domain/streams/operations' +import { GetUser } from '@/modules/core/domain/users/operations' import { buildAbsoluteFrontendUrlFromPath, getStreamRoute } from '@/modules/core/helpers/routeHelper' import { getStreamFactory } from '@/modules/core/repositories/streams' -import { getUser } from '@/modules/core/repositories/users' +import { getUserFactory } from '@/modules/core/repositories/users' import { getServerInfo } from '@/modules/core/services/generic' import { EmailTemplateParams, @@ -19,7 +20,7 @@ import { } from '@/modules/notifications/helpers/types' type ValidateMessageDeps = { - getUser: typeof getUser + getUser: GetUser getStream: GetStream } @@ -130,7 +131,7 @@ const handler: NotificationHandler = async ( getServerInfo, renderEmail, sendEmail, - getUser, + getUser: getUserFactory({ db }), getStream: getStreamFactory({ db }) }) return streamAccessRequestApprovedHandler(...args) diff --git a/packages/server/modules/serverinvites/graph/resolvers/serverInvites.ts b/packages/server/modules/serverinvites/graph/resolvers/serverInvites.ts index cd9c0d1a5..7d1f2da1f 100644 --- a/packages/server/modules/serverinvites/graph/resolvers/serverInvites.ts +++ b/packages/server/modules/serverinvites/graph/resolvers/serverInvites.ts @@ -41,7 +41,6 @@ import { getUserPendingProjectInvitesFactory, useProjectInviteAndNotifyFactory } from '@/modules/serverinvites/services/projectInviteManagement' -import { getUser, getUsers } from '@/modules/core/repositories/users' import { collectAndValidateCoreTargetsFactory } from '@/modules/serverinvites/services/coreResourceCollection' import { buildCoreInviteEmailContentsFactory } from '@/modules/serverinvites/services/coreEmailContents' import { getEventBus } from '@/modules/shared/services/eventBus' @@ -83,10 +82,13 @@ import { addOrUpdateStreamCollaboratorFactory, validateStreamAccessFactory } from '@/modules/core/services/streams/access' +import { getUserFactory, getUsersFactory } from '@/modules/core/repositories/users' const saveActivity = saveActivityFactory({ db }) const validateStreamAccess = validateStreamAccessFactory({ authorizeResolver }) +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const addOrUpdateStreamCollaborator = addOrUpdateStreamCollaboratorFactory({ validateStreamAccess, getUser, @@ -117,7 +119,7 @@ const buildCollectAndValidateResourceTargets = () => const buildCreateAndSendServerOrProjectInvite = () => createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: buildCollectAndValidateResourceTargets(), buildInviteEmailContents: buildCoreInviteEmailContentsFactory({ @@ -127,7 +129,8 @@ const buildCreateAndSendServerOrProjectInvite = () => getEventBus().emit({ eventName, payload - }) + }), + getUser }) export = { @@ -377,9 +380,10 @@ export = { buildInviteEmailContents: buildCoreInviteEmailContentsFactory({ getStream }), - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), findInvite: findInviteFactory({ db }), - markInviteUpdated: markInviteUpdatedfactory({ db }) + markInviteUpdated: markInviteUpdatedfactory({ db }), + getUser }) await resendInviteEmail({ inviteId }) diff --git a/packages/server/modules/serverinvites/repositories/serverInvites.ts b/packages/server/modules/serverinvites/repositories/serverInvites.ts index 2a6b5c207..dcb66d3db 100644 --- a/packages/server/modules/serverinvites/repositories/serverInvites.ts +++ b/packages/server/modules/serverinvites/repositories/serverInvites.ts @@ -1,7 +1,7 @@ import { knex, ServerInvites, Streams, Users } from '@/modules/core/dbSchema' import { getUserByEmail, - getUser, + getUserFactory, UserWithOptionalRole } from '@/modules/core/repositories/users' import { resolveTarget, buildUserTarget } from '@/modules/serverinvites/helpers/core' @@ -127,12 +127,12 @@ export const filterByResource = ( * Try to find a user using the target value */ export const findUserByTargetFactory = - () => + (deps: { db: Knex }) => (target: string): Promise => { const { userEmail, userId } = resolveTarget(target) return userEmail ? getUserByEmail(userEmail, { withRole: true }) - : getUser(userId!, { withRole: true }) + : getUserFactory(deps)(userId!, { withRole: true }) } /** diff --git a/packages/server/modules/serverinvites/services/creation.ts b/packages/server/modules/serverinvites/services/creation.ts index d3afa71c7..df2b33875 100644 --- a/packages/server/modules/serverinvites/services/creation.ts +++ b/packages/server/modules/serverinvites/services/creation.ts @@ -8,7 +8,7 @@ import { buildUserTarget, ResolvedTargetData } from '@/modules/serverinvites/helpers/core' -import { getUser, UserWithOptionalRole } from '@/modules/core/repositories/users' +import { UserWithOptionalRole } from '@/modules/core/repositories/users' import { FindInvite, FindUserByTarget, @@ -31,6 +31,7 @@ import { } from '@/modules/serverinvites/domain/types' import { ServerInfo } from '@/modules/core/helpers/types' import { EventBusEmit } from '@/modules/shared/services/eventBus' +import { GetUser } from '@/modules/core/domain/users/operations' const getFinalTargetData = ( target: string, @@ -88,13 +89,15 @@ export const createAndSendInviteFactory = insertInviteAndDeleteOld, collectAndValidateResourceTargets, buildInviteEmailContents, - emitEvent + emitEvent, + getUser }: { findUserByTarget: FindUserByTarget insertInviteAndDeleteOld: InsertInviteAndDeleteOld collectAndValidateResourceTargets: CollectAndValidateResourceTargets buildInviteEmailContents: BuildInviteEmailContents emitEvent: EventBusEmit + getUser: GetUser }): CreateAndSendInvite => async (params, inviterResourceAccessLimits?) => { const sendInviteEmail = sendInviteEmailFactory({ buildInviteEmailContents }) @@ -190,12 +193,14 @@ export const resendInviteEmailFactory = buildInviteEmailContents, findUserByTarget, findInvite, - markInviteUpdated + markInviteUpdated, + getUser }: { buildInviteEmailContents: BuildInviteEmailContents findUserByTarget: FindUserByTarget findInvite: FindInvite markInviteUpdated: MarkInviteUpdated + getUser: GetUser }): ResendInviteEmail => async (params) => { const sendInviteEmail = sendInviteEmailFactory({ buildInviteEmailContents }) diff --git a/packages/server/modules/serverinvites/services/processing.ts b/packages/server/modules/serverinvites/services/processing.ts index 0168919d2..694436744 100644 --- a/packages/server/modules/serverinvites/services/processing.ts +++ b/packages/server/modules/serverinvites/services/processing.ts @@ -45,15 +45,15 @@ import { FindEmail, ValidateAndCreateUserEmail } from '@/modules/core/domain/userEmails/operations' -import { getUser } from '@/modules/core/repositories/users' import { ServerInfo } from '@/modules/core/helpers/types' import { getServerInfo } from '@/modules/core/services/generic' +import { GetUser } from '@/modules/core/domain/users/operations' /** * Convert the initial validation function to a finalization validation function so same logic can be reused */ export const convertToFinalizationValidation = (params: { - getUser: typeof getUser + getUser: GetUser initialValidation: CollectAndValidateResourceTargets serverInfo: ServerInfo }): ValidateResourceInviteBeforeFinalization => { @@ -196,7 +196,7 @@ type FinalizeResourceInviteFactoryDeps = { validateAndCreateUserEmail: ValidateAndCreateUserEmail collectAndValidateResourceTargets: CollectAndValidateResourceTargets getServerInfo: typeof getServerInfo - getUser: typeof getUser + getUser: GetUser } export const finalizeResourceInviteFactory = diff --git a/packages/server/modules/serverinvites/services/projectInviteManagement.ts b/packages/server/modules/serverinvites/services/projectInviteManagement.ts index a20f52b7b..77206c1dd 100644 --- a/packages/server/modules/serverinvites/services/projectInviteManagement.ts +++ b/packages/server/modules/serverinvites/services/projectInviteManagement.ts @@ -1,5 +1,6 @@ import { GetStream } from '@/modules/core/domain/streams/operations' import { TokenResourceIdentifier } from '@/modules/core/domain/tokens/types' +import { GetUser, GetUsers } from '@/modules/core/domain/users/operations' import { MutationStreamInviteUseArgs, ProjectInviteCreateInput, @@ -9,7 +10,6 @@ import { import { ContextResourceAccessRules } from '@/modules/core/helpers/token' import { LimitedUserRecord } from '@/modules/core/helpers/types' import { removePrivateFields } from '@/modules/core/helpers/userHelper' -import { getUser, getUsers } from '@/modules/core/repositories/users' import { ProjectInviteResourceType, ServerInviteResourceType @@ -151,7 +151,7 @@ export const useProjectInviteAndNotifyFactory = * Invite users to be contributors for the specified project */ export const inviteUsersToProjectFactory = - (deps: { createAndSendInvite: CreateAndSendInvite; getUsers: typeof getUsers }) => + (deps: { createAndSendInvite: CreateAndSendInvite; getUsers: GetUsers }) => async ( inviterId: string, streamId: string, @@ -207,10 +207,7 @@ function buildPendingStreamCollaboratorModel( * Get all pending invitations to projects that this user has */ export const getUserPendingProjectInvitesFactory = - (deps: { - getUserResourceInvites: QueryAllUserResourceInvites - getUser: typeof getUser - }) => + (deps: { getUserResourceInvites: QueryAllUserResourceInvites; getUser: GetUser }) => async (userId: string): Promise => { if (!userId) return [] @@ -234,7 +231,7 @@ export const getUserPendingProjectInvitesFactory = * Either the user ID or invite ID must be set */ export const getUserPendingProjectInviteFactory = - (deps: { findInvite: FindInvite; getUser: typeof getUser }) => + (deps: { findInvite: FindInvite; getUser: GetUser }) => async ( projectId: string, userId: MaybeNullOrUndefined, diff --git a/packages/server/modules/serverinvites/services/retrieval.ts b/packages/server/modules/serverinvites/services/retrieval.ts index 76c0a9b11..0a0cfaa15 100644 --- a/packages/server/modules/serverinvites/services/retrieval.ts +++ b/packages/server/modules/serverinvites/services/retrieval.ts @@ -1,16 +1,16 @@ import { ServerInviteGraphQLReturnType } from '@/modules/core/helpers/graphTypes' -import { getUsers } from '@/modules/core/repositories/users' import { resolveTarget } from '@/modules/serverinvites/helpers/core' import { Nullable } from '@speckle/shared' import { keyBy, uniq } from 'lodash' import { FindServerInvite } from '@/modules/serverinvites/domain/operations' import { GetInvitationTargetUsers } from '@/modules/serverinvites/services/operations' +import { GetUsers } from '@/modules/core/domain/users/operations' /** * Get all registered invitation target users keyed by their ID */ export const getInvitationTargetUsersFactory = - (deps: { getUsers: typeof getUsers }): GetInvitationTargetUsers => + (deps: { getUsers: GetUsers }): GetInvitationTargetUsers => async ({ invites }) => { const userIds = uniq( invites diff --git a/packages/server/modules/shared/middleware/index.ts b/packages/server/modules/shared/middleware/index.ts index f34447773..78a20529a 100644 --- a/packages/server/modules/shared/middleware/index.ts +++ b/packages/server/modules/shared/middleware/index.ts @@ -16,7 +16,6 @@ import { MaybeNullOrUndefined, Nullable } from '@/modules/shared/helpers/typeHelper' -import { getUser } from '@/modules/core/repositories/users' import { Optional, wait } from '@speckle/shared' import { mixpanel } from '@/modules/shared/utils/mixpanel' import * as Observability from '@speckle/shared/dist/commonjs/observability/index.js' @@ -27,6 +26,7 @@ import { Merge } from 'type-fest' import { resourceAccessRuleToIdentifier } from '@/modules/core/helpers/token' import { delayGraphqlResponsesBy } from '@/modules/shared/helpers/envHelper' import { subscriptionLogger } from '@/logging/logging' +import { GetUser } from '@/modules/core/domain/users/operations' export const authMiddlewareCreator = (steps: AuthPipelineFunction[]) => { const pipeline = authPipelineCreator(steps) @@ -189,7 +189,7 @@ export async function buildContext({ * Adds a .mixpanel helper onto the req object that is already pre-identified with the active user's identity */ export const mixpanelTrackerHelperMiddlewareFactory = - (deps: { getUser: typeof getUser }): Handler => + (deps: { getUser: GetUser }): Handler => async (req: Request, _res: Response, next: NextFunction) => { const ctx = req.context const user = ctx.userId ? await deps.getUser(ctx.userId) : null diff --git a/packages/server/modules/stats/tests/stats.spec.ts b/packages/server/modules/stats/tests/stats.spec.ts index 255a8c6da..1fc2e8814 100644 --- a/packages/server/modules/stats/tests/stats.spec.ts +++ b/packages/server/modules/stats/tests/stats.spec.ts @@ -55,13 +55,14 @@ import { import { collectAndValidateCoreTargetsFactory } from '@/modules/serverinvites/services/coreResourceCollection' import { buildCoreInviteEmailContentsFactory } from '@/modules/serverinvites/services/coreEmailContents' import { getEventBus } from '@/modules/shared/services/eventBus' -import { getUsers } from '@/modules/core/repositories/users' import { ProjectsEmitter } from '@/modules/core/events/projectsEmitter' import { addStreamCreatedActivityFactory } from '@/modules/activitystream/services/streamActivity' import { saveActivityFactory } from '@/modules/activitystream/repositories' import { publish } from '@/modules/shared/utils/subscriptions' import { addCommitCreatedActivityFactory } from '@/modules/activitystream/services/commitActivity' +import { getUserFactory, getUsersFactory } from '@/modules/core/repositories/users' +const getUsers = getUsersFactory({ db }) const markCommitStreamUpdated = markCommitStreamUpdatedFactory({ db }) const getObject = getObjectFactory({ db }) const createCommitByBranchId = createCommitByBranchIdFactory({ @@ -94,7 +95,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -106,7 +107,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser: getUserFactory({ db }) }), getUsers }), diff --git a/packages/server/modules/webhooks/services/webhooks.ts b/packages/server/modules/webhooks/services/webhooks.ts index fd0c65be2..abbf579ae 100644 --- a/packages/server/modules/webhooks/services/webhooks.ts +++ b/packages/server/modules/webhooks/services/webhooks.ts @@ -12,13 +12,11 @@ import { Webhook } from '@/modules/webhooks/domain/types' import { SetValuesNullable } from '@speckle/shared' import crs from 'crypto-random-string' import { StreamWithOptionalRole } from '@/modules/core/repositories/streams' -import { - getUser as getUserFn, - UserWithOptionalRole -} from '@/modules/core/repositories/users' import { Knex } from 'knex' import { ServerInfo } from '@/modules/core/helpers/types' import { GetStream } from '@/modules/core/domain/streams/operations' +import { UserWithOptionalRole } from '@/modules/core/domain/users/types' +import { GetUser } from '@/modules/core/domain/users/operations' const MAX_STREAM_WEBHOOKS = 100 @@ -110,7 +108,7 @@ export const dispatchStreamEventFactory = getServerInfo: typeof getServerInfoFn getStream: GetStream createWebhookEvent: CreateWebhookEvent - getUser: typeof getUserFn + getUser: GetUser }) => async ({ streamId, diff --git a/packages/server/modules/webhooks/tests/cleanup.spec.ts b/packages/server/modules/webhooks/tests/cleanup.spec.ts index e691cab8c..c2b604138 100644 --- a/packages/server/modules/webhooks/tests/cleanup.spec.ts +++ b/packages/server/modules/webhooks/tests/cleanup.spec.ts @@ -11,7 +11,7 @@ import { createStreamFactory, getStreamFactory } from '@/modules/core/repositories/streams' -import { getUsers } from '@/modules/core/repositories/users' +import { getUserFactory, getUsersFactory } from '@/modules/core/repositories/users' import { createStreamReturnRecordFactory, legacyCreateStreamFactory @@ -38,6 +38,8 @@ const WEBHOOKS_EVENTS_TABLE = 'webhooks_events' const WebhooksConfig = () => knex(WEBHOOKS_CONFIG_TABLE) const randomId = () => crs({ length: 10 }) +const getUsers = getUsersFactory({ db }) +const getUser = getUserFactory({ db }) const addStreamCreatedActivity = addStreamCreatedActivityFactory({ saveActivity: saveActivityFactory({ db }), publish @@ -47,7 +49,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -59,7 +61,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/webhooks/tests/webhooks.spec.js b/packages/server/modules/webhooks/tests/webhooks.spec.js index 9da6f1323..bc03d2cce 100644 --- a/packages/server/modules/webhooks/tests/webhooks.spec.js +++ b/packages/server/modules/webhooks/tests/webhooks.spec.js @@ -30,7 +30,6 @@ const { } = require('@/modules/webhooks/services/webhooks') const { Users, Streams } = require('@/modules/core/dbSchema') const { getServerInfo } = require('@/modules/core/services/generic') -const { getUser, getUsers } = require('@/modules/core/repositories/users') const { getStreamFactory, createStreamFactory, @@ -64,7 +63,10 @@ const { } = require('@/modules/activitystream/services/streamActivity') const { saveActivityFactory } = require('@/modules/activitystream/repositories') const { publish } = require('@/modules/shared/utils/subscriptions') +const { getUserFactory, getUsersFactory } = require('@/modules/core/repositories/users') +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const addStreamCreatedActivity = addStreamCreatedActivityFactory({ saveActivity: saveActivityFactory({ db }), publish @@ -78,7 +80,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -90,7 +92,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/modules/workspaces/graph/resolvers/workspaces.ts b/packages/server/modules/workspaces/graph/resolvers/workspaces.ts index af6a2b925..99dd0c966 100644 --- a/packages/server/modules/workspaces/graph/resolvers/workspaces.ts +++ b/packages/server/modules/workspaces/graph/resolvers/workspaces.ts @@ -15,7 +15,6 @@ import { getUserStreamsPageFactory, getUserStreamsCountFactory } from '@/modules/core/repositories/streams' -import { getUser, getUsers } from '@/modules/core/repositories/users' import { InviteCreateValidationError } from '@/modules/serverinvites/errors' import { deleteAllResourceInvitesFactory, @@ -149,7 +148,10 @@ import { } from '@/modules/activitystream/services/streamActivity' import { publish } from '@/modules/shared/utils/subscriptions' import { updateStreamRoleAndNotifyFactory } from '@/modules/core/services/streams/management' +import { getUserFactory, getUsersFactory } from '@/modules/core/repositories/users' +const getUser = getUserFactory({ db }) +const getUsers = getUsersFactory({ db }) const getStream = getStreamFactory({ db }) const requestNewEmailVerification = requestNewEmailVerificationFactory({ findEmail: findEmailFactory({ db }), @@ -170,7 +172,7 @@ const buildCollectAndValidateResourceTargets = () => const buildCreateAndSendServerOrProjectInvite = () => createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: buildCollectAndValidateResourceTargets(), buildInviteEmailContents: buildCoreInviteEmailContentsFactory({ @@ -180,12 +182,13 @@ const buildCreateAndSendServerOrProjectInvite = () => getEventBus().emit({ eventName, payload - }) + }), + getUser }) const buildCreateAndSendWorkspaceInvite = () => createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: buildCollectAndValidateResourceTargets(), buildInviteEmailContents: buildWorkspaceInviteEmailContentsFactory({ @@ -196,7 +199,8 @@ const buildCreateAndSendWorkspaceInvite = () => getEventBus().emit({ eventName, payload - }) + }), + getUser }) const deleteStream = deleteStreamFactory({ db }) const saveActivity = saveActivityFactory({ db }) @@ -588,12 +592,13 @@ export = FF_WORKSPACES_MODULE_ENABLED getStream, getWorkspace: getWorkspaceFactory({ db }) }), - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), findInvite: findInviteFactory({ db, filterQuery: workspaceInviteValidityFilter }), - markInviteUpdated: markInviteUpdatedfactory({ db }) + markInviteUpdated: markInviteUpdatedfactory({ db }), + getUser }) await resendInviteEmail({ diff --git a/packages/server/modules/workspaces/services/invites.ts b/packages/server/modules/workspaces/services/invites.ts index 415362b2d..289e9dc02 100644 --- a/packages/server/modules/workspaces/services/invites.ts +++ b/packages/server/modules/workspaces/services/invites.ts @@ -9,7 +9,6 @@ import { getWorkspaceRoute } from '@/modules/core/helpers/routeHelper' import { isResourceAllowed } from '@/modules/core/helpers/token' import { UserRecord } from '@/modules/core/helpers/types' import { removePrivateFields } from '@/modules/core/helpers/userHelper' -import { getUser } from '@/modules/core/repositories/users' import { ProjectInviteResourceType, ServerInviteResourceType @@ -72,6 +71,7 @@ import { userEmailsCompliantWithWorkspaceDomains } from '@/modules/workspaces/domain/logic' import { GetStream } from '@/modules/core/domain/streams/operations' +import { GetUser } from '@/modules/core/domain/users/operations' const isWorkspaceResourceTarget = ( target: InviteResourceTarget @@ -381,7 +381,7 @@ function buildPendingWorkspaceCollaboratorModel( export const getUserPendingWorkspaceInviteFactory = (deps: { findInvite: FindInvite - getUser: typeof getUser + getUser: GetUser getWorkspaceBySlug: GetWorkspaceBySlug }) => async (params: { @@ -425,10 +425,7 @@ export const getUserPendingWorkspaceInviteFactory = } export const getUserPendingWorkspaceInvitesFactory = - (deps: { - getUserResourceInvites: QueryAllUserResourceInvites - getUser: typeof getUser - }) => + (deps: { getUserResourceInvites: QueryAllUserResourceInvites; getUser: GetUser }) => async (userId: string): Promise => { if (!userId) return [] diff --git a/packages/server/modules/workspaces/tests/helpers/creation.ts b/packages/server/modules/workspaces/tests/helpers/creation.ts index a8ef6065c..17bbde42f 100644 --- a/packages/server/modules/workspaces/tests/helpers/creation.ts +++ b/packages/server/modules/workspaces/tests/helpers/creation.ts @@ -45,6 +45,7 @@ import { WorkspaceRoles } from '@speckle/shared' import { getStreamFactory } from '@/modules/core/repositories/streams' +import { getUserFactory } from '@/modules/core/repositories/users' export type BasicTestWorkspace = { /** @@ -208,8 +209,9 @@ export const createWorkspaceInviteDirectly = async ( inviterId: string ) => { const getStream = getStreamFactory({ db }) + const getUser = getUserFactory({ db }) const createAndSendInvite = createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateWorkspaceTargetsFactory({ getStream, @@ -225,7 +227,8 @@ export const createWorkspaceInviteDirectly = async ( getEventBus().emit({ eventName, payload - }) + }), + getUser }) const createInvite = createWorkspaceInviteFactory({ diff --git a/packages/server/modules/workspaces/tests/integration/invites.graph.spec.ts b/packages/server/modules/workspaces/tests/integration/invites.graph.spec.ts index e74635d24..d1ea1deff 100644 --- a/packages/server/modules/workspaces/tests/integration/invites.graph.spec.ts +++ b/packages/server/modules/workspaces/tests/integration/invites.graph.spec.ts @@ -87,12 +87,12 @@ import { validateStreamAccessFactory } from '@/modules/core/services/streams/access' import { authorizeResolver } from '@/modules/shared' -import { getUser } from '@/modules/core/repositories/users' import { addStreamInviteAcceptedActivityFactory, addStreamPermissionsAddedActivityFactory } from '@/modules/activitystream/services/streamActivity' import { publish } from '@/modules/shared/utils/subscriptions' +import { getUserFactory } from '@/modules/core/repositories/users' enum InviteByTarget { Email = 'email', @@ -105,6 +105,7 @@ const getStream = getStreamFactory({ db }) const saveActivity = saveActivityFactory({ db }) const validateStreamAccess = validateStreamAccessFactory({ authorizeResolver }) +const getUser = getUserFactory({ db }) const addOrUpdateStreamCollaborator = addOrUpdateStreamCollaboratorFactory({ validateStreamAccess, getUser, diff --git a/packages/server/scripts/streamObjects.js b/packages/server/scripts/streamObjects.js index 4a104577f..62dd7316a 100644 --- a/packages/server/scripts/streamObjects.js +++ b/packages/server/scripts/streamObjects.js @@ -35,7 +35,6 @@ const { buildCoreInviteEmailContentsFactory } = require('@/modules/serverinvites/services/coreEmailContents') const { getEventBus } = require('@/modules/shared/services/eventBus') -const { getUsers } = require('@/modules/core/repositories/users') const { createBranchFactory } = require('@/modules/core/repositories/branches') const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter') const { @@ -43,7 +42,10 @@ const { } = require('@/modules/activitystream/services/streamActivity') const { saveActivityFactory } = require('@/modules/activitystream/repositories') const { publish } = require('@/modules/shared/utils/subscriptions') +const { getUsersFactory, getUserFactory } = require('@/modules/core/repositories/users') +const getUsers = getUsersFactory({ db }) +const getUser = getUserFactory({ db }) const addStreamCreatedActivity = addStreamCreatedActivityFactory({ saveActivity: saveActivityFactory({ db }), publish @@ -53,7 +55,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -65,7 +67,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }), diff --git a/packages/server/test/speckle-helpers/inviteHelper.ts b/packages/server/test/speckle-helpers/inviteHelper.ts index 47cd493fd..c3ce743fc 100644 --- a/packages/server/test/speckle-helpers/inviteHelper.ts +++ b/packages/server/test/speckle-helpers/inviteHelper.ts @@ -26,10 +26,12 @@ import { } from '@/modules/serverinvites/domain/types' import { EmailSendingServiceMock } from '@/test/mocks/global' import { getStreamFactory } from '@/modules/core/repositories/streams' +import { getUserFactory } from '@/modules/core/repositories/users' +const getUser = getUserFactory({ db }) const getStream = getStreamFactory({ db }) const createAndSendInvite = createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -41,7 +43,8 @@ const createAndSendInvite = createAndSendInviteFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }) export const createServerInviteDirectly = async ( diff --git a/packages/server/test/speckle-helpers/streamHelper.ts b/packages/server/test/speckle-helpers/streamHelper.ts index 86a6d7fe2..58608024a 100644 --- a/packages/server/test/speckle-helpers/streamHelper.ts +++ b/packages/server/test/speckle-helpers/streamHelper.ts @@ -13,7 +13,7 @@ import { getStreamFactory, revokeStreamPermissionsFactory } from '@/modules/core/repositories/streams' -import { getUsers } from '@/modules/core/repositories/users' +import { getUserFactory, getUsersFactory } from '@/modules/core/repositories/users' import { isStreamCollaboratorFactory, removeStreamCollaboratorFactory, @@ -39,6 +39,8 @@ import { BasicTestUser } from '@/test/authHelper' import { ensureError } from '@speckle/shared' import { omit } from 'lodash' +const getUsers = getUsersFactory({ db }) +const getUser = getUserFactory({ db }) const addStreamCreatedActivity = addStreamCreatedActivityFactory({ saveActivity: saveActivityFactory({ db }), publish @@ -48,7 +50,7 @@ const createStream = legacyCreateStreamFactory({ createStreamReturnRecord: createStreamReturnRecordFactory({ inviteUsersToProject: inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ - findUserByTarget: findUserByTargetFactory(), + findUserByTarget: findUserByTargetFactory({ db }), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({ getStream @@ -60,7 +62,8 @@ const createStream = legacyCreateStreamFactory({ getEventBus().emit({ eventName, payload - }) + }), + getUser }), getUsers }),