Merge pull request #3201 from specklesystems/fabians/core-ioc-29

chore(server): IoC 29 - getStream(s)Factory
This commit is contained in:
Alessandro Magionami
2024-10-09 09:54:17 +02:00
committed by GitHub
66 changed files with 272 additions and 169 deletions
@@ -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 })
})
@@ -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<AccessRequestType.Stream, string>
@@ -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 =>
@@ -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({
@@ -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({
@@ -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<typeof scheduleExecution> | null = null
let quitEventListeners: Optional<ReturnType<typeof initializeEventListeners>> =
@@ -24,7 +24,7 @@ const initializeEventListeners = () => {
const handleServerInvitesActivities = handleServerInvitesActivitiesFactory({
eventBus: getEventBus(),
logger: activitiesLogger,
getStream,
getStream: getStreamFactory({ db }),
addStreamInviteSentOutActivity: addStreamInviteSentOutActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
@@ -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: <T extends object = StreamActivityRecord>(db: Knex) =>
@@ -253,7 +253,7 @@ export const saveActivityFactory =
await dispatchStreamEventFactory({
db,
getServerInfo,
getStream,
getStream: getStreamFactory({ db }),
createWebhookEvent: createWebhookEventFactory({ db }),
getUser
})({
@@ -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
}
@@ -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 ({
@@ -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,
@@ -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 }) })({
+2 -1
View File
@@ -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({
@@ -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
@@ -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 })
@@ -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 })
@@ -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 })
})
@@ -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 ({
@@ -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 =>
@@ -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 })
})
@@ -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<StreamWithOptionalRole[]>
export type GetStream = (
params: {
streamId?: string
userId?: string
},
options?: Partial<{
trx: Knex.Transaction
}>
) => Promise<Optional<StreamWithOptionalRole>>
@@ -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
}
@@ -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 })
@@ -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({
@@ -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,
@@ -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,
@@ -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) {
@@ -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 },
@@ -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 }),
+3 -2
View File
@@ -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 })
@@ -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<StreamRecord>('streams'),
streamAcl: (db: Knex) => db<StreamAclRecord>('stream_acl')
}
export type StreamWithOptionalRole = StreamRecord & {
/**
* Available, if query joined this data StreamAcl
*/
role?: StreamRoles
streams: (db: Knex) => db<StreamRecord>(Streams.name),
streamAcl: (db: Knex) => db<StreamAclRecord>(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<StreamWithOptionalRole[]>().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<StreamWithOptionalRole[]>([
...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<Optional<StreamWithOptionalRole>> {
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<Optional<StreamWithOptionalRole>> => {
const { streamId, userId } = params
if (!streamId) throw new InvalidArgumentError('Invalid stream ID')
const streams = await getStreams([streamId], { userId, ...(options || {}) })
return <Optional<StreamWithOptionalRole>>streams[0]
}
const streams = await getStreamsFactory(deps)([streamId], {
userId,
...(options || {})
})
return <Optional<StreamWithOptionalRole>>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`)
}
@@ -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 }
@@ -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
@@ -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)
}
@@ -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
@@ -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 })
},
@@ -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<CloneStreamInitialState> => {
const getStream = getStreamFactory({ db })
const targetStream = await getStream({ streamId: sourceStreamId })
if (!targetStream) {
throw new StreamCloneError('Clonable source stream not found', {
@@ -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', {
@@ -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
}
@@ -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 })
@@ -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,
@@ -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
@@ -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({
@@ -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 })
@@ -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 })
@@ -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<ReturnType<ReturnType<typeof getLocalResourcesFactory>>>
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
+2 -1
View File
@@ -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,
@@ -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,
@@ -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<MentionedInCommentMessage> = async (...args) => {
const mentionedInCommentHandler = mentionedInCommentHandlerFactory({
getUser,
getStream,
getStream: getStreamFactory({ db }),
getComment: getCommentFactory({ db }),
getServerInfo,
renderEmail,
@@ -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<NewStreamAccessRequestMessage> = (...args) =>
renderEmail,
sendEmail,
getUser,
getStream,
getStream: getStreamFactory({ db }),
getPendingAccessRequest: getPendingAccessRequestFactory({ db })
})
return newStreamAccessRequestHandler(...args)
@@ -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<StreamAccessRequestApprovedMessage> = async (
renderEmail,
sendEmail,
getUser,
getStream
getStream: getStreamFactory({ db })
})
return streamAccessRequestApprovedHandler(...args)
}
+4 -2
View File
@@ -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())
@@ -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
})
@@ -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,
@@ -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 =>
@@ -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
}
@@ -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 =
@@ -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
+2 -2
View File
@@ -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 })
})
@@ -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) => {
@@ -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
}) =>
@@ -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 })
})
@@ -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<typeof updateWorkspaceRoleFactory>
}) =>
@@ -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 }),
@@ -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(),
@@ -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 =
@@ -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 }),
@@ -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<typeof buildGraphqlOperations>
const getStream = getStreamFactory({ db })
const buildGraphqlOperations = (deps: { apollo: TestApolloServer }) => {
const { apollo } = deps
@@ -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 }),