From 5b5dd201e2e5bce15a5b1e8035095968b78aa2fc Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Tue, 8 Oct 2024 13:50:38 +0300 Subject: [PATCH] chore(server): IoC 29 - getStream(s)Factory --- .../accessrequests/graph/resolvers/index.ts | 3 +- .../modules/accessrequests/services/stream.ts | 4 +- .../tests/projectAccessRequests.spec.ts | 6 +- .../tests/streamAccessRequests.spec.ts | 6 +- .../server/modules/activitystream/index.ts | 4 +- .../activitystream/repositories/index.ts | 4 +- .../services/serverInvitesActivity.ts | 4 +- .../activitystream/services/summary.ts | 4 +- .../tests/activitySummary.spec.ts | 4 +- .../server/modules/automate/rest/logStream.ts | 4 +- packages/server/modules/blobstorage/index.js | 3 +- .../modules/cli/commands/db/seed/commits.ts | 5 +- .../modules/cli/commands/download/commit.ts | 3 +- .../modules/cli/commands/download/project.ts | 3 +- .../comments/graph/resolvers/comments.ts | 3 +- .../server/modules/comments/services/index.ts | 4 +- .../modules/comments/services/management.ts | 6 +- .../modules/comments/tests/comments.spec.js | 5 +- .../modules/core/domain/streams/operations.ts | 21 ++++ .../modules/core/domain/streams/types.ts | 12 +++ .../modules/core/graph/directives/hasRole.ts | 3 +- .../modules/core/graph/resolvers/branches.js | 5 +- .../modules/core/graph/resolvers/commits.js | 6 +- .../modules/core/graph/resolvers/models.ts | 6 +- .../modules/core/graph/resolvers/projects.ts | 5 +- .../modules/core/graph/resolvers/streams.ts | 6 +- .../modules/core/graph/resolvers/versions.ts | 6 +- packages/server/modules/core/loaders.ts | 5 +- .../modules/core/repositories/streams.ts | 102 +++++++++--------- .../server/modules/core/rest/authUtils.js | 4 +- .../core/services/branch/management.ts | 5 +- .../services/commit/batchCommitActions.ts | 7 +- .../core/services/commit/management.ts | 4 +- .../server/modules/core/services/streams.js | 8 +- .../modules/core/services/streams/clone.ts | 3 +- .../core/services/streams/management.ts | 4 +- .../services/streams/streamAccessService.js | 5 +- .../modules/core/tests/branches.spec.js | 5 +- .../server/modules/core/tests/commits.spec.js | 3 +- .../core/tests/discoverableStreams.spec.ts | 7 +- .../server/modules/core/tests/streams.spec.ts | 3 +- .../server/modules/core/tests/users.spec.js | 12 +-- .../server/modules/cross-server-sync/index.ts | 3 +- .../cross-server-sync/services/commit.ts | 5 +- packages/server/modules/fileuploads/index.ts | 3 +- .../services/handlers/activityDigest.ts | 4 +- .../services/handlers/mentionedInComment.ts | 8 +- .../handlers/newStreamAccessRequest.ts | 7 +- .../handlers/streamAccessRequestApproved.ts | 8 +- packages/server/modules/previews/index.ts | 6 +- .../modules/previews/services/management.ts | 7 +- .../graph/resolvers/serverInvites.ts | 3 +- .../services/coreEmailContents.ts | 4 +- .../services/coreFinalization.ts | 6 +- .../services/coreResourceCollection.ts | 4 +- .../services/projectInviteManagement.ts | 4 +- packages/server/modules/shared/index.ts | 4 +- .../server/modules/shared/services/auth.ts | 4 +- .../modules/webhooks/services/webhooks.ts | 8 +- .../modules/webhooks/tests/webhooks.spec.js | 3 +- .../workspaces/events/eventListener.ts | 7 +- .../workspaces/graph/resolvers/workspaces.ts | 7 +- .../modules/workspaces/services/invites.ts | 4 +- .../workspaces/tests/helpers/creation.ts | 3 +- .../tests/integration/invites.graph.spec.ts | 4 +- .../test/speckle-helpers/inviteHelper.ts | 3 +- 66 files changed, 272 insertions(+), 169 deletions(-) create mode 100644 packages/server/modules/core/domain/streams/operations.ts create mode 100644 packages/server/modules/core/domain/streams/types.ts diff --git a/packages/server/modules/accessrequests/graph/resolvers/index.ts b/packages/server/modules/accessrequests/graph/resolvers/index.ts index 64449caec..35c2fe463 100644 --- a/packages/server/modules/accessrequests/graph/resolvers/index.ts +++ b/packages/server/modules/accessrequests/graph/resolvers/index.ts @@ -20,13 +20,14 @@ import { import { Resolvers } from '@/modules/core/graph/generated/graphql' import { mapStreamRoleToValue } from '@/modules/core/helpers/graphTypes' import { Roles } from '@/modules/core/helpers/mainConstants' -import { getStream } from '@/modules/core/repositories/streams' +import { getStreamFactory } from '@/modules/core/repositories/streams' import { addOrUpdateStreamCollaborator, validateStreamAccess } from '@/modules/core/services/streams/streamAccessService' import { LogicError } from '@/modules/shared/errors' +const getStream = getStreamFactory({ db }) const getUserProjectAccessRequest = getUserProjectAccessRequestFactory({ getUsersPendingAccessRequest: getUsersPendingAccessRequestFactory({ db }) }) diff --git a/packages/server/modules/accessrequests/services/stream.ts b/packages/server/modules/accessrequests/services/stream.ts index 6ab55757a..d0dcb835b 100644 --- a/packages/server/modules/accessrequests/services/stream.ts +++ b/packages/server/modules/accessrequests/services/stream.ts @@ -13,7 +13,6 @@ import { import { StreamInvalidAccessError } from '@/modules/core/errors/stream' import { TokenResourceIdentifier } from '@/modules/core/domain/tokens/types' import { Roles, StreamRoles } from '@/modules/core/helpers/mainConstants' -import { getStream } from '@/modules/core/repositories/streams' import { addOrUpdateStreamCollaborator, validateStreamAccess @@ -35,6 +34,7 @@ import { GetUserStreamAccessRequest, RequestProjectAccess } from '@/modules/accessrequests/domain/operations' +import { GetStream } from '@/modules/core/domain/streams/operations' function buildStreamAccessRequestGraphQLReturn( record: ServerAccessRequestRecord @@ -83,7 +83,7 @@ export const getUserStreamAccessRequestFactory = export const requestProjectAccessFactory = (deps: { getUserStreamAccessRequest: GetUserStreamAccessRequest - getStream: typeof getStream + getStream: GetStream createNewRequest: CreateNewRequest accessRequestsEmitter: (typeof AccessRequestsEmitter)['emit'] }): RequestProjectAccess => diff --git a/packages/server/modules/accessrequests/tests/projectAccessRequests.spec.ts b/packages/server/modules/accessrequests/tests/projectAccessRequests.spec.ts index d56558baf..69b003947 100644 --- a/packages/server/modules/accessrequests/tests/projectAccessRequests.spec.ts +++ b/packages/server/modules/accessrequests/tests/projectAccessRequests.spec.ts @@ -21,7 +21,10 @@ import { import { StreamAccessUpdateError } from '@/modules/core/errors/stream' import { mapStreamRoleToValue } from '@/modules/core/helpers/graphTypes' import { Roles } from '@/modules/core/helpers/mainConstants' -import { getStream, getStreamCollaborators } from '@/modules/core/repositories/streams' +import { + getStreamCollaborators, + getStreamFactory +} from '@/modules/core/repositories/streams' import { addOrUpdateStreamCollaborator, removeStreamCollaborator @@ -48,6 +51,7 @@ import { BasicTestStream, createTestStreams } from '@/test/speckle-helpers/strea import { expect } from 'chai' import { noop } from 'lodash' +const getStream = getStreamFactory({ db }) const requestProjectAccess = requestProjectAccessFactory({ getUserStreamAccessRequest: getUserStreamAccessRequestFactory({ getUserProjectAccessRequest: getUserProjectAccessRequestFactory({ diff --git a/packages/server/modules/accessrequests/tests/streamAccessRequests.spec.ts b/packages/server/modules/accessrequests/tests/streamAccessRequests.spec.ts index 1a061dcfb..c124b16f4 100644 --- a/packages/server/modules/accessrequests/tests/streamAccessRequests.spec.ts +++ b/packages/server/modules/accessrequests/tests/streamAccessRequests.spec.ts @@ -23,7 +23,10 @@ import { import { StreamAccessUpdateError } from '@/modules/core/errors/stream' import { mapStreamRoleToValue } from '@/modules/core/helpers/graphTypes' import { Roles } from '@/modules/core/helpers/mainConstants' -import { getStream, getStreamCollaborators } from '@/modules/core/repositories/streams' +import { + getStreamCollaborators, + getStreamFactory +} from '@/modules/core/repositories/streams' import { addOrUpdateStreamCollaborator, removeStreamCollaborator @@ -50,6 +53,7 @@ import { BasicTestStream, createTestStreams } from '@/test/speckle-helpers/strea import { expect } from 'chai' import { noop } from 'lodash' +const getStream = getStreamFactory({ db }) const requestStreamAccess = requestStreamAccessFactory({ requestProjectAccess: requestProjectAccessFactory({ getUserStreamAccessRequest: getUserStreamAccessRequestFactory({ diff --git a/packages/server/modules/activitystream/index.ts b/packages/server/modules/activitystream/index.ts index 36d05c1e2..2581cdf9d 100644 --- a/packages/server/modules/activitystream/index.ts +++ b/packages/server/modules/activitystream/index.ts @@ -6,7 +6,6 @@ import { activitiesLogger, moduleLogger } from '@/logging/logging' import { weeklyEmailDigestEnabled } from '@/modules/shared/helpers/envHelper' import { getEventBus } from '@/modules/shared/services/eventBus' import { handleServerInvitesActivitiesFactory } from '@/modules/activitystream/services/serverInvitesActivity' -import { getStream } from '@/modules/core/repositories/streams' import { sendActivityNotificationsFactory } from '@/modules/activitystream/services/summary' import { getActiveUserStreamsFactory, @@ -15,6 +14,7 @@ import { import { db } from '@/db/knex' import { addStreamInviteSentOutActivityFactory } from '@/modules/activitystream/services/streamActivity' import { publish } from '@/modules/shared/utils/subscriptions' +import { getStreamFactory } from '@/modules/core/repositories/streams' let scheduledTask: ReturnType | null = null let quitEventListeners: Optional> = @@ -24,7 +24,7 @@ const initializeEventListeners = () => { const handleServerInvitesActivities = handleServerInvitesActivitiesFactory({ eventBus: getEventBus(), logger: activitiesLogger, - getStream, + getStream: getStreamFactory({ db }), addStreamInviteSentOutActivity: addStreamInviteSentOutActivityFactory({ saveActivity: saveActivityFactory({ db }), publish diff --git a/packages/server/modules/activitystream/repositories/index.ts b/packages/server/modules/activitystream/repositories/index.ts index 8cfba0b67..e801e052d 100644 --- a/packages/server/modules/activitystream/repositories/index.ts +++ b/packages/server/modules/activitystream/repositories/index.ts @@ -18,12 +18,12 @@ import { import { StreamAcl, StreamActivity } from '@/modules/core/dbSchema' import { Roles } from '@/modules/core/helpers/mainConstants' import { StreamAclRecord } from '@/modules/core/helpers/types' -import { getStream } from '@/modules/core/repositories/streams' 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' const tables = { streamActivity: (db: Knex) => @@ -253,7 +253,7 @@ export const saveActivityFactory = await dispatchStreamEventFactory({ db, getServerInfo, - getStream, + getStream: getStreamFactory({ db }), createWebhookEvent: createWebhookEventFactory({ db }), getUser })({ diff --git a/packages/server/modules/activitystream/services/serverInvitesActivity.ts b/packages/server/modules/activitystream/services/serverInvitesActivity.ts index d62700807..e004e952d 100644 --- a/packages/server/modules/activitystream/services/serverInvitesActivity.ts +++ b/packages/server/modules/activitystream/services/serverInvitesActivity.ts @@ -7,12 +7,12 @@ import { resolveTarget } from '@/modules/serverinvites/helpers/core' import { EventBus } from '@/modules/shared/services/eventBus' -import { getStream } from '@/modules/core/repositories/streams' import { Logger } from '@/logging/logging' import { AddStreamInviteSentOutActivity } from '@/modules/activitystream/domain/operations' +import { GetStream } from '@/modules/core/domain/streams/operations' type OnServerInviteCreatedFactoryDeps = { - getStream: typeof getStream + getStream: GetStream logger: Logger addStreamInviteSentOutActivity: AddStreamInviteSentOutActivity } diff --git a/packages/server/modules/activitystream/services/summary.ts b/packages/server/modules/activitystream/services/summary.ts index 540099ee6..c2d106848 100644 --- a/packages/server/modules/activitystream/services/summary.ts +++ b/packages/server/modules/activitystream/services/summary.ts @@ -3,19 +3,19 @@ import { NotificationType } from '@/modules/notifications/helpers/types' import { getUser } from '@/modules/core/repositories/users' -import { getStream as getStreamService } from '@/modules/core/services/streams' import { CreateActivitySummary, GetActiveUserStreams, GetActivity } from '@/modules/activitystream/domain/operations' +import { GetStream } from '@/modules/core/domain/streams/operations' export const createActivitySummaryFactory = ({ getStream, getActivity }: { - getStream: typeof getStreamService + getStream: GetStream getActivity: GetActivity }): CreateActivitySummary => async ({ diff --git a/packages/server/modules/activitystream/tests/activitySummary.spec.ts b/packages/server/modules/activitystream/tests/activitySummary.spec.ts index 34a64f46d..34b6ebb72 100644 --- a/packages/server/modules/activitystream/tests/activitySummary.spec.ts +++ b/packages/server/modules/activitystream/tests/activitySummary.spec.ts @@ -6,7 +6,7 @@ import { sendActivityNotificationsFactory } from '@/modules/activitystream/services/summary' import { expect } from 'chai' -import { createStream, deleteStream, getStream } from '@/modules/core/services/streams' +import { createStream, deleteStream } from '@/modules/core/services/streams' import { ActionTypes, ResourceTypes } from '@/modules/activitystream/helpers/types' import { ActivityDigestMessage, @@ -19,11 +19,13 @@ import { saveActivityFactory } from '@/modules/activitystream/repositories' import { db } from '@/db/knex' +import { getStreamFactory } from '@/modules/core/repositories/streams' const cleanup = async () => { await truncateTables([StreamActivity.name, Users.name]) } +const getStream = getStreamFactory({ db }) const saveActivity = saveActivityFactory({ db }) const createActivitySummary = createActivitySummaryFactory({ getStream, diff --git a/packages/server/modules/automate/rest/logStream.ts b/packages/server/modules/automate/rest/logStream.ts index 038983056..da5476100 100644 --- a/packages/server/modules/automate/rest/logStream.ts +++ b/packages/server/modules/automate/rest/logStream.ts @@ -6,7 +6,7 @@ import { getAutomationRunWithTokenFactory } from '@/modules/automate/repositories/automations' import { corsMiddleware } from '@/modules/core/configs/cors' -import { getStream } from '@/modules/core/repositories/streams' +import { getStreamFactory } from '@/modules/core/repositories/streams' import { validateRequiredStreamFactory, validateResourceAccess, @@ -29,7 +29,7 @@ export default (app: Application) => { })({ requiredRole: Roles.Server.Guest }), validateScope({ requiredScope: Scopes.Streams.Read }), validateRequiredStreamFactory({ - getStream, + getStream: getStreamFactory({ db }), getAutomationProject: getAutomationProjectFactory({ db }) }), validateStreamRoleBuilderFactory({ getRoles: getRolesFactory({ db }) })({ diff --git a/packages/server/modules/blobstorage/index.js b/packages/server/modules/blobstorage/index.js index 641088a14..996ccd53e 100644 --- a/packages/server/modules/blobstorage/index.js +++ b/packages/server/modules/blobstorage/index.js @@ -41,13 +41,14 @@ const { markUploadOverFileSizeLimitFactory, fullyDeleteBlobFactory } = require('@/modules/blobstorage/services/management') -const { getStream } = require('@/modules/core/repositories/streams') const { getRolesFactory } = require('@/modules/shared/repositories/roles') const { getAutomationProjectFactory } = require('@/modules/automate/repositories/automations') const { adminOverrideEnabled } = require('@/modules/shared/helpers/envHelper') +const { getStreamFactory } = require('@/modules/core/repositories/streams') +const getStream = getStreamFactory({ db }) const getAllStreamBlobIds = getAllStreamBlobIdsFactory({ db }) const updateBlob = updateBlobFactory({ db }) const uploadFileStream = uploadFileStreamFactory({ diff --git a/packages/server/modules/cli/commands/db/seed/commits.ts b/packages/server/modules/cli/commands/db/seed/commits.ts index a8546ff4c..184d6b1a4 100644 --- a/packages/server/modules/cli/commands/db/seed/commits.ts +++ b/packages/server/modules/cli/commands/db/seed/commits.ts @@ -1,5 +1,6 @@ +import { db } from '@/db/knex' import { cliLogger } from '@/logging/logging' -import { getStream } from '@/modules/core/repositories/streams' +import { getStreamFactory } from '@/modules/core/repositories/streams' import { getUser } from '@/modules/core/repositories/users' import { BasicTestCommit, createTestCommits } from '@/test/speckle-helpers/commitHelper' import dayjs from 'dayjs' @@ -28,6 +29,8 @@ const command: CommandModule< } }, handler: async (argv) => { + const getStream = getStreamFactory({ db }) + const count = argv.count const streamId = argv.streamId const authorId = argv.authorId diff --git a/packages/server/modules/cli/commands/download/commit.ts b/packages/server/modules/cli/commands/download/commit.ts index 8698e840d..9cf4bb30f 100644 --- a/packages/server/modules/cli/commands/download/commit.ts +++ b/packages/server/modules/cli/commands/download/commit.ts @@ -2,8 +2,8 @@ import { CommandModule } from 'yargs' import { downloadCommitFactory } from '@/modules/cross-server-sync/services/commit' import { cliLogger } from '@/logging/logging' import { - getStream, getStreamCollaborators, + getStreamFactory, markCommitStreamUpdated } from '@/modules/core/repositories/streams' import { @@ -92,6 +92,7 @@ const command: CommandModule< } }, handler: async (argv) => { + const getStream = getStreamFactory({ db }) const getObject = getObjectFactory({ db }) const getStreamObjects = getStreamObjectsFactory({ db }) const markCommentViewed = markCommentViewedFactory({ db }) diff --git a/packages/server/modules/cli/commands/download/project.ts b/packages/server/modules/cli/commands/download/project.ts index ac2561d2d..35b9bb2b8 100644 --- a/packages/server/modules/cli/commands/download/project.ts +++ b/packages/server/modules/cli/commands/download/project.ts @@ -3,8 +3,8 @@ import { cliLogger } from '@/logging/logging' import { downloadProjectFactory } from '@/modules/cross-server-sync/services/project' import { downloadCommitFactory } from '@/modules/cross-server-sync/services/commit' import { - getStream, getStreamCollaborators, + getStreamFactory, markCommitStreamUpdated } from '@/modules/core/repositories/streams' import { @@ -90,6 +90,7 @@ const command: CommandModule< } }, handler: async (argv) => { + const getStream = getStreamFactory({ db }) const getObject = getObjectFactory({ db }) const getStreamObjects = getStreamObjectsFactory({ db }) diff --git a/packages/server/modules/comments/graph/resolvers/comments.ts b/packages/server/modules/comments/graph/resolvers/comments.ts index efa4d0c2c..a3b2a51ee 100644 --- a/packages/server/modules/comments/graph/resolvers/comments.ts +++ b/packages/server/modules/comments/graph/resolvers/comments.ts @@ -1,6 +1,5 @@ import { pubsub } from '@/modules/shared/utils/subscriptions' import { ForbiddenError } from '@/modules/shared/errors' -import { getStream } from '@/modules/core/services/streams' import { Roles } from '@/modules/core/helpers/mainConstants' import { streamResourceCheckFactory, @@ -96,7 +95,9 @@ import { getStreamBranchesByNameFactory } from '@/modules/core/repositories/branches' import { getStreamObjectsFactory } from '@/modules/core/repositories/objects' +import { getStreamFactory } from '@/modules/core/repositories/streams' +const getStream = getStreamFactory({ db }) const streamResourceCheck = streamResourceCheckFactory({ checkStreamResourceAccess: checkStreamResourceAccessFactory({ db }) }) diff --git a/packages/server/modules/comments/services/index.ts b/packages/server/modules/comments/services/index.ts index 08cbde78b..f90c4aa04 100644 --- a/packages/server/modules/comments/services/index.ts +++ b/packages/server/modules/comments/services/index.ts @@ -24,7 +24,7 @@ import { ValidateInputAttachments } from '@/modules/comments/domain/operations' import { ResourceType } from '@/modules/comments/domain/types' -import { getStream } from '@/modules/core/repositories/streams' +import { GetStream } from '@/modules/core/domain/streams/operations' export const streamResourceCheckFactory = (deps: { @@ -237,7 +237,7 @@ export const editCommentFactory = export const archiveCommentFactory = (deps: { getComment: GetComment - getStream: typeof getStream + getStream: GetStream updateComment: UpdateComment }) => async ({ diff --git a/packages/server/modules/comments/services/management.ts b/packages/server/modules/comments/services/management.ts index aa0a094a8..222368494 100644 --- a/packages/server/modules/comments/services/management.ts +++ b/packages/server/modules/comments/services/management.ts @@ -1,7 +1,6 @@ import { ensureError, Roles, SpeckleViewer } from '@speckle/shared' import { AuthContext } from '@/modules/shared/authz' import { ForbiddenError } from '@/modules/shared/errors' -import { getStream } from '@/modules/core/repositories/streams' import { StreamInvalidAccessError } from '@/modules/core/errors/stream' import { CreateCommentInput, @@ -42,9 +41,10 @@ import { UpdateComment, ValidateInputAttachments } from '@/modules/comments/domain/operations' +import { GetStream } from '@/modules/core/domain/streams/operations' type AuthorizeProjectCommentsAccessDeps = { - getStream: typeof getStream + getStream: GetStream adminOverrideEnabled: typeof adminOverrideEnabled } @@ -289,7 +289,7 @@ export const editCommentAndNotifyFactory = export const archiveCommentAndNotifyFactory = (deps: { getComment: GetComment - getStream: typeof getStream + getStream: GetStream updateComment: UpdateComment addCommentArchivedActivity: typeof addCommentArchivedActivity }): ArchiveCommentAndNotify => diff --git a/packages/server/modules/comments/tests/comments.spec.js b/packages/server/modules/comments/tests/comments.spec.js index 7ab7f3920..9fc91e1c9 100644 --- a/packages/server/modules/comments/tests/comments.spec.js +++ b/packages/server/modules/comments/tests/comments.spec.js @@ -56,8 +56,8 @@ const { db } = require('@/db/knex') const { getBlobsFactory } = require('@/modules/blobstorage/repositories') const { CommentsEmitter } = require('@/modules/comments/events/emitter') const { - getStream, - markCommitStreamUpdated + markCommitStreamUpdated, + getStreamFactory } = require('@/modules/core/repositories/streams') const { createCommitByBranchIdFactory, @@ -79,6 +79,7 @@ const { } = require('@/modules/activitystream/services/commitActivity') const { getObjectFactory } = require('@/modules/core/repositories/objects') +const getStream = getStreamFactory({ db }) const streamResourceCheck = streamResourceCheckFactory({ checkStreamResourceAccess: checkStreamResourceAccessFactory({ db }) }) diff --git a/packages/server/modules/core/domain/streams/operations.ts b/packages/server/modules/core/domain/streams/operations.ts new file mode 100644 index 000000000..4ab040bef --- /dev/null +++ b/packages/server/modules/core/domain/streams/operations.ts @@ -0,0 +1,21 @@ +import { StreamWithOptionalRole } from '@/modules/core/domain/streams/types' +import { Optional } from '@speckle/shared' +import { Knex } from 'knex' + +export type GetStreams = ( + streamIds: string[], + options?: Partial<{ + userId: string + trx: Knex.Transaction + }> +) => Promise + +export type GetStream = ( + params: { + streamId?: string + userId?: string + }, + options?: Partial<{ + trx: Knex.Transaction + }> +) => Promise> diff --git a/packages/server/modules/core/domain/streams/types.ts b/packages/server/modules/core/domain/streams/types.ts new file mode 100644 index 000000000..825b475da --- /dev/null +++ b/packages/server/modules/core/domain/streams/types.ts @@ -0,0 +1,12 @@ +import { StreamRecord } from '@/modules/core/helpers/types' +import { StreamRoles } from '@speckle/shared' + +export type Stream = StreamRecord +export type Project = Stream + +export type StreamWithOptionalRole = Stream & { + /** + * Available, if query joined this data StreamAcl + */ + role?: StreamRoles +} diff --git a/packages/server/modules/core/graph/directives/hasRole.ts b/packages/server/modules/core/graph/directives/hasRole.ts index 3aee28b99..ad411854d 100644 --- a/packages/server/modules/core/graph/directives/hasRole.ts +++ b/packages/server/modules/core/graph/directives/hasRole.ts @@ -18,8 +18,9 @@ import { getUserAclRoleFactory, getUserServerRoleFactory } from '@/modules/shared/repositories/acl' -import { getStream } from '@/modules/core/repositories/streams' +import { getStreamFactory } from '@/modules/core/repositories/streams' +const getStream = getStreamFactory({ db }) const throwForNotHavingServerRole = throwForNotHavingServerRoleFactory({ validateServerRole: validateServerRoleBuilderFactory({ getRoles: getRolesFactory({ db }) diff --git a/packages/server/modules/core/graph/resolvers/branches.js b/packages/server/modules/core/graph/resolvers/branches.js index d9edcddec..caccf8bfa 100644 --- a/packages/server/modules/core/graph/resolvers/branches.js +++ b/packages/server/modules/core/graph/resolvers/branches.js @@ -33,8 +33,8 @@ const { addBranchDeletedActivity } = require('@/modules/activitystream/services/branchActivity') const { - getStream, - markBranchStreamUpdated + markBranchStreamUpdated, + getStreamFactory } = require('@/modules/core/repositories/streams') const { ModelsEmitter } = require('@/modules/core/events/modelsEmitter') @@ -43,6 +43,7 @@ const BRANCH_CREATED = BranchPubsubEvents.BranchCreated const BRANCH_UPDATED = BranchPubsubEvents.BranchUpdated const BRANCH_DELETED = BranchPubsubEvents.BranchDeleted +const getStream = getStreamFactory({ db }) const getBranchById = getBranchByIdFactory({ db }) const getStreamBranchByName = getStreamBranchByNameFactory({ db }) const createBranchAndNotify = createBranchAndNotifyFactory({ diff --git a/packages/server/modules/core/graph/resolvers/commits.js b/packages/server/modules/core/graph/resolvers/commits.js index 3965bdf59..842b7b69f 100644 --- a/packages/server/modules/core/graph/resolvers/commits.js +++ b/packages/server/modules/core/graph/resolvers/commits.js @@ -57,9 +57,9 @@ const { const { db } = require('@/db/knex') const { markCommitStreamUpdated, - getStream, getCommitStream, - getStreams + getStreamFactory, + getStreamsFactory } = require('@/modules/core/repositories/streams') const { markCommitBranchUpdatedFactory, @@ -81,6 +81,8 @@ const COMMIT_CREATED = CommitPubsubEvents.CommitCreated const COMMIT_UPDATED = CommitPubsubEvents.CommitUpdated const COMMIT_DELETED = CommitPubsubEvents.CommitDeleted +const getStream = getStreamFactory({ db }) +const getStreams = getStreamsFactory({ db }) const deleteCommitAndNotify = deleteCommitAndNotifyFactory({ getCommit: getCommitFactory({ db }), markCommitStreamUpdated, diff --git a/packages/server/modules/core/graph/resolvers/models.ts b/packages/server/modules/core/graph/resolvers/models.ts index f65d0d07f..f17e9c903 100644 --- a/packages/server/modules/core/graph/resolvers/models.ts +++ b/packages/server/modules/core/graph/resolvers/models.ts @@ -52,9 +52,13 @@ import { addBranchDeletedActivity, addBranchUpdatedActivity } from '@/modules/activitystream/services/branchActivity' -import { getStream, markBranchStreamUpdated } from '@/modules/core/repositories/streams' +import { + getStreamFactory, + markBranchStreamUpdated +} from '@/modules/core/repositories/streams' import { ModelsEmitter } from '@/modules/core/events/modelsEmitter' +const getStream = getStreamFactory({ db }) const getStreamObjects = getStreamObjectsFactory({ db }) const getViewerResourceGroups = getViewerResourceGroupsFactory({ getStreamObjects, diff --git a/packages/server/modules/core/graph/resolvers/projects.ts b/packages/server/modules/core/graph/resolvers/projects.ts index 055aa21b2..364626335 100644 --- a/packages/server/modules/core/graph/resolvers/projects.ts +++ b/packages/server/modules/core/graph/resolvers/projects.ts @@ -1,3 +1,4 @@ +import { db } from '@/db/knex' import { RateLimitError } from '@/modules/core/errors/ratelimit' import { StreamNotFoundError } from '@/modules/core/errors/stream' import { WorkspacesModuleDisabledError } from '@/modules/core/errors/workspaces' @@ -13,7 +14,7 @@ import { getUserStreamsCount, getUserStreams, getStreamCollaborators, - getStream + getStreamFactory } from '@/modules/core/repositories/streams' import { getRateLimitResult, @@ -36,6 +37,8 @@ import { } from '@/modules/shared/utils/subscriptions' import { has } from 'lodash' +const getStream = getStreamFactory({ db }) + export = { Query: { async project(_parent, args, context) { diff --git a/packages/server/modules/core/graph/resolvers/streams.ts b/packages/server/modules/core/graph/resolvers/streams.ts index 1a29f72d9..e371993fa 100644 --- a/packages/server/modules/core/graph/resolvers/streams.ts +++ b/packages/server/modules/core/graph/resolvers/streams.ts @@ -1,5 +1,4 @@ import { - getStream, getStreams, getStreamUsers, favoriteStream, @@ -24,7 +23,8 @@ import { getDiscoverableStreams } from '@/modules/core/services/streams/discover import { get } from 'lodash' import { getUserStreamsCount, - getUserStreams + getUserStreams, + getStreamFactory } from '@/modules/core/repositories/streams' import { deleteStreamAndNotify, @@ -50,6 +50,8 @@ import { getInvitationTargetUsersFactory } from '@/modules/serverinvites/service import { getUsers } from '@/modules/core/repositories/users' import { BadRequestError } from '@/modules/shared/errors' +const getStream = getStreamFactory({ db }) + const getUserStreamsCore = async ( forOtherUser: boolean, parent: { id: string }, diff --git a/packages/server/modules/core/graph/resolvers/versions.ts b/packages/server/modules/core/graph/resolvers/versions.ts index 185e621f3..4c9a94cad 100644 --- a/packages/server/modules/core/graph/resolvers/versions.ts +++ b/packages/server/modules/core/graph/resolvers/versions.ts @@ -41,8 +41,8 @@ import { } from '@/modules/core/repositories/branches' import { getCommitStream, - getStream, - getStreams, + getStreamFactory, + getStreamsFactory, markCommitStreamUpdated } from '@/modules/core/repositories/streams' import { VersionsEmitter } from '@/modules/core/events/versionsEmitter' @@ -53,6 +53,8 @@ import { } from '@/modules/activitystream/services/commitActivity' import { getObjectFactory } from '@/modules/core/repositories/objects' +const getStream = getStreamFactory({ db }) +const getStreams = getStreamsFactory({ db }) const getObject = getObjectFactory({ db }) const createCommitByBranchId = createCommitByBranchIdFactory({ createCommit: createCommitFactory({ db }), diff --git a/packages/server/modules/core/loaders.ts b/packages/server/modules/core/loaders.ts index 387a31ac5..9ff4e97eb 100644 --- a/packages/server/modules/core/loaders.ts +++ b/packages/server/modules/core/loaders.ts @@ -3,12 +3,12 @@ import { getBatchUserFavoriteData, getBatchStreamFavoritesCounts, getOwnedFavoritesCountByUserIds, - getStreams, getStreamRoles, getStreamsSourceApps, getCommitStreams, StreamWithCommitId, - getUserStreamCounts + getUserStreamCounts, + getStreamsFactory } from '@/modules/core/repositories/streams' import { UserWithOptionalRole, getUsers } from '@/modules/core/repositories/users' import { keyBy } from 'lodash' @@ -88,6 +88,7 @@ import { getAppScopesFactory } from '@/modules/auth/repositories' const simpleTupleCacheKey = (key: [string, string]) => `${key[0]}:${key[1]}` +const getStreams = getStreamsFactory({ db }) const getStreamPendingModels = getStreamPendingModelsFactory({ db }) const getAppScopes = getAppScopesFactory({ db }) const getAutomations = getAutomationsFactory({ db }) diff --git a/packages/server/modules/core/repositories/streams.ts b/packages/server/modules/core/repositories/streams.ts index fa86a50ff..bd1f1aaf0 100644 --- a/packages/server/modules/core/repositories/streams.ts +++ b/packages/server/modules/core/repositories/streams.ts @@ -57,7 +57,7 @@ import { } from '@/modules/core/errors/stream' import { metaHelpers } from '@/modules/core/helpers/meta' import { removePrivateFields } from '@/modules/core/helpers/userHelper' -import { db as defaultKnexInstance } from '@/db/knex' +import { db, db as defaultKnexInstance } from '@/db/knex' import { DeleteProjectRole, GetProject, @@ -66,17 +66,13 @@ import { GetRolesByUserId, UpsertProjectRole } from '@/modules/core/domain/projects/operations' +import { StreamWithOptionalRole } from '@/modules/core/domain/streams/types' +import { GetStream, GetStreams } from '@/modules/core/domain/streams/operations' +export type { StreamWithOptionalRole } const tables = { - streams: (db: Knex) => db('streams'), - streamAcl: (db: Knex) => db('stream_acl') -} - -export type StreamWithOptionalRole = StreamRecord & { - /** - * Available, if query joined this data StreamAcl - */ - role?: StreamRoles + streams: (db: Knex) => db(Streams.name), + streamAcl: (db: Knex) => db(StreamAcl.name) } /** @@ -130,56 +126,62 @@ const generateStreamName = () => { /** * Get multiple streams. If userId is specified, the role will be resolved as well. */ -export async function getStreams( - streamIds: string[], - options: Partial<{ userId: string; trx: Knex.Transaction }> = {} -) { - const { userId, trx } = options - if (!streamIds?.length) throw new InvalidArgumentError('Empty stream IDs') +export const getStreamsFactory = + (deps: { db: Knex }): GetStreams => + async ( + streamIds: string[], + options: Partial<{ userId: string; trx: Knex.Transaction }> = {} + ) => { + const { userId, trx } = options + if (!streamIds?.length) throw new InvalidArgumentError('Empty stream IDs') - const q = Streams.knex().whereIn(Streams.col.id, streamIds) + const q = tables.streams(deps.db).whereIn(Streams.col.id, streamIds) - if (userId) { - q.select([ - ...Object.values(Streams.col), - // Getting first role from grouped results - knex.raw(`(array_agg("stream_acl"."role"))[1] as role`) - ]) - q.leftJoin(StreamAcl.name, function () { - this.on(StreamAcl.col.resourceId, Streams.col.id).andOnVal( - StreamAcl.col.userId, - userId - ) - }) - q.groupBy(Streams.col.id) + if (userId) { + q.select([ + ...Object.values(Streams.col), + // Getting first role from grouped results + knex.raw(`(array_agg("stream_acl"."role"))[1] as role`) + ]) + q.leftJoin(StreamAcl.name, function () { + this.on(StreamAcl.col.resourceId, Streams.col.id).andOnVal( + StreamAcl.col.userId, + userId + ) + }) + q.groupBy(Streams.col.id) + } + + if (trx) { + q.transacting(trx) + } + + return await q } - if (trx) { - q.transacting(trx) - } - - return await q -} - /** * Get a single stream. If userId is specified, the role will be resolved as well. */ -export async function getStream( - params: { streamId?: string; userId?: string }, - options?: Partial<{ trx: Knex.Transaction }> -): Promise> { - const { streamId, userId } = params - if (!streamId) throw new InvalidArgumentError('Invalid stream ID') +export const getStreamFactory = + (deps: { db: Knex }): GetStream => + async ( + params: { streamId?: string; userId?: string }, + options?: Partial<{ trx: Knex.Transaction }> + ): Promise> => { + const { streamId, userId } = params + if (!streamId) throw new InvalidArgumentError('Invalid stream ID') - const streams = await getStreams([streamId], { userId, ...(options || {}) }) - return >streams[0] -} + const streams = await getStreamsFactory(deps)([streamId], { + userId, + ...(options || {}) + }) + return >streams[0] + } -// TODO: Inject db export const getProjectFactory = - (): GetProject => + (deps: { db: Knex }): GetProject => async ({ projectId }) => { - const project = await getStream({ streamId: projectId }) + const project = await getStreamFactory(deps)({ streamId: projectId }) if (!project) { throw new StreamNotFoundError() @@ -1181,7 +1183,7 @@ export async function revokeStreamPermissions( * Mark stream as the onboarding base stream from which user onboarding streams will be cloned */ export async function markOnboardingBaseStream(streamId: string, version: string) { - const stream = await getStream({ streamId }) + const stream = await getStreamFactory({ db })({ streamId }) if (!stream) { throw new Error(`Stream ${streamId} not found`) } diff --git a/packages/server/modules/core/rest/authUtils.js b/packages/server/modules/core/rest/authUtils.js index 623d07011..18573851e 100644 --- a/packages/server/modules/core/rest/authUtils.js +++ b/packages/server/modules/core/rest/authUtils.js @@ -1,13 +1,15 @@ 'use strict' const { validateScopes, authorizeResolver } = require('@/modules/shared') -const { getStream } = require('../services/streams') const { Roles, Scopes } = require('@speckle/shared') const { throwForNotHavingServerRole } = require('@/modules/shared/authz') const { DatabaseError } = require('@/modules/shared/errors') +const { getStreamFactory } = require('@/modules/core/repositories/streams') +const { db } = require('@/db/knex') module.exports = { async validatePermissionsReadStream(streamId, req) { + const getStream = getStreamFactory({ db }) const stream = await getStream({ streamId, userId: req.context.userId }) if (stream?.isPublic) return { result: true, status: 200 } diff --git a/packages/server/modules/core/services/branch/management.ts b/packages/server/modules/core/services/branch/management.ts index 0198418b4..033e7bcae 100644 --- a/packages/server/modules/core/services/branch/management.ts +++ b/packages/server/modules/core/services/branch/management.ts @@ -19,7 +19,7 @@ import { } from '@/modules/core/graph/generated/graphql' import { BranchRecord } from '@/modules/core/helpers/types' -import { getStream, markBranchStreamUpdated } from '@/modules/core/repositories/streams' +import { markBranchStreamUpdated } from '@/modules/core/repositories/streams' import { has } from 'lodash' import { isBranchDeleteInput, isBranchUpdateInput } from '@/modules/core/helpers/branch' import { ModelsEmitter, ModelsEventsEmitter } from '@/modules/core/events/modelsEmitter' @@ -33,6 +33,7 @@ import { UpdateBranch, UpdateBranchAndNotify } from '@/modules/core/domain/branches/operations' +import { GetStream } from '@/modules/core/domain/streams/operations' const isBranchCreateInput = ( i: BranchCreateInput | CreateModelInput @@ -109,7 +110,7 @@ export const updateBranchAndNotifyFactory = export const deleteBranchAndNotifyFactory = (deps: { - getStream: typeof getStream + getStream: GetStream getBranchById: GetBranchById modelsEventsEmitter: ModelsEventsEmitter markBranchStreamUpdated: typeof markBranchStreamUpdated diff --git a/packages/server/modules/core/services/commit/batchCommitActions.ts b/packages/server/modules/core/services/commit/batchCommitActions.ts index 83bac46f4..94b4cbf9e 100644 --- a/packages/server/modules/core/services/commit/batchCommitActions.ts +++ b/packages/server/modules/core/services/commit/batchCommitActions.ts @@ -12,6 +12,7 @@ import { MoveCommitsToBranch, ValidateAndBatchMoveCommits } from '@/modules/core/domain/commits/operations' +import { GetStreams } from '@/modules/core/domain/streams/operations' import { CommitInvalidAccessError, CommitBatchUpdateError @@ -27,7 +28,7 @@ import { deleteCommitsFactory, getCommitsFactory } from '@/modules/core/repositories/commits' -import { getStreams } from '@/modules/core/repositories/streams' +import { getStreamsFactory } from '@/modules/core/repositories/streams' import { ensureError } from '@/modules/shared/helpers/errorHelper' import { difference, groupBy, has, keyBy } from 'lodash' @@ -38,7 +39,7 @@ const isOldBatchInput = (i: CommitBatchInput): i is OldBatchInput => has(i, 'com type ValidateBatchBaseRulesDeps = { getCommits: GetCommits - getStreams: typeof getStreams + getStreams: GetStreams } /** @@ -147,7 +148,7 @@ async function validateCommitsDelete( ) { const validateBatchBaseRules = validateBatchBaseRulesFactory({ getCommits: getCommitsFactory({ db }), - getStreams + getStreams: getStreamsFactory({ db }) }) return await validateBatchBaseRules(params, userId) } diff --git a/packages/server/modules/core/services/commit/management.ts b/packages/server/modules/core/services/commit/management.ts index fc19f949f..1f41ee9a3 100644 --- a/packages/server/modules/core/services/commit/management.ts +++ b/packages/server/modules/core/services/commit/management.ts @@ -25,6 +25,7 @@ import { UpdateCommitAndNotify } from '@/modules/core/domain/commits/operations' import { GetObject } from '@/modules/core/domain/objects/operations' +import { GetStream } from '@/modules/core/domain/streams/operations' import { CommitCreateError, CommitDeleteError, @@ -45,7 +46,6 @@ import { CommitRecord } from '@/modules/core/helpers/types' import { getCommitFactory } from '@/modules/core/repositories/commits' import { getCommitStream, - getStream, markCommitStreamUpdated } from '@/modules/core/repositories/streams' import { ensureError, MaybeNullOrUndefined, Nullable, Roles } from '@speckle/shared' @@ -253,7 +253,7 @@ const isOldVersionUpdateInput = ( export const updateCommitAndNotifyFactory = (deps: { getCommit: GetCommit - getStream: typeof getStream + getStream: GetStream getCommitStream: typeof getCommitStream getStreamBranchByName: GetStreamBranchByName getCommitBranch: GetCommitBranch diff --git a/packages/server/modules/core/services/streams.js b/packages/server/modules/core/services/streams.js index 77404e3a6..3e9a98681 100644 --- a/packages/server/modules/core/services/streams.js +++ b/packages/server/modules/core/services/streams.js @@ -2,7 +2,6 @@ const _ = require('lodash') const { Streams, StreamAcl, knex } = require('@/modules/core/dbSchema') const { - getStream, getFavoritedStreams, getFavoritedStreamsCount, setStreamFavorited, @@ -10,7 +9,8 @@ const { deleteStream: deleteStreamFromDb, updateStream: updateStreamInDb, revokeStreamPermissions, - grantStreamPermissions + grantStreamPermissions, + getStreamFactory } = require('@/modules/core/repositories/streams') const { UnauthorizedError, InvalidArgumentError } = require('@/modules/shared/errors') const { dbLogger } = require('@/logging/logging') @@ -42,8 +42,6 @@ module.exports = { return id }, - getStream, - /** * @deprecated Use updateStreamAndNotify or use the repository function directly * @param {import('@/modules/core/graph/generated/graphql').StreamUpdateInput} update @@ -205,6 +203,8 @@ module.exports = { // Favorite/unfavorite the stream await setStreamFavorited({ streamId, userId, favorited }) + const getStream = getStreamFactory({ db: knex }) + // Get updated stream info return await getStream({ streamId, userId }) }, diff --git a/packages/server/modules/core/services/streams/clone.ts b/packages/server/modules/core/services/streams/clone.ts index a7fbbbc60..a5ca3a4cc 100644 --- a/packages/server/modules/core/services/streams/clone.ts +++ b/packages/server/modules/core/services/streams/clone.ts @@ -6,7 +6,7 @@ import { } from '@/modules/core/helpers/types' import { createStream, - getStream, + getStreamFactory, StreamWithOptionalRole } from '@/modules/core/repositories/streams' import { getUser, UserWithOptionalRole } from '@/modules/core/repositories/users' @@ -82,6 +82,7 @@ const prepareState = async ( userId: string, sourceStreamId: string ): Promise => { + const getStream = getStreamFactory({ db }) const targetStream = await getStream({ streamId: sourceStreamId }) if (!targetStream) { throw new StreamCloneError('Clonable source stream not found', { diff --git a/packages/server/modules/core/services/streams/management.ts b/packages/server/modules/core/services/streams/management.ts index bef1de143..f8889b0dd 100644 --- a/packages/server/modules/core/services/streams/management.ts +++ b/packages/server/modules/core/services/streams/management.ts @@ -17,7 +17,7 @@ import { StreamRecord } from '@/modules/core/helpers/types' import { createStream, deleteStream, - getStream, + getStreamFactory, updateStream } from '@/modules/core/repositories/streams' import { createAndSendInviteFactory } from '@/modules/serverinvites/services/creation' @@ -92,6 +92,7 @@ export async function createStreamReturnRecord( // Invite contributors? if (!isProjectCreateInput(params) && params.withContributors?.length) { // TODO: should be injected in the resolver + const getStream = getStreamFactory({ db }) await inviteUsersToProjectFactory({ createAndSendInvite: createAndSendInviteFactory({ findUserByTarget: findUserByTargetFactory(), @@ -188,6 +189,7 @@ export async function updateStreamAndNotify( updaterResourceAccessRules ) + const getStream = getStreamFactory({ db }) const oldStream = await getStream({ streamId: update.id, userId: updaterId }) if (!oldStream) { throw new StreamUpdateError('Stream not found', { diff --git a/packages/server/modules/core/services/streams/streamAccessService.js b/packages/server/modules/core/services/streams/streamAccessService.js index 88525adc8..14955ffa8 100644 --- a/packages/server/modules/core/services/streams/streamAccessService.js +++ b/packages/server/modules/core/services/streams/streamAccessService.js @@ -16,9 +16,9 @@ const { addStreamPermissionsAddedActivityFactory } = require('@/modules/activitystream/services/streamActivity') const { - getStream, revokeStreamPermissions, - grantStreamPermissions + grantStreamPermissions, + getStreamFactory } = require('@/modules/core/repositories/streams') const { ServerAcl } = require('@/modules/core/dbSchema') @@ -34,6 +34,7 @@ const { db } = require('@/db/knex') * @returns */ async function isStreamCollaborator(userId, streamId) { + const getStream = getStreamFactory({ db }) const stream = await getStream({ streamId, userId }) return !!stream.role } diff --git a/packages/server/modules/core/tests/branches.spec.js b/packages/server/modules/core/tests/branches.spec.js index 79a7df7fc..c68bbe0c9 100644 --- a/packages/server/modules/core/tests/branches.spec.js +++ b/packages/server/modules/core/tests/branches.spec.js @@ -30,9 +30,9 @@ const { addBranchDeletedActivity } = require('@/modules/activitystream/services/branchActivity') const { - getStream, markBranchStreamUpdated, - markCommitStreamUpdated + markCommitStreamUpdated, + getStreamFactory } = require('@/modules/core/repositories/streams') const { ModelsEmitter } = require('@/modules/core/events/modelsEmitter') const { @@ -52,6 +52,7 @@ const { getObjectFactory } = require('@/modules/core/repositories/objects') const db = knex const Commits = () => knex('commits') +const getStream = getStreamFactory({ db: knex }) const getBranchById = getBranchByIdFactory({ db: knex }) const getStreamBranchByName = getStreamBranchByNameFactory({ db: knex }) const createBranch = createBranchFactory({ db: knex }) diff --git a/packages/server/modules/core/tests/commits.spec.js b/packages/server/modules/core/tests/commits.spec.js index 90f6c7de9..238caa564 100644 --- a/packages/server/modules/core/tests/commits.spec.js +++ b/packages/server/modules/core/tests/commits.spec.js @@ -47,7 +47,7 @@ const { const { markCommitStreamUpdated, getCommitStream, - getStream + getStreamFactory } = require('@/modules/core/repositories/streams') const { addCommitDeletedActivity, @@ -57,6 +57,7 @@ const { const { VersionsEmitter } = require('@/modules/core/events/versionsEmitter') const { getObjectFactory } = require('@/modules/core/repositories/objects') +const getStream = getStreamFactory({ db }) const createBranch = createBranchFactory({ db }) const createBranchAndNotify = createBranchAndNotifyFactory({ createBranch, diff --git a/packages/server/modules/core/tests/discoverableStreams.spec.ts b/packages/server/modules/core/tests/discoverableStreams.spec.ts index 21dfcd4d1..31ecee2fa 100644 --- a/packages/server/modules/core/tests/discoverableStreams.spec.ts +++ b/packages/server/modules/core/tests/discoverableStreams.spec.ts @@ -1,6 +1,10 @@ import { buildApolloServer } from '@/app' +import { db } from '@/db/knex' import { Streams, Users } from '@/modules/core/dbSchema' -import { getStream, setStreamFavorited } from '@/modules/core/repositories/streams' +import { + getStreamFactory, + setStreamFavorited +} from '@/modules/core/repositories/streams' import { Nullable, Optional } from '@/modules/shared/helpers/typeHelper' import { BasicTestUser, createTestUsers } from '@/test/authHelper' import { @@ -27,6 +31,7 @@ import { shuffle } from 'lodash' const READABLE_DISCOVERABLE_STREAM_COUNT = 15 const cleanup = async () => await truncateTables([Streams.name, Users.name]) +const getStream = getStreamFactory({ db }) describe('Discoverable streams', () => { let apollo: ServerAndContext diff --git a/packages/server/modules/core/tests/streams.spec.ts b/packages/server/modules/core/tests/streams.spec.ts index 6634eadb4..f4a7e89f0 100644 --- a/packages/server/modules/core/tests/streams.spec.ts +++ b/packages/server/modules/core/tests/streams.spec.ts @@ -1,7 +1,6 @@ import { expect } from 'chai' import { createStream, - getStream, updateStream, deleteStream, getStreamUsers, @@ -29,6 +28,7 @@ import { } from '@/test/speckle-helpers/streamHelper' import { StreamWithOptionalRole, + getStreamFactory, markBranchStreamUpdated, markCommitStreamUpdated, revokeStreamPermissions @@ -74,6 +74,7 @@ import { VersionsEmitter } from '@/modules/core/events/versionsEmitter' import { addCommitCreatedActivity } from '@/modules/activitystream/services/commitActivity' import { getObjectFactory } from '@/modules/core/repositories/objects' +const getStream = getStreamFactory({ db }) const getStreamBranchByName = getStreamBranchByNameFactory({ db }) const createBranch = createBranchFactory({ db }) const deleteBranchAndNotify = deleteBranchAndNotifyFactory({ diff --git a/packages/server/modules/core/tests/users.spec.js b/packages/server/modules/core/tests/users.spec.js index df8efee0c..98ee10d2d 100644 --- a/packages/server/modules/core/tests/users.spec.js +++ b/packages/server/modules/core/tests/users.spec.js @@ -21,11 +21,7 @@ const { validateToken, getUserTokens } = require('../services/tokens') -const { - grantPermissionsStream, - createStream, - getStream -} = require('../services/streams') +const { grantPermissionsStream, createStream } = require('../services/streams') const { getBranchesByStreamId } = require('../services/branches') @@ -52,13 +48,17 @@ const { createCommitByBranchIdFactory, createCommitByBranchNameFactory } = require('@/modules/core/services/commit/management') -const { markCommitStreamUpdated } = require('@/modules/core/repositories/streams') +const { + markCommitStreamUpdated, + getStreamFactory +} = require('@/modules/core/repositories/streams') const { VersionsEmitter } = require('@/modules/core/events/versionsEmitter') const { addCommitCreatedActivity } = require('@/modules/activitystream/services/commitActivity') const { getObjectFactory } = require('@/modules/core/repositories/objects') +const getStream = getStreamFactory({ db }) const createBranch = createBranchFactory({ db }) const getCommit = getCommitFactory({ db }) diff --git a/packages/server/modules/cross-server-sync/index.ts b/packages/server/modules/cross-server-sync/index.ts index 645c45e82..925d679e7 100644 --- a/packages/server/modules/cross-server-sync/index.ts +++ b/packages/server/modules/cross-server-sync/index.ts @@ -42,8 +42,8 @@ import { } from '@/modules/core/repositories/objects' import { getOnboardingBaseStream, - getStream, getStreamCollaborators, + getStreamFactory, markCommitStreamUpdated, markOnboardingBaseStream } from '@/modules/core/repositories/streams' @@ -68,6 +68,7 @@ const crossServerSyncModule: SpeckleModule = { finalize() { crossServerSyncLogger.info('⬇️ Ensuring base onboarding stream asynchronously...') + const getStream = getStreamFactory({ db }) const getObject = getObjectFactory({ db }) const getStreamObjects = getStreamObjectsFactory({ db }) const markCommentViewed = markCommentViewedFactory({ db }) diff --git a/packages/server/modules/cross-server-sync/services/commit.ts b/packages/server/modules/cross-server-sync/services/commit.ts index 671616b54..12f838689 100644 --- a/packages/server/modules/cross-server-sync/services/commit.ts +++ b/packages/server/modules/cross-server-sync/services/commit.ts @@ -2,7 +2,7 @@ import fetch from 'cross-fetch' import { ApolloClient, NormalizedCacheObject, gql } from '@apollo/client/core' import { getFrontendOrigin } from '@/modules/shared/helpers/envHelper' import { CreateCommentInput } from '@/test/graphql/generated/graphql' -import { getStream, getStreamCollaborators } from '@/modules/core/repositories/streams' +import { getStreamCollaborators } from '@/modules/core/repositories/streams' import { Roles, timeoutAt } from '@speckle/shared' import { createObject } from '@/modules/core/services/objects' import ObjectLoader from '@speckle/objectloader' @@ -31,6 +31,7 @@ import { import { GetStreamBranchByName } from '@/modules/core/domain/branches/operations' import { CreateCommitByBranchId } from '@/modules/core/domain/commits/operations' import { GetObject } from '@/modules/core/domain/objects/operations' +import { GetStream } from '@/modules/core/domain/streams/operations' type LocalResources = Awaited>> type LocalResourcesWithCommit = LocalResources & { newCommitId: string } @@ -218,7 +219,7 @@ const parseIncomingUrl = async (url: string, token?: string) => { } type GetLocalResourcesDeps = { - getStream: typeof getStream + getStream: GetStream getStreamBranchByName: GetStreamBranchByName getStreamCollaborators: typeof getStreamCollaborators getUser: typeof getUser diff --git a/packages/server/modules/fileuploads/index.ts b/packages/server/modules/fileuploads/index.ts index 8009edc93..4600c73f6 100644 --- a/packages/server/modules/fileuploads/index.ts +++ b/packages/server/modules/fileuploads/index.ts @@ -12,16 +12,17 @@ import { db } from '@/db/knex' import { publish } from '@/modules/shared/utils/subscriptions' import { SpeckleModule } from '@/modules/shared/helpers/typeHelper' import { streamWritePermissionsPipelineFactory } from '@/modules/shared/authz' -import { getStream } from '@/modules/core/repositories/streams' import { getRolesFactory } from '@/modules/shared/repositories/roles' import { getAutomationProjectFactory } from '@/modules/automate/repositories/automations' import { getStreamBranchByNameFactory } from '@/modules/core/repositories/branches' +import { getStreamFactory } from '@/modules/core/repositories/streams' const insertNewUploadAndNotify = insertNewUploadAndNotifyFactory({ getStreamBranchByName: getStreamBranchByNameFactory({ db }), saveUploadFile: saveUploadFileFactory({ db }), publish }) +const getStream = getStreamFactory({ db }) const saveFileUploads = async ({ userId, diff --git a/packages/server/modules/notifications/services/handlers/activityDigest.ts b/packages/server/modules/notifications/services/handlers/activityDigest.ts index 66c4c0128..459f62a61 100644 --- a/packages/server/modules/notifications/services/handlers/activityDigest.ts +++ b/packages/server/modules/notifications/services/handlers/activityDigest.ts @@ -30,8 +30,8 @@ import { StreamActivitySummary } from '@/modules/activitystream/domain/types' import { createActivitySummaryFactory } from '@/modules/activitystream/services/summary' -import { getStream } from '@/modules/core/services/streams' import { getActivityFactory } from '@/modules/activitystream/repositories' +import { getStreamFactory } from '@/modules/core/repositories/streams' const digestNotificationEmailHandlerFactory = ( @@ -436,7 +436,7 @@ const digestNotificationEmailHandler = digestNotificationEmailHandlerFactory({ }) }), createActivitySummary: createActivitySummaryFactory({ - getStream, + getStream: getStreamFactory({ db }), getActivity: getActivityFactory({ db }) }), getServerInfo, diff --git a/packages/server/modules/notifications/services/handlers/mentionedInComment.ts b/packages/server/modules/notifications/services/handlers/mentionedInComment.ts index bf81ee695..77bcad522 100644 --- a/packages/server/modules/notifications/services/handlers/mentionedInComment.ts +++ b/packages/server/modules/notifications/services/handlers/mentionedInComment.ts @@ -2,10 +2,12 @@ import { db } from '@/db/knex' import { GetComment } from '@/modules/comments/domain/operations' 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 { Roles } from '@/modules/core/helpers/mainConstants' import { getCommentRoute } from '@/modules/core/helpers/routeHelper' import { ServerInfo } from '@/modules/core/helpers/types' -import { getStream, StreamWithOptionalRole } from '@/modules/core/repositories/streams' +import { getStreamFactory } from '@/modules/core/repositories/streams' import { getUser, UserWithOptionalRole } from '@/modules/core/repositories/users' import { getServerInfo } from '@/modules/core/services/generic' import { @@ -163,7 +165,7 @@ function buildEmailTemplateParams( const mentionedInCommentHandlerFactory = (deps: { getUser: typeof getUser - getStream: typeof getStream + getStream: GetStream getComment: GetComment getServerInfo: typeof getServerInfo renderEmail: typeof renderEmail @@ -220,7 +222,7 @@ const mentionedInCommentHandlerFactory = const handler: NotificationHandler = async (...args) => { const mentionedInCommentHandler = mentionedInCommentHandlerFactory({ getUser, - getStream, + getStream: getStreamFactory({ db }), getComment: getCommentFactory({ db }), getServerInfo, renderEmail, diff --git a/packages/server/modules/notifications/services/handlers/newStreamAccessRequest.ts b/packages/server/modules/notifications/services/handlers/newStreamAccessRequest.ts index 9daba03ed..e9dccc5bd 100644 --- a/packages/server/modules/notifications/services/handlers/newStreamAccessRequest.ts +++ b/packages/server/modules/notifications/services/handlers/newStreamAccessRequest.ts @@ -8,7 +8,6 @@ import { NotificationHandler } from '@/modules/notifications/helpers/types' import { NotificationValidationError } from '@/modules/notifications/errors' -import { getStream } from '@/modules/core/repositories/streams' import { Roles } from '@/modules/core/helpers/mainConstants' import { buildAbsoluteFrontendUrlFromPath, @@ -22,11 +21,13 @@ import { import { getServerInfo } from '@/modules/core/services/generic' 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' type ValidateMessageDeps = { getPendingAccessRequest: GetPendingAccessRequest getUser: typeof getUser - getStream: typeof getStream + getStream: GetStream } const validateMessageFactory = @@ -150,7 +151,7 @@ const handler: NotificationHandler = (...args) => renderEmail, sendEmail, getUser, - getStream, + getStream: getStreamFactory({ db }), getPendingAccessRequest: getPendingAccessRequestFactory({ db }) }) return newStreamAccessRequestHandler(...args) diff --git a/packages/server/modules/notifications/services/handlers/streamAccessRequestApproved.ts b/packages/server/modules/notifications/services/handlers/streamAccessRequestApproved.ts index e8e1ae5a4..79b7ac43c 100644 --- a/packages/server/modules/notifications/services/handlers/streamAccessRequestApproved.ts +++ b/packages/server/modules/notifications/services/handlers/streamAccessRequestApproved.ts @@ -1,8 +1,10 @@ +import { db } from '@/db/knex' +import { GetStream } from '@/modules/core/domain/streams/operations' import { buildAbsoluteFrontendUrlFromPath, getStreamRoute } from '@/modules/core/helpers/routeHelper' -import { getStream } from '@/modules/core/repositories/streams' +import { getStreamFactory } from '@/modules/core/repositories/streams' import { getUser } from '@/modules/core/repositories/users' import { getServerInfo } from '@/modules/core/services/generic' import { @@ -18,7 +20,7 @@ import { type ValidateMessageDeps = { getUser: typeof getUser - getStream: typeof getStream + getStream: GetStream } const validateMessageFactory = @@ -129,7 +131,7 @@ const handler: NotificationHandler = async ( renderEmail, sendEmail, getUser, - getStream + getStream: getStreamFactory({ db }) }) return streamAccessRequestApprovedHandler(...args) } diff --git a/packages/server/modules/previews/index.ts b/packages/server/modules/previews/index.ts index 8a2fc451c..78b06476a 100644 --- a/packages/server/modules/previews/index.ts +++ b/packages/server/modules/previews/index.ts @@ -18,7 +18,6 @@ import { checkStreamPermissionsFactory } from '@/modules/previews/services/management' import { getObject } from '@/modules/core/services/objects' -import { getStream } from '@/modules/core/repositories/streams' import { getObjectPreviewInfoFactory, createObjectPreviewFactory, @@ -30,6 +29,7 @@ import { getObjectCommitsWithStreamIdsFactory } from '@/modules/core/repositories/commits' import { SpeckleModule } from '@/modules/shared/helpers/typeHelper' +import { getStreamFactory } from '@/modules/core/repositories/streams' const httpErrorImage = (httpErrorCode: number) => require.resolve(`#/assets/previews/images/preview_${httpErrorCode}.png`) @@ -43,6 +43,7 @@ export const init: SpeckleModule['init'] = (app, isInitial) => { moduleLogger.info('📸 Init object preview module') } + const getStream = getStreamFactory({ db }) const getObjectPreviewBufferOrFilepath = getObjectPreviewBufferOrFilepathFactory({ getObject, getObjectPreviewInfo: getObjectPreviewInfoFactory({ db }), @@ -56,7 +57,8 @@ export const init: SpeckleModule['init'] = (app, isInitial) => { }) const checkStreamPermissions = checkStreamPermissionsFactory({ validateScopes, - authorizeResolver + authorizeResolver, + getStream }) app.options('/preview/:streamId/:angle?', cors()) diff --git a/packages/server/modules/previews/services/management.ts b/packages/server/modules/previews/services/management.ts index 40b0e8fe3..e4560c8e1 100644 --- a/packages/server/modules/previews/services/management.ts +++ b/packages/server/modules/previews/services/management.ts @@ -1,5 +1,5 @@ import { logger } from '@/logging/logging' -import { getStream } from '@/modules/core/repositories/streams' +import { GetStream } from '@/modules/core/domain/streams/operations' import { getObject } from '@/modules/core/services/objects' import { CheckStreamPermissions, @@ -83,7 +83,7 @@ export const getObjectPreviewBufferOrFilepathFactory = export const sendObjectPreviewFactory = (deps: { getObjectPreviewBufferOrFilepath: GetObjectPreviewBufferOrFilepath - getStream: typeof getStream + getStream: GetStream makeOgImage: typeof makeOgImage }): SendObjectPreview => async (req, res, streamId, objectId, angle) => { @@ -136,9 +136,10 @@ export const checkStreamPermissionsFactory = (deps: { validateScopes: typeof validateScopes authorizeResolver: typeof authorizeResolver + getStream: GetStream }): CheckStreamPermissions => async (req) => { - const stream = await getStream({ + const stream = await deps.getStream({ streamId: req.params.streamId, userId: req.context.userId }) diff --git a/packages/server/modules/serverinvites/graph/resolvers/serverInvites.ts b/packages/server/modules/serverinvites/graph/resolvers/serverInvites.ts index 7955cb6c7..683617ab3 100644 --- a/packages/server/modules/serverinvites/graph/resolvers/serverInvites.ts +++ b/packages/server/modules/serverinvites/graph/resolvers/serverInvites.ts @@ -43,7 +43,6 @@ import { } from '@/modules/serverinvites/services/projectInviteManagement' import { getUser, getUsers } from '@/modules/core/repositories/users' import { collectAndValidateCoreTargetsFactory } from '@/modules/serverinvites/services/coreResourceCollection' -import { getStream } from '@/modules/core/repositories/streams' import { buildCoreInviteEmailContentsFactory } from '@/modules/serverinvites/services/coreEmailContents' import { getEventBus } from '@/modules/shared/services/eventBus' import { @@ -73,7 +72,9 @@ import { renderEmail } from '@/modules/emails/services/emailRendering' import { sendEmail } from '@/modules/emails/services/sending' import { publish } from '@/modules/shared/utils/subscriptions' import { saveActivityFactory } from '@/modules/activitystream/repositories' +import { getStreamFactory } from '@/modules/core/repositories/streams' +const getStream = getStreamFactory({ db }) const requestNewEmailVerification = requestNewEmailVerificationFactory({ findEmail: findEmailFactory({ db }), getUser, diff --git a/packages/server/modules/serverinvites/services/coreEmailContents.ts b/packages/server/modules/serverinvites/services/coreEmailContents.ts index 181e0e39d..c33a0beea 100644 --- a/packages/server/modules/serverinvites/services/coreEmailContents.ts +++ b/packages/server/modules/serverinvites/services/coreEmailContents.ts @@ -1,9 +1,9 @@ +import { GetStream } from '@/modules/core/domain/streams/operations' import { getRegistrationRoute, getStreamRoute } from '@/modules/core/helpers/routeHelper' import { StreamRecord } from '@/modules/core/helpers/types' -import { getStream } from '@/modules/core/repositories/streams' import { EmailTemplateParams, sanitizeMessage @@ -162,7 +162,7 @@ const buildProjectEmailTemplateParams = ( } } -type BuildProjectInviteContentsFactoryDeps = { getStream: typeof getStream } +type BuildProjectInviteContentsFactoryDeps = { getStream: GetStream } const buildProjectInviteContentsFactory = (deps: BuildProjectInviteContentsFactoryDeps): BuildProjectInviteEmailContents => diff --git a/packages/server/modules/serverinvites/services/coreFinalization.ts b/packages/server/modules/serverinvites/services/coreFinalization.ts index 242142d37..67f2c7dd9 100644 --- a/packages/server/modules/serverinvites/services/coreFinalization.ts +++ b/packages/server/modules/serverinvites/services/coreFinalization.ts @@ -1,7 +1,7 @@ import { AddStreamInviteDeclinedActivity } from '@/modules/activitystream/domain/operations' +import { GetStream } from '@/modules/core/domain/streams/operations' import { StreamInvalidAccessError } from '@/modules/core/errors/stream' import { isResourceAllowed } from '@/modules/core/helpers/token' -import { getStream } from '@/modules/core/repositories/streams' import { addOrUpdateStreamCollaborator } from '@/modules/core/services/streams/streamAccessService' import { ProjectInviteResourceType } from '@/modules/serverinvites/domain/constants' import { InviteFinalizingError } from '@/modules/serverinvites/errors' @@ -13,7 +13,7 @@ import { import { Roles } from '@speckle/shared' type ValidateProjectInviteBeforeFinalizationFactoryDeps = { - getProject: typeof getStream + getProject: GetStream } export const validateProjectInviteBeforeFinalizationFactory = @@ -74,7 +74,7 @@ export const validateProjectInviteBeforeFinalizationFactory = } type ProcessFinalizedProjectInviteFactoryDeps = { - getProject: typeof getStream + getProject: GetStream addInviteDeclinedActivity: AddStreamInviteDeclinedActivity addProjectRole: typeof addOrUpdateStreamCollaborator } diff --git a/packages/server/modules/serverinvites/services/coreResourceCollection.ts b/packages/server/modules/serverinvites/services/coreResourceCollection.ts index 8f52945f6..f23c4ef04 100644 --- a/packages/server/modules/serverinvites/services/coreResourceCollection.ts +++ b/packages/server/modules/serverinvites/services/coreResourceCollection.ts @@ -1,4 +1,3 @@ -import { getStream } from '@/modules/core/repositories/streams' import { ProjectInviteResourceType, ServerInviteResourceType @@ -13,6 +12,7 @@ import { import { authorizeResolver } from '@/modules/shared' import { Roles } from '@speckle/shared' import { flatten } from 'lodash' +import { GetStream } from '@/modules/core/domain/streams/operations' const collectAndValidateServerTargetFactory = (): CollectAndValidateResourceTargets => (params) => { @@ -67,7 +67,7 @@ const collectAndValidateServerTargetFactory = } type CollectAndValidateProjectTargetFactoryDeps = { - getStream: typeof getStream + getStream: GetStream } const collectAndValidateProjectTargetFactory = diff --git a/packages/server/modules/serverinvites/services/projectInviteManagement.ts b/packages/server/modules/serverinvites/services/projectInviteManagement.ts index 888036150..a20f52b7b 100644 --- a/packages/server/modules/serverinvites/services/projectInviteManagement.ts +++ b/packages/server/modules/serverinvites/services/projectInviteManagement.ts @@ -1,3 +1,4 @@ +import { GetStream } from '@/modules/core/domain/streams/operations' import { TokenResourceIdentifier } from '@/modules/core/domain/tokens/types' import { MutationStreamInviteUseArgs, @@ -8,7 +9,6 @@ import { import { ContextResourceAccessRules } from '@/modules/core/helpers/token' import { LimitedUserRecord } from '@/modules/core/helpers/types' import { removePrivateFields } from '@/modules/core/helpers/userHelper' -import { getStream } from '@/modules/core/repositories/streams' import { getUser, getUsers } from '@/modules/core/repositories/users' import { ProjectInviteResourceType, @@ -58,7 +58,7 @@ const isStreamInviteCreateInput = ( ): i is StreamInviteCreateInput => has(i, 'streamId') export const createProjectInviteFactory = - (deps: { createAndSendInvite: CreateAndSendInvite; getStream: typeof getStream }) => + (deps: { createAndSendInvite: CreateAndSendInvite; getStream: GetStream }) => async (params: { input: StreamInviteCreateInput | FullProjectInviteCreateInput inviterId: string diff --git a/packages/server/modules/shared/index.ts b/packages/server/modules/shared/index.ts index 653cf8d52..c04e122ce 100644 --- a/packages/server/modules/shared/index.ts +++ b/packages/server/modules/shared/index.ts @@ -1,5 +1,5 @@ import { db } from '@/db/knex' -import { getStream } from '@/modules/core/repositories/streams' +import { getStreamFactory } from '@/modules/core/repositories/streams' import { adminOverrideEnabled } from '@/modules/shared/helpers/envHelper' import { getUserAclRoleFactory, @@ -29,6 +29,6 @@ export const authorizeResolver = authorizeResolverFactory({ getRoles: getRolesFactory({ db }), adminOverrideEnabled, getUserServerRole: getUserServerRoleFactory({ db }), - getStream, + getStream: getStreamFactory({ db }), getUserAclRole: getUserAclRoleFactory({ db }) }) diff --git a/packages/server/modules/shared/services/auth.ts b/packages/server/modules/shared/services/auth.ts index 41d3b4e97..da99780d6 100644 --- a/packages/server/modules/shared/services/auth.ts +++ b/packages/server/modules/shared/services/auth.ts @@ -1,9 +1,9 @@ +import { GetStream } from '@/modules/core/domain/streams/operations' import { isResourceAllowed, RoleResourceTargets, roleResourceTypeToTokenResourceType } from '@/modules/core/helpers/token' -import { getStream } from '@/modules/core/repositories/streams' import { AuthorizeResolver, GetUserAclRole, @@ -36,7 +36,7 @@ export const authorizeResolverFactory = getRoles: GetRoles adminOverrideEnabled: typeof adminOverrideEnabled getUserServerRole: GetUserServerRole - getStream: typeof getStream + getStream: GetStream getUserAclRole: GetUserAclRole }): AuthorizeResolver => async (userId, resourceId, requiredRole, userResourceAccessLimits) => { diff --git a/packages/server/modules/webhooks/services/webhooks.ts b/packages/server/modules/webhooks/services/webhooks.ts index 411824a7a..fd0c65be2 100644 --- a/packages/server/modules/webhooks/services/webhooks.ts +++ b/packages/server/modules/webhooks/services/webhooks.ts @@ -11,16 +11,14 @@ import { import { Webhook } from '@/modules/webhooks/domain/types' import { SetValuesNullable } from '@speckle/shared' import crs from 'crypto-random-string' -import { - StreamWithOptionalRole, - getStream as getStreamFn -} from '@/modules/core/repositories/streams' +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' const MAX_STREAM_WEBHOOKS = 100 @@ -110,7 +108,7 @@ export const dispatchStreamEventFactory = }: { db: Knex // TODO: this should not be injected here getServerInfo: typeof getServerInfoFn - getStream: typeof getStreamFn + getStream: GetStream createWebhookEvent: CreateWebhookEvent getUser: typeof getUserFn }) => diff --git a/packages/server/modules/webhooks/tests/webhooks.spec.js b/packages/server/modules/webhooks/tests/webhooks.spec.js index ee4fb75e7..7674e6380 100644 --- a/packages/server/modules/webhooks/tests/webhooks.spec.js +++ b/packages/server/modules/webhooks/tests/webhooks.spec.js @@ -31,9 +31,10 @@ const { } = require('@/modules/webhooks/services/webhooks') const { Users, Streams } = require('@/modules/core/dbSchema') const { getServerInfo } = require('@/modules/core/services/generic') -const { getStream } = require('@/modules/core/repositories/streams') const { getUser } = require('@/modules/core/repositories/users') +const { getStreamFactory } = require('@/modules/core/repositories/streams') +const getStream = getStreamFactory({ db }) const updateWebhook = updateWebhookFactory({ updateWebhookConfig: updateWebhookConfigFactory({ db }) }) diff --git a/packages/server/modules/workspaces/events/eventListener.ts b/packages/server/modules/workspaces/events/eventListener.ts index 246d4820f..f1de50b80 100644 --- a/packages/server/modules/workspaces/events/eventListener.ts +++ b/packages/server/modules/workspaces/events/eventListener.ts @@ -5,7 +5,7 @@ import { } from '@/modules/core/events/projectsEmitter' import { deleteProjectRoleFactory, - getStream, + getStreamFactory, upsertProjectRoleFactory } from '@/modules/core/repositories/streams' import { @@ -45,6 +45,7 @@ import { import { getStreams } from '@/modules/core/services/streams' import { withTransaction } from '@/modules/shared/helpers/dbHelper' import { findVerifiedEmailsByUserIdFactory } from '@/modules/core/repositories/userEmails' +import { GetStream } from '@/modules/core/domain/streams/operations' export const onProjectCreatedFactory = ({ @@ -89,7 +90,7 @@ export const onProjectCreatedFactory = export const onInviteFinalizedFactory = (deps: { - getStream: typeof getStream + getStream: GetStream logger: typeof logger updateWorkspaceRole: ReturnType }) => @@ -230,7 +231,7 @@ export const initializeEventListenersFactory = }), eventBus.listen(ServerInvitesEvents.Finalized, async ({ payload }) => { const onInviteFinalized = onInviteFinalizedFactory({ - getStream, + getStream: getStreamFactory({ db }), logger: moduleLogger, updateWorkspaceRole: updateWorkspaceRoleFactory({ getWorkspaceWithDomains: getWorkspaceWithDomainsFactory({ db }), diff --git a/packages/server/modules/workspaces/graph/resolvers/workspaces.ts b/packages/server/modules/workspaces/graph/resolvers/workspaces.ts index 77a320014..a86ef8cc0 100644 --- a/packages/server/modules/workspaces/graph/resolvers/workspaces.ts +++ b/packages/server/modules/workspaces/graph/resolvers/workspaces.ts @@ -4,12 +4,12 @@ import { removePrivateFields } from '@/modules/core/helpers/userHelper' import { getProjectCollaboratorsFactory, getProjectFactory, - getStream, getUserStreams, getUserStreamsCount, updateProjectFactory, upsertProjectRoleFactory, - getRolesByUserIdFactory + getRolesByUserIdFactory, + getStreamFactory } from '@/modules/core/repositories/streams' import { getUser, getUsers } from '@/modules/core/repositories/users' import { getStreams } from '@/modules/core/services/streams' @@ -136,6 +136,7 @@ import { renderEmail } from '@/modules/emails/services/emailRendering' import { sendEmail } from '@/modules/emails/services/sending' import { parseDefaultProjectRole } from '@/modules/workspaces/domain/logic' +const getStream = getStreamFactory({ db }) const requestNewEmailVerification = requestNewEmailVerificationFactory({ findEmail: findEmailFactory({ db }), getUser, @@ -724,7 +725,7 @@ export = FF_WORKSPACES_MODULE_ENABLED const trx = await db.transaction() const moveProjectToWorkspace = moveProjectToWorkspaceFactory({ - getProject: getProjectFactory(), + getProject: getProjectFactory({ db }), updateProject: updateProjectFactory({ db: trx }), upsertProjectRole: upsertProjectRoleFactory({ db: trx }), getProjectCollaborators: getProjectCollaboratorsFactory(), diff --git a/packages/server/modules/workspaces/services/invites.ts b/packages/server/modules/workspaces/services/invites.ts index 1665bf2de..415362b2d 100644 --- a/packages/server/modules/workspaces/services/invites.ts +++ b/packages/server/modules/workspaces/services/invites.ts @@ -71,7 +71,7 @@ import { anyEmailCompliantWithWorkspaceDomains, userEmailsCompliantWithWorkspaceDomains } from '@/modules/workspaces/domain/logic' -import { getStream } from '@/modules/core/repositories/streams' +import { GetStream } from '@/modules/core/domain/streams/operations' const isWorkspaceResourceTarget = ( target: InviteResourceTarget @@ -124,7 +124,7 @@ type CollectAndValidateWorkspaceTargetsFactoryDeps = getWorkspace: GetWorkspace getWorkspaceDomains: GetWorkspaceDomains findVerifiedEmailsByUserId: FindVerifiedEmailsByUserId - getStream: typeof getStream + getStream: GetStream } export const collectAndValidateWorkspaceTargetsFactory = diff --git a/packages/server/modules/workspaces/tests/helpers/creation.ts b/packages/server/modules/workspaces/tests/helpers/creation.ts index 567be93ba..a8ef6065c 100644 --- a/packages/server/modules/workspaces/tests/helpers/creation.ts +++ b/packages/server/modules/workspaces/tests/helpers/creation.ts @@ -1,5 +1,4 @@ import { db } from '@/db/knex' -import { getStream } from '@/modules/core/repositories/streams' import { findEmailsByUserIdFactory, findVerifiedEmailsByUserIdFactory @@ -45,6 +44,7 @@ import { StreamRoles, WorkspaceRoles } from '@speckle/shared' +import { getStreamFactory } from '@/modules/core/repositories/streams' export type BasicTestWorkspace = { /** @@ -207,6 +207,7 @@ export const createWorkspaceInviteDirectly = async ( args: CreateWorkspaceInviteMutationVariables, inviterId: string ) => { + const getStream = getStreamFactory({ db }) const createAndSendInvite = createAndSendInviteFactory({ findUserByTarget: findUserByTargetFactory(), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }), 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 f00302573..19fed22b2 100644 --- a/packages/server/modules/workspaces/tests/integration/invites.graph.spec.ts +++ b/packages/server/modules/workspaces/tests/integration/invites.graph.spec.ts @@ -65,7 +65,6 @@ import { import type { Express } from 'express' import { AllScopes } from '@/modules/core/helpers/mainConstants' import { getWorkspaceFactory } from '@/modules/workspaces/repositories/workspaces' -import { getStream } from '@/modules/core/repositories/streams' import { createUserEmailFactory, deleteUserEmailFactory, @@ -79,6 +78,7 @@ import { addOrUpdateStreamCollaborator } from '@/modules/core/services/streams/s import { WorkspaceProtectedError } from '@/modules/workspaces/errors/workspace' import { ForbiddenError } from '@/modules/shared/errors' import cryptoRandomString from 'crypto-random-string' +import { getStreamFactory } from '@/modules/core/repositories/streams' enum InviteByTarget { Email = 'email', @@ -87,6 +87,8 @@ enum InviteByTarget { type TestGraphQLOperations = ReturnType +const getStream = getStreamFactory({ db }) + const buildGraphqlOperations = (deps: { apollo: TestApolloServer }) => { const { apollo } = deps diff --git a/packages/server/test/speckle-helpers/inviteHelper.ts b/packages/server/test/speckle-helpers/inviteHelper.ts index d80285dd9..47cd493fd 100644 --- a/packages/server/test/speckle-helpers/inviteHelper.ts +++ b/packages/server/test/speckle-helpers/inviteHelper.ts @@ -11,7 +11,6 @@ import { createAndSendInviteFactory } from '@/modules/serverinvites/services/cre import { BasicTestUser } from '@/test/authHelper' import { BasicTestStream } from '@/test/speckle-helpers/streamHelper' import { collectAndValidateCoreTargetsFactory } from '@/modules/serverinvites/services/coreResourceCollection' -import { getStream } from '@/modules/core/repositories/streams' import { buildCoreInviteEmailContentsFactory } from '@/modules/serverinvites/services/coreEmailContents' import { getEventBus } from '@/modules/shared/services/eventBus' import { @@ -26,7 +25,9 @@ import { ServerInviteResourceTarget } from '@/modules/serverinvites/domain/types' import { EmailSendingServiceMock } from '@/test/mocks/global' +import { getStreamFactory } from '@/modules/core/repositories/streams' +const getStream = getStreamFactory({ db }) const createAndSendInvite = createAndSendInviteFactory({ findUserByTarget: findUserByTargetFactory(), insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }),