gergo/webhookRegions (#3459)

* feat(webhooks): multi region webhook resolver

* feat(webhooks): multi region webhook cleanup

* fix(webhooks): DI fixes

* feat(activitystream): region aware save activity

* feat(accessrequests): multi region

* feat(cli): allow multi region project and commit download

* feat(postgres): make docker postgres 0 day multi region ready

* feat(cli): allow multi region project and commit download properly

* fix(cross-server-sync): di fix

* feat(activitystream): non region aware activities, they are not project data

* fix(webhooks): triggers need to be included

* feat(stream/projectCreate): activity save is not needed any more, its all event based

* feat(multiRegion): get all registered db clients

* fix(regions): test equal in any order

* fix(projectDownload): need to await
This commit is contained in:
Gergő Jedlicska
2024-11-08 10:45:39 +01:00
committed by GitHub
parent 5052355698
commit 73cc7e67d3
44 changed files with 383 additions and 611 deletions
-2
View File
@@ -13,7 +13,6 @@ services:
POSTGRES_PASSWORD: speckle
volumes:
- postgres-data:/var/lib/postgresql/data/
- ./setup/db/0-docker_postgres_aiven.sql:/docker-entrypoint-initdb.d/9-docker_postgres_aiven.sql
- ./setup/db/10-docker_postgres_init.sql:/docker-entrypoint-initdb.d/10-docker_postgres_init.sql
- ./setup/db/11-docker_postgres_keycloack_init.sql:/docker-entrypoint-initdb.d/11-docker_postgres_keycloack_init.sql
ports:
@@ -30,7 +29,6 @@ services:
POSTGRES_PASSWORD: speckle
volumes:
- postgres-region1-data:/var/lib/postgresql/data/
- ./setup/db/0-docker_postgres_aiven.sql:/docker-entrypoint-initdb.d/9-docker_postgres_aiven.sql
- ./setup/db/10-docker_postgres_init.sql:/docker-entrypoint-initdb.d/10-docker_postgres_init.sql
- ./setup/db/11-docker_postgres_keycloack_init.sql:/docker-entrypoint-initdb.d/11-docker_postgres_keycloack_init.sql
ports:
+81 -31
View File
@@ -1,18 +1,18 @@
import { Optional, SpeckleModule } from '@/modules/shared/helpers/typeHelper'
import { initializeEventListenerFactory } from '@/modules/activitystream/services/eventListener'
import { publishNotification } from '@/modules/notifications/services/publication'
import { activitiesLogger, moduleLogger } from '@/logging/logging'
import { activitiesLogger, logger, 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 { EventBus, getEventBus } from '@/modules/shared/services/eventBus'
import { sendActivityNotificationsFactory } from '@/modules/activitystream/services/summary'
import {
getActiveUserStreamsFactory,
saveActivityFactory
} from '@/modules/activitystream/repositories'
import { db } from '@/db/knex'
import { addStreamInviteSentOutActivityFactory } from '@/modules/activitystream/services/streamActivity'
import { publish } from '@/modules/shared/utils/subscriptions'
import {
addStreamCreatedActivityFactory,
addStreamInviteSentOutActivityFactory
} from '@/modules/activitystream/services/streamActivity'
import { getStreamFactory } from '@/modules/core/repositories/streams'
import {
addStreamAccessRequestDeclinedActivityFactory,
@@ -24,25 +24,81 @@ import {
acquireTaskLockFactory,
releaseTaskLockFactory
} from '@/modules/core/repositories/scheduledTasks'
import { UsersEmitter, UsersEvents } from '@/modules/core/events/usersEmitter'
import { Knex } from 'knex'
import {
onServerAccessRequestCreatedFactory,
onServerAccessRequestFinalizedFactory,
onServerInviteCreatedFactory,
onUserCreatedFactory
} from '@/modules/activitystream/services/eventListener'
import {
AccessRequestsEmitter,
AccessRequestsEvents
} from '@/modules/accessrequests/events/emitter'
import { isProjectResourceTarget } from '@/modules/serverinvites/helpers/core'
import { publish } from '@/modules/shared/utils/subscriptions'
import { isStreamAccessRequest } from '@/modules/accessrequests/repositories'
import { ServerInvitesEvents } from '@/modules/serverinvites/domain/events'
import { ProjectEvents, ProjectsEmitter } from '@/modules/core/events/projectsEmitter'
let scheduledTask: ReturnType<ScheduleExecution> | null = null
let quitEventListeners: Optional<ReturnType<typeof initializeEventListeners>> =
undefined
let quitEventListeners: Optional<() => void> = undefined
const initializeEventListeners = () => {
const handleServerInvitesActivities = handleServerInvitesActivitiesFactory({
eventBus: getEventBus(),
logger: activitiesLogger,
getStream: getStreamFactory({ db }),
addStreamInviteSentOutActivity: addStreamInviteSentOutActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
/**
* Initialize event listener for tracking various Speckle events and responding
* to them by creating activitystream entries
*/
const initializeEventListeners = ({
eventBus,
db
}: {
eventBus: EventBus
db: Knex
}) => {
const quitCbs = [
UsersEmitter.listen(
UsersEvents.Created,
// this activity will always go in the main DB
onUserCreatedFactory({ saveActivity: saveActivityFactory({ db }) })
),
AccessRequestsEmitter.listen(AccessRequestsEvents.Created, async ({ request }) => {
if (!isStreamAccessRequest(request)) return
return await onServerAccessRequestCreatedFactory({
addStreamAccessRequestedActivity: addStreamAccessRequestedActivityFactory({
saveActivity: saveActivityFactory({ db })
})
})({ request })
}),
AccessRequestsEmitter.listen(AccessRequestsEvents.Finalized, async (payload) => {
if (!isStreamAccessRequest(payload.request)) return
await onServerAccessRequestFinalizedFactory({
addStreamAccessRequestDeclinedActivity:
addStreamAccessRequestDeclinedActivityFactory({
saveActivity: saveActivityFactory({ db })
})
})(payload)
}),
eventBus.listen(ServerInvitesEvents.Created, async ({ payload }) => {
if (!isProjectResourceTarget(payload.invite.resource)) return
await onServerInviteCreatedFactory({
addStreamInviteSentOutActivity: addStreamInviteSentOutActivityFactory({
publish,
saveActivity: saveActivityFactory({ db })
}),
logger,
getStream: getStreamFactory({ db })
})(payload)
}),
ProjectsEmitter.listen(ProjectEvents.Created, async ({ ownerId, project }) => {
await addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})({ streamId: project.id, creatorId: ownerId, stream: project, input: project })
})
})
]
const quitters = [handleServerInvitesActivities()]
return () => quitters.forEach((quitter) => quitter())
return () => quitCbs.forEach((quit) => quit())
}
const scheduleWeeklyActivityNotifications = () => {
@@ -82,20 +138,14 @@ const activityModule: SpeckleModule = {
init: async (_, isInitial) => {
moduleLogger.info('🤺 Init activity module')
if (isInitial) {
initializeEventListenerFactory({
addStreamAccessRequestedActivity: addStreamAccessRequestedActivityFactory({
saveActivity: saveActivityFactory({ db })
}),
addStreamAccessRequestDeclinedActivity:
addStreamAccessRequestDeclinedActivityFactory({
saveActivity: saveActivityFactory({ db })
}),
saveActivity: saveActivityFactory({ db })
})()
quitEventListeners = initializeEventListeners({
db,
eventBus: getEventBus()
})
if (weeklyEmailDigestEnabled())
scheduledTask = scheduleWeeklyActivityNotifications()
}
quitEventListeners = initializeEventListeners()
},
shutdown: () => {
scheduledTask?.stop()
@@ -18,7 +18,10 @@ import {
import { StreamAcl, StreamActivity } from '@/modules/core/dbSchema'
import { Roles } from '@/modules/core/helpers/mainConstants'
import { StreamAclRecord } from '@/modules/core/helpers/types'
import { createWebhookEventFactory } from '@/modules/webhooks/repositories/webhooks'
import {
createWebhookEventFactory,
getStreamWebhooksFactory
} from '@/modules/webhooks/repositories/webhooks'
import { dispatchStreamEventFactory } from '@/modules/webhooks/services/webhooks'
import { Knex } from 'knex'
import { getStreamFactory } from '@/modules/core/repositories/streams'
@@ -251,7 +254,7 @@ export const saveActivityFactory =
}
await dispatchStreamEventFactory({
db,
getStreamWebhooks: getStreamWebhooksFactory({ db }),
getServerInfo: getServerInfoFactory({ db }),
getStream: getStreamFactory({ db }),
createWebhookEvent: createWebhookEventFactory({ db }),
@@ -1,21 +1,30 @@
import { Logger } from '@/logging/logging'
import {
AccessRequestsEmitter,
AccessRequestsEvents,
AccessRequestsEventsPayloads
} from '@/modules/accessrequests/events/emitter'
import { AccessRequestType } from '@/modules/accessrequests/repositories'
import {
AccessRequestType,
isStreamAccessRequest
} from '@/modules/accessrequests/repositories'
import {
AddStreamAccessRequestDeclinedActivity,
AddStreamAccessRequestedActivity,
AddStreamInviteSentOutActivity,
SaveActivity
} from '@/modules/activitystream/domain/operations'
import { GetStream } from '@/modules/core/domain/streams/operations'
import { UsersEvents, UsersEventsPayloads } from '@/modules/core/events/usersEmitter'
import {
UsersEmitter,
UsersEvents,
UsersEventsPayloads
} from '@/modules/core/events/usersEmitter'
ServerInvitesEvents,
ServerInvitesEventsPayloads
} from '@/modules/serverinvites/domain/events'
import {
isProjectResourceTarget,
resolveTarget
} from '@/modules/serverinvites/helpers/core'
const onUserCreatedFactory =
export const onUserCreatedFactory =
({ saveActivity }: { saveActivity: SaveActivity }) =>
async (payload: UsersEventsPayloads[UsersEvents.Created]) => {
const { user } = payload
@@ -31,7 +40,7 @@ const onUserCreatedFactory =
})
}
const onServerAccessRequestCreatedFactory =
export const onServerAccessRequestCreatedFactory =
({
addStreamAccessRequestedActivity
}: {
@@ -39,19 +48,18 @@ const onServerAccessRequestCreatedFactory =
}) =>
async (payload: AccessRequestsEventsPayloads[AccessRequestsEvents.Created]) => {
const {
request: { resourceId, resourceType, requesterId }
request: { resourceId, requesterId }
} = payload
if (!isStreamAccessRequest(payload.request)) return
if (!resourceId) return
if (resourceType === AccessRequestType.Stream) {
await addStreamAccessRequestedActivity({
streamId: resourceId,
requesterId
})
}
await addStreamAccessRequestedActivity({
streamId: resourceId,
requesterId
})
}
const onServerAccessRequestFinalizedFactory =
export const onServerAccessRequestFinalizedFactory =
({
addStreamAccessRequestDeclinedActivity
}: {
@@ -77,34 +85,34 @@ const onServerAccessRequestFinalizedFactory =
}
}
/**
* Initialize event listener for tracking various Speckle events and responding
* to them by creating activitystream entries
*/
export const initializeEventListenerFactory =
export const onServerInviteCreatedFactory =
({
addStreamAccessRequestedActivity,
addStreamAccessRequestDeclinedActivity,
saveActivity
getStream,
logger,
addStreamInviteSentOutActivity
}: {
addStreamAccessRequestedActivity: AddStreamAccessRequestedActivity
addStreamAccessRequestDeclinedActivity: AddStreamAccessRequestDeclinedActivity
saveActivity: SaveActivity
getStream: GetStream
logger: Logger
addStreamInviteSentOutActivity: AddStreamInviteSentOutActivity
}) =>
() => {
const quitCbs = [
UsersEmitter.listen(UsersEvents.Created, onUserCreatedFactory({ saveActivity })),
AccessRequestsEmitter.listen(
AccessRequestsEvents.Created,
onServerAccessRequestCreatedFactory({ addStreamAccessRequestedActivity })
),
AccessRequestsEmitter.listen(
AccessRequestsEvents.Finalized,
onServerAccessRequestFinalizedFactory({
addStreamAccessRequestDeclinedActivity
})
)
]
async (payload: ServerInvitesEventsPayloads[typeof ServerInvitesEvents.Created]) => {
const { invite } = payload
const primaryResourceTarget = invite.resource
return () => quitCbs.forEach((quit) => quit())
if (!isProjectResourceTarget(primaryResourceTarget)) return
const userTarget = resolveTarget(invite.target)
const project = await getStream({ streamId: primaryResourceTarget.resourceId })
if (!project) {
logger.warn('No project found for project invite', { invite })
return
}
await addStreamInviteSentOutActivity({
streamId: project.id,
inviterId: invite.inviterId,
inviteTargetEmail: userTarget.userEmail,
inviteTargetId: userTarget.userId,
stream: project
})
}
@@ -1,65 +0,0 @@
import {
ServerInvitesEvents,
ServerInvitesEventsPayloads
} from '@/modules/serverinvites/domain/events'
import {
isProjectResourceTarget,
resolveTarget
} from '@/modules/serverinvites/helpers/core'
import { EventBus } from '@/modules/shared/services/eventBus'
import { Logger } from '@/logging/logging'
import { AddStreamInviteSentOutActivity } from '@/modules/activitystream/domain/operations'
import { GetStream } from '@/modules/core/domain/streams/operations'
type OnServerInviteCreatedFactoryDeps = {
getStream: GetStream
logger: Logger
addStreamInviteSentOutActivity: AddStreamInviteSentOutActivity
}
const onServerInviteCreatedFactory =
({
getStream,
logger,
addStreamInviteSentOutActivity
}: OnServerInviteCreatedFactoryDeps) =>
async (payload: ServerInvitesEventsPayloads[typeof ServerInvitesEvents.Created]) => {
const { invite } = payload
const primaryResourceTarget = invite.resource
if (!isProjectResourceTarget(primaryResourceTarget)) return
const userTarget = resolveTarget(invite.target)
const project = await getStream({ streamId: primaryResourceTarget.resourceId })
if (!project) {
logger.warn('No project found for project invite', { invite })
return
}
await addStreamInviteSentOutActivity({
streamId: project.id,
inviterId: invite.inviterId,
inviteTargetEmail: userTarget.userEmail,
inviteTargetId: userTarget.userId,
stream: project
})
}
export type HandleServerInvitesActivitiesFactoryDeps = {
eventBus: EventBus
} & OnServerInviteCreatedFactoryDeps
export const handleServerInvitesActivitiesFactory =
(deps: HandleServerInvitesActivitiesFactoryDeps) => () => {
const { eventBus } = deps
const onServerInviteCreated = onServerInviteCreatedFactory(deps)
const quitters: Array<() => void> = [
eventBus.listen(
ServerInvitesEvents.Created,
async ({ payload }) => await onServerInviteCreated(payload)
)
]
return () => quitters.forEach((quit) => quit())
}
@@ -12,7 +12,6 @@ import {
NotificationType,
NotificationTypeMessageMap
} from '@/modules/notifications/helpers/types'
import { sleep } from '@/test/helpers'
import {
getActivityFactory,
saveActivityFactory
@@ -36,10 +35,8 @@ import {
import { collectAndValidateCoreTargetsFactory } from '@/modules/serverinvites/services/coreResourceCollection'
import { buildCoreInviteEmailContentsFactory } from '@/modules/serverinvites/services/coreEmailContents'
import { getEventBus } from '@/modules/shared/services/eventBus'
import { addStreamCreatedActivityFactory } from '@/modules/activitystream/services/streamActivity'
import { ProjectsEmitter } from '@/modules/core/events/projectsEmitter'
import { createBranchFactory } from '@/modules/core/repositories/branches'
import { publish } from '@/modules/shared/utils/subscriptions'
import { getUserFactory, getUsersFactory } from '@/modules/core/repositories/users'
import { getServerInfoFactory } from '@/modules/core/repositories/server'
@@ -57,10 +54,6 @@ const createActivitySummary = createActivitySummaryFactory({
getActivity: getActivityFactory({ db }),
getUser
})
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
inviteUsersToProject: inviteUsersToProjectFactory({
@@ -85,7 +78,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -126,7 +118,8 @@ describe('Activity summary @activity', () => {
end: new Date()
})
expect(summary?.streamActivities).to.have.length(0)
// stream creation is an activity
expect(summary?.streamActivities).to.have.length(2)
})
it('gets activities for the user', async () => {
const start = new Date()
@@ -135,16 +128,6 @@ describe('Activity summary @activity', () => {
createStream({ ...stream, ownerId: userA.id })
)
)
await saveActivity({
streamId: streamIds[0],
resourceType: ResourceTypes.Stream,
resourceId: streamIds[0],
actionType: ActionTypes.Stream.Create,
userId: userA.id,
info: {},
message: 'foo'
})
await sleep(100)
const summary = await createActivitySummary({
userId: userA.id,
streamIds,
@@ -152,7 +135,7 @@ describe('Activity summary @activity', () => {
end: new Date()
})
expect(summary?.streamActivities).to.have.length(1)
expect(summary?.streamActivities).to.have.length(2)
})
it('if stream is deleted, activity summary returns with null as stream value', async () => {
@@ -38,11 +38,6 @@ const {
const { getEventBus } = require('@/modules/shared/services/eventBus')
const { createBranchFactory } = require('@/modules/core/repositories/branches')
const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter')
const {
addStreamCreatedActivityFactory
} = require('@/modules/activitystream/services/streamActivity')
const { saveActivityFactory } = require('@/modules/activitystream/repositories')
const { publish } = require('@/modules/shared/utils/subscriptions')
const {
getUsersFactory,
getUserFactory,
@@ -80,10 +75,6 @@ const {
const getServerInfo = getServerInfoFactory({ db })
const getUser = getUserFactory({ db })
const getUsers = getUsersFactory({ db })
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const createInviteDirectly = createStreamInviteDirectly
const findInvite = findInviteFactory({ db })
const getStream = getStreamFactory({ db })
@@ -111,7 +102,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -35,11 +35,6 @@ const {
const { getEventBus } = require('@/modules/shared/services/eventBus')
const { createBranchFactory } = require('@/modules/core/repositories/branches')
const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter')
const {
addStreamCreatedActivityFactory
} = require('@/modules/activitystream/services/streamActivity')
const { saveActivityFactory } = require('@/modules/activitystream/repositories')
const { publish } = require('@/modules/shared/utils/subscriptions')
const {
getUsersFactory,
getUserFactory,
@@ -73,10 +68,6 @@ const { getServerInfoFactory } = require('@/modules/core/repositories/server')
const getServerInfo = getServerInfoFactory({ db })
const getUser = getUserFactory({ db })
const getUsers = getUsersFactory({ db })
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const getStream = getStreamFactory({ db })
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
@@ -102,7 +93,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -33,11 +33,6 @@ const {
const { getEventBus } = require('@/modules/shared/services/eventBus')
const { createBranchFactory } = require('@/modules/core/repositories/branches')
const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter')
const {
addStreamCreatedActivityFactory
} = require('@/modules/activitystream/services/streamActivity')
const { saveActivityFactory } = require('@/modules/activitystream/repositories')
const { publish } = require('@/modules/shared/utils/subscriptions')
const {
getUsersFactory,
getUserFactory,
@@ -77,10 +72,6 @@ const { getServerInfoFactory } = require('@/modules/core/repositories/server')
const getServerInfo = getServerInfoFactory({ db })
const getUser = getUserFactory({ db })
const getUsers = getUsersFactory({ db })
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const getStream = getStreamFactory({ db })
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
@@ -106,7 +97,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -46,7 +46,6 @@ import {
markCommentUpdatedFactory,
markCommentViewedFactory
} from '@/modules/comments/repositories/comments'
import { db } from '@/db/knex'
import { CommentsEmitter } from '@/modules/comments/events/emitter'
import {
addCommentCreatedActivityFactory,
@@ -61,6 +60,8 @@ import { saveActivityFactory } from '@/modules/activitystream/repositories'
import { publish } from '@/modules/shared/utils/subscriptions'
import { getUserFactory } from '@/modules/core/repositories/users'
import { createObjectFactory } from '@/modules/core/services/objects/management'
import { getProjectDbClient } from '@/modules/multiregion/dbSelector'
import { db } from '@/db/knex'
const command: CommandModule<
unknown,
@@ -101,34 +102,40 @@ const command: CommandModule<
}
},
handler: async (argv) => {
const markCommitStreamUpdated = markCommitStreamUpdatedFactory({ db })
const getStream = getStreamFactory({ db })
const getObject = getObjectFactory({ db })
const getStreamObjects = getStreamObjectsFactory({ db })
const markCommentViewed = markCommentViewedFactory({ db })
const projectId = argv.targetStreamId
// everything should happen in the project db right?
const projectDb = await getProjectDbClient({ projectId })
const markCommitStreamUpdated = markCommitStreamUpdatedFactory({ db: projectDb })
const getStream = getStreamFactory({ db: projectDb })
const getObject = getObjectFactory({ db: projectDb })
const getStreamObjects = getStreamObjectsFactory({ db: projectDb })
const markCommentViewed = markCommentViewedFactory({ db: projectDb })
const validateInputAttachments = validateInputAttachmentsFactory({
getBlobs: getBlobsFactory({ db })
getBlobs: getBlobsFactory({ db: projectDb })
})
const getBranchLatestCommits = getBranchLatestCommitsFactory({ db })
const insertComments = insertCommentsFactory({ db })
const insertCommentLinks = insertCommentLinksFactory({ db })
const getBranchLatestCommits = getBranchLatestCommitsFactory({ db: projectDb })
const insertComments = insertCommentsFactory({ db: projectDb })
const insertCommentLinks = insertCommentLinksFactory({ db: projectDb })
const getViewerResourceItemsUngrouped = getViewerResourceItemsUngroupedFactory({
getViewerResourceGroups: getViewerResourceGroupsFactory({
getStreamObjects,
getBranchLatestCommits,
getStreamBranchesByName: getStreamBranchesByNameFactory({ db }),
getSpecificBranchCommits: getSpecificBranchCommitsFactory({ db }),
getAllBranchCommits: getAllBranchCommitsFactory({ db })
getStreamBranchesByName: getStreamBranchesByNameFactory({ db: projectDb }),
getSpecificBranchCommits: getSpecificBranchCommitsFactory({ db: projectDb }),
getAllBranchCommits: getAllBranchCommitsFactory({ db: projectDb })
})
})
const getViewerResourcesFromLegacyIdentifiers =
getViewerResourcesFromLegacyIdentifiersFactory({
getViewerResourcesForComments: getViewerResourcesForCommentsFactory({
getCommentsResources: getCommentsResourcesFactory({ db }),
getCommentsResources: getCommentsResourcesFactory({ db: projectDb }),
getViewerResourcesFromLegacyIdentifiers: (...args) =>
getViewerResourcesFromLegacyIdentifiers(...args) // recursive dep
}),
getCommitsAndTheirBranchIds: getCommitsAndTheirBranchIdsFactory({ db }),
getCommitsAndTheirBranchIds: getCommitsAndTheirBranchIdsFactory({
db: projectDb
}),
getStreamObjects
})
const createCommentThreadAndNotify = createCommentThreadAndNotifyFactory({
@@ -141,52 +148,54 @@ const command: CommandModule<
addCommentCreatedActivity: addCommentCreatedActivityFactory({
getViewerResourcesFromLegacyIdentifiers,
getViewerResourceItemsUngrouped,
saveActivity: saveActivityFactory({ db }),
saveActivity: saveActivityFactory({ db: projectDb }),
publish
})
})
const createCommentReplyAndNotify = createCommentReplyAndNotifyFactory({
getComment: getCommentFactory({ db }),
getComment: getCommentFactory({ db: projectDb }),
validateInputAttachments,
insertComments,
insertCommentLinks,
markCommentUpdated: markCommentUpdatedFactory({ db }),
markCommentUpdated: markCommentUpdatedFactory({ db: projectDb }),
commentsEventsEmit: CommentsEmitter.emit,
addReplyAddedActivity: addReplyAddedActivityFactory({
getViewerResourcesForComment: getViewerResourcesForCommentFactory({
getCommentsResources: getCommentsResourcesFactory({ db }),
getCommentsResources: getCommentsResourcesFactory({ db: projectDb }),
getViewerResourcesFromLegacyIdentifiers
}),
saveActivity: saveActivityFactory({ db }),
saveActivity: saveActivityFactory({ db: projectDb }),
publish
})
})
const createCommitByBranchId = createCommitByBranchIdFactory({
createCommit: createCommitFactory({ db }),
createCommit: createCommitFactory({ db: projectDb }),
getObject,
getBranchById: getBranchByIdFactory({ db }),
insertStreamCommits: insertStreamCommitsFactory({ db }),
insertBranchCommits: insertBranchCommitsFactory({ db }),
getBranchById: getBranchByIdFactory({ db: projectDb }),
insertStreamCommits: insertStreamCommitsFactory({ db: projectDb }),
insertBranchCommits: insertBranchCommitsFactory({ db: projectDb }),
markCommitStreamUpdated,
markCommitBranchUpdated: markCommitBranchUpdatedFactory({ db }),
markCommitBranchUpdated: markCommitBranchUpdatedFactory({ db: projectDb }),
versionsEventEmitter: VersionsEmitter.emit,
addCommitCreatedActivity: addCommitCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
saveActivity: saveActivityFactory({ db: projectDb }),
publish
})
})
const createObject = createObjectFactory({
storeSingleObjectIfNotFoundFactory: storeSingleObjectIfNotFoundFactory({ db }),
storeClosuresIfNotFound: storeClosuresIfNotFoundFactory({ db })
storeSingleObjectIfNotFoundFactory: storeSingleObjectIfNotFoundFactory({
db: projectDb
}),
storeClosuresIfNotFound: storeClosuresIfNotFoundFactory({ db: projectDb })
})
const getUser = getUserFactory({ db })
const getStreamCollaborators = getStreamCollaboratorsFactory({ db })
const downloadCommit = downloadCommitFactory({
getStream,
getStreamBranchByName: getStreamBranchByNameFactory({ db }),
getStreamBranchByName: getStreamBranchByNameFactory({ db: projectDb }),
getStreamCollaborators,
getUser,
createCommitByBranchId,
@@ -3,7 +3,6 @@ import { cliLogger } from '@/logging/logging'
import { downloadProjectFactory } from '@/modules/cross-server-sync/services/project'
import { downloadCommitFactory } from '@/modules/cross-server-sync/services/commit'
import {
createStreamFactory,
getStreamCollaboratorsFactory,
getStreamFactory,
markCommitStreamUpdatedFactory
@@ -60,25 +59,25 @@ import {
import { getBlobsFactory } from '@/modules/blobstorage/repositories'
import { validateInputAttachmentsFactory } from '@/modules/comments/services/commentTextService'
import { VersionsEmitter } from '@/modules/core/events/versionsEmitter'
import { createStreamReturnRecordFactory } from '@/modules/core/services/streams/management'
import { inviteUsersToProjectFactory } from '@/modules/serverinvites/services/projectInviteManagement'
import { createAndSendInviteFactory } from '@/modules/serverinvites/services/creation'
import {
findUserByTargetFactory,
insertInviteAndDeleteOldFactory
} from '@/modules/serverinvites/repositories/serverInvites'
import { collectAndValidateCoreTargetsFactory } from '@/modules/serverinvites/services/coreResourceCollection'
import { buildCoreInviteEmailContentsFactory } from '@/modules/serverinvites/services/coreEmailContents'
import { getEventBus } from '@/modules/shared/services/eventBus'
import { ProjectsEmitter } from '@/modules/core/events/projectsEmitter'
import { addStreamCreatedActivityFactory } from '@/modules/activitystream/services/streamActivity'
import { saveActivityFactory } from '@/modules/activitystream/repositories'
import { publish } from '@/modules/shared/utils/subscriptions'
import { addCommitCreatedActivityFactory } from '@/modules/activitystream/services/commitActivity'
import { getUserFactory, getUsersFactory } from '@/modules/core/repositories/users'
import { getServerInfoFactory } from '@/modules/core/repositories/server'
import { getUserFactory } from '@/modules/core/repositories/users'
import { createObjectFactory } from '@/modules/core/services/objects/management'
import { addBranchCreatedActivityFactory } from '@/modules/activitystream/services/branchActivity'
import { authorizeResolver } from '@/modules/shared'
import { Roles } from '@speckle/shared'
import { getDefaultRegionFactory } from '@/modules/workspaces/repositories/regions'
import { getDb } from '@/modules/multiregion/dbSelector'
import { createNewProjectFactory } from '@/modules/core/services/projects'
import {
deleteProjectFactory,
getProjectFactory,
storeProjectFactory,
storeProjectRoleFactory
} from '@/modules/core/repositories/projects'
import { storeModelFactory } from '@/modules/core/repositories/models'
const command: CommandModule<
unknown,
@@ -87,6 +86,7 @@ const command: CommandModule<
authorId: string
syncComments: boolean
token?: string
workspaceId?: string
}
> = {
command: 'project <projectUrl> <authorId> [syncComments]',
@@ -109,37 +109,58 @@ const command: CommandModule<
token: {
describe: 'Target server auth token, in case the stream is private',
type: 'string'
},
workspaceId: {
describe: 'Target workspace id',
type: 'string'
}
},
handler: async (argv) => {
const getStream = getStreamFactory({ db })
const getObject = getObjectFactory({ db })
const markCommitStreamUpdated = markCommitStreamUpdatedFactory({ db })
let projectDb = db
console.log(argv)
if (argv.workspaceId) {
await authorizeResolver(
argv.authorId,
argv.workspaceId,
Roles.Workspace.Member,
null
)
const workspaceDefaultRegion = await getDefaultRegionFactory({ db })({
workspaceId: argv.workspaceId
})
const regionKey = workspaceDefaultRegion?.key
projectDb = await getDb({ regionKey })
}
const getStream = getStreamFactory({ db: projectDb })
const getObject = getObjectFactory({ db: projectDb })
const markCommitStreamUpdated = markCommitStreamUpdatedFactory({ db: projectDb })
const getStreamObjects = getStreamObjectsFactory({ db })
const markCommentViewed = markCommentViewedFactory({ db })
const getStreamObjects = getStreamObjectsFactory({ db: projectDb })
const markCommentViewed = markCommentViewedFactory({ db: projectDb })
const validateInputAttachments = validateInputAttachmentsFactory({
getBlobs: getBlobsFactory({ db })
getBlobs: getBlobsFactory({ db: projectDb })
})
const insertComments = insertCommentsFactory({ db })
const insertCommentLinks = insertCommentLinksFactory({ db })
const insertComments = insertCommentsFactory({ db: projectDb })
const insertCommentLinks = insertCommentLinksFactory({ db: projectDb })
const getViewerResourceItemsUngrouped = getViewerResourceItemsUngroupedFactory({
getViewerResourceGroups: getViewerResourceGroupsFactory({
getStreamObjects,
getBranchLatestCommits: getBranchLatestCommitsFactory({ db }),
getStreamBranchesByName: getStreamBranchesByNameFactory({ db }),
getSpecificBranchCommits: getSpecificBranchCommitsFactory({ db }),
getAllBranchCommits: getAllBranchCommitsFactory({ db })
getBranchLatestCommits: getBranchLatestCommitsFactory({ db: projectDb }),
getStreamBranchesByName: getStreamBranchesByNameFactory({ db: projectDb }),
getSpecificBranchCommits: getSpecificBranchCommitsFactory({ db: projectDb }),
getAllBranchCommits: getAllBranchCommitsFactory({ db: projectDb })
})
})
const getViewerResourcesFromLegacyIdentifiers =
getViewerResourcesFromLegacyIdentifiersFactory({
getViewerResourcesForComments: getViewerResourcesForCommentsFactory({
getCommentsResources: getCommentsResourcesFactory({ db }),
getCommentsResources: getCommentsResourcesFactory({ db: projectDb }),
getViewerResourcesFromLegacyIdentifiers: (...args) =>
getViewerResourcesFromLegacyIdentifiers(...args) // recursive dep
}),
getCommitsAndTheirBranchIds: getCommitsAndTheirBranchIdsFactory({ db }),
getCommitsAndTheirBranchIds: getCommitsAndTheirBranchIdsFactory({
db: projectDb
}),
getStreamObjects
})
const createCommentThreadAndNotify = createCommentThreadAndNotifyFactory({
@@ -152,81 +173,62 @@ const command: CommandModule<
addCommentCreatedActivity: addCommentCreatedActivityFactory({
getViewerResourcesFromLegacyIdentifiers,
getViewerResourceItemsUngrouped,
saveActivity: saveActivityFactory({ db }),
saveActivity: saveActivityFactory({ db: projectDb }),
publish
})
})
const createCommentReplyAndNotify = createCommentReplyAndNotifyFactory({
getComment: getCommentFactory({ db }),
getComment: getCommentFactory({ db: projectDb }),
validateInputAttachments,
insertComments,
insertCommentLinks,
markCommentUpdated: markCommentUpdatedFactory({ db }),
markCommentUpdated: markCommentUpdatedFactory({ db: projectDb }),
commentsEventsEmit: CommentsEmitter.emit,
addReplyAddedActivity: addReplyAddedActivityFactory({
getViewerResourcesForComment: getViewerResourcesForCommentFactory({
getCommentsResources: getCommentsResourcesFactory({ db }),
getCommentsResources: getCommentsResourcesFactory({ db: projectDb }),
getViewerResourcesFromLegacyIdentifiers
}),
saveActivity: saveActivityFactory({ db }),
saveActivity: saveActivityFactory({ db: projectDb }),
publish
})
})
const createCommitByBranchId = createCommitByBranchIdFactory({
createCommit: createCommitFactory({ db }),
createCommit: createCommitFactory({ db: projectDb }),
getObject,
getBranchById: getBranchByIdFactory({ db }),
insertStreamCommits: insertStreamCommitsFactory({ db }),
insertBranchCommits: insertBranchCommitsFactory({ db }),
getBranchById: getBranchByIdFactory({ db: projectDb }),
insertStreamCommits: insertStreamCommitsFactory({ db: projectDb }),
insertBranchCommits: insertBranchCommitsFactory({ db: projectDb }),
markCommitStreamUpdated,
markCommitBranchUpdated: markCommitBranchUpdatedFactory({ db }),
markCommitBranchUpdated: markCommitBranchUpdatedFactory({ db: projectDb }),
versionsEventEmitter: VersionsEmitter.emit,
addCommitCreatedActivity: addCommitCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
saveActivity: saveActivityFactory({ db: projectDb }),
publish
})
})
const getServerInfo = getServerInfoFactory({ db })
const getUser = getUserFactory({ db })
const getUsers = getUsersFactory({ db })
const createStreamReturnRecord = createStreamReturnRecordFactory({
inviteUsersToProject: inviteUsersToProjectFactory({
createAndSendInvite: createAndSendInviteFactory({
findUserByTarget: findUserByTargetFactory({ db }),
insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }),
collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({
getStream
}),
buildInviteEmailContents: buildCoreInviteEmailContentsFactory({
getStream
}),
emitEvent: ({ eventName, payload }) =>
getEventBus().emit({
eventName,
payload
}),
getUser,
getServerInfo
}),
getUsers
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity: addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
}),
const createNewProject = createNewProjectFactory({
storeProject: storeProjectFactory({ db: projectDb }),
getProject: getProjectFactory({ db }),
deleteProject: deleteProjectFactory({ db: projectDb }),
storeModel: storeModelFactory({ db: projectDb }),
// THIS MUST GO TO THE MAIN DB
storeProjectRole: storeProjectRoleFactory({ db }),
projectsEventsEmitter: ProjectsEmitter.emit
})
const createObject = createObjectFactory({
storeSingleObjectIfNotFoundFactory: storeSingleObjectIfNotFoundFactory({ db }),
storeClosuresIfNotFound: storeClosuresIfNotFoundFactory({ db })
storeSingleObjectIfNotFoundFactory: storeSingleObjectIfNotFoundFactory({
db: projectDb
}),
storeClosuresIfNotFound: storeClosuresIfNotFoundFactory({ db: projectDb })
})
const getStreamCollaborators = getStreamCollaboratorsFactory({ db })
const getStreamBranchByName = getStreamBranchByNameFactory({ db })
const getStreamBranchByName = getStreamBranchByNameFactory({ db: projectDb })
const downloadProject = downloadProjectFactory({
downloadCommit: downloadCommitFactory({
getStream,
@@ -239,14 +241,14 @@ const command: CommandModule<
createCommentThreadAndNotify,
createCommentReplyAndNotify
}),
createStreamReturnRecord,
createNewProject,
getUser,
getStreamBranchByName,
createBranchAndNotify: createBranchAndNotifyFactory({
getStreamBranchByName,
createBranch: createBranchFactory({ db }),
createBranch: createBranchFactory({ db: projectDb }),
addBranchCreatedActivity: addBranchCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
saveActivity: saveActivityFactory({ db: projectDb }),
publish
})
})
@@ -9,7 +9,6 @@ import {
} from '@/modules/core/graph/generated/graphql'
import { CommentCreateError, CommentUpdateError } from '@/modules/comments/errors'
import { buildCommentTextFromInput } from '@/modules/comments/services/commentTextService'
import { knex } from '@/modules/core/dbSchema'
import {
CommentLinkRecord,
CommentLinkResourceType,
@@ -149,27 +148,27 @@ export const createCommentThreadAndNotifyFactory =
let comment: CommentRecord
try {
comment = await knex.transaction(async (trx) => {
const [comment] = await deps.insertComments([commentPayload], { trx })
// i know we're loosing transactional consistency...
// it can be added back with the commandFactory on top of a service
const [insertedComment] = await deps.insertComments([commentPayload])
const links: CommentLinkRecord[] = resources.map((r) => {
let resourceId = r.objectId
let resourceType: CommentLinkResourceType = 'object'
if (r.versionId) {
resourceId = r.versionId
resourceType = 'commit'
}
const links: CommentLinkRecord[] = resources.map((r) => {
let resourceId = r.objectId
let resourceType: CommentLinkResourceType = 'object'
if (r.versionId) {
resourceId = r.versionId
resourceType = 'commit'
}
return {
commentId: comment.id,
resourceId,
resourceType
}
})
await deps.insertCommentLinks(links, { trx })
return comment
return {
commentId: insertedComment.id,
resourceId,
resourceType
}
})
await deps.insertCommentLinks(links)
comment = insertedComment
} catch (e) {
throw new CommentCreateError('Comment creation failed', { cause: ensureError(e) })
}
@@ -224,15 +223,13 @@ export const createCommentReplyAndNotifyFactory =
let reply: CommentRecord
try {
reply = await knex.transaction(async (trx) => {
const [reply] = await deps.insertComments([commentPayload], { trx })
const links: CommentLinkRecord[] = [
{ resourceType: 'comment', resourceId: thread.id, commentId: reply.id }
]
await deps.insertCommentLinks(links, { trx })
const [insertedReply] = await deps.insertComments([commentPayload])
const links: CommentLinkRecord[] = [
{ resourceType: 'comment', resourceId: thread.id, commentId: insertedReply.id }
]
await deps.insertCommentLinks(links)
return reply
})
reply = insertedReply
} catch (e) {
throw new CommentCreateError('Reply creation failed', { cause: ensureError(e) })
}
@@ -83,9 +83,6 @@ const {
} = require('@/modules/serverinvites/services/coreEmailContents')
const { getEventBus } = require('@/modules/shared/services/eventBus')
const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter')
const {
addStreamCreatedActivityFactory
} = require('@/modules/activitystream/services/streamActivity')
const { saveActivityFactory } = require('@/modules/activitystream/repositories')
const { publish } = require('@/modules/shared/utils/subscriptions')
const {
@@ -164,10 +161,6 @@ const createCommitByBranchName = createCommitByBranchNameFactory({
getBranchById: getBranchByIdFactory({ db })
})
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const getStream = getStreamFactory({ db })
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
@@ -193,7 +186,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -102,9 +102,6 @@ const {
} = require('@/modules/serverinvites/services/coreEmailContents')
const { getEventBus } = require('@/modules/shared/services/eventBus')
const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter')
const {
addStreamCreatedActivityFactory
} = require('@/modules/activitystream/services/streamActivity')
const { saveActivityFactory } = require('@/modules/activitystream/repositories')
const { publish } = require('@/modules/shared/utils/subscriptions')
const {
@@ -213,10 +210,6 @@ const createCommitByBranchName = createCommitByBranchNameFactory({
getBranchById: getBranchByIdFactory({ db })
})
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
inviteUsersToProject: inviteUsersToProjectFactory({
@@ -241,7 +234,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -250,10 +250,7 @@ export type CreateStream = (
params: (StreamCreateInput | ProjectCreateArgs) & {
ownerId: string
ownerResourceAccessRules?: MaybeNullOrUndefined<TokenResourceIdentifier[]>
},
options?: Partial<{
createActivity: boolean
}>
}
) => Promise<Stream>
export type LegacyCreateStream = (
@@ -2,7 +2,6 @@ import { db } from '@/db/knex'
import { saveActivityFactory } from '@/modules/activitystream/repositories'
import {
addStreamClonedActivityFactory,
addStreamCreatedActivityFactory,
addStreamDeletedActivityFactory,
addStreamInviteAcceptedActivityFactory,
addStreamPermissionsAddedActivityFactory,
@@ -120,10 +119,6 @@ const createStreamReturnRecord = createStreamReturnRecordFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity: addStreamCreatedActivityFactory({
saveActivity,
publish
}),
projectsEventsEmitter: ProjectsEmitter.emit
})
const validateStreamAccess = validateStreamAccessFactory({ authorizeResolver })
@@ -282,14 +277,11 @@ export = {
throw new RateLimitError(rateLimitResult)
}
const project = await createStreamReturnRecord(
{
...(args.input || {}),
ownerId: context.userId!,
ownerResourceAccessRules: context.resourceAccessRules
},
{ createActivity: true }
)
const project = await createStreamReturnRecord({
...(args.input || {}),
ownerId: context.userId!,
ownerResourceAccessRules: context.resourceAccessRules
})
return project
},
@@ -66,7 +66,6 @@ import { buildCoreInviteEmailContentsFactory } from '@/modules/serverinvites/ser
import { getEventBus } from '@/modules/shared/services/eventBus'
import { createBranchFactory } from '@/modules/core/repositories/branches'
import {
addStreamCreatedActivityFactory,
addStreamDeletedActivityFactory,
addStreamInviteAcceptedActivityFactory,
addStreamPermissionsAddedActivityFactory,
@@ -121,10 +120,6 @@ const createStreamReturnRecord = createStreamReturnRecordFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity: addStreamCreatedActivityFactory({
saveActivity,
publish
}),
projectsEventsEmitter: ProjectsEmitter.emit
})
const deleteStreamAndNotify = deleteStreamAndNotifyFactory({
@@ -400,14 +395,11 @@ export = {
throw new RateLimitError(rateLimitResult)
}
const { id } = await createStreamReturnRecord(
{
...args.stream,
ownerId: context.userId!,
ownerResourceAccessRules: context.resourceAccessRules
},
{ createActivity: true }
)
const { id } = await createStreamReturnRecord({
...args.stream,
ownerId: context.userId!,
ownerResourceAccessRules: context.resourceAccessRules
})
return id
},
@@ -0,0 +1,14 @@
import { StoreModel } from '@/modules/core/domain/projects/operations'
import { createBranchFactory } from '@/modules/core/repositories/branches'
import { Knex } from 'knex'
export const storeModelFactory =
({ db }: { db: Knex }): StoreModel =>
async ({ authorId, projectId, name, description }) => {
await createBranchFactory({ db })({
authorId,
description,
name,
streamId: projectId
})
}
@@ -1,5 +1,4 @@
import { MaybeNullOrUndefined, Roles, wait } from '@speckle/shared'
import { addStreamCreatedActivityFactory } from '@/modules/activitystream/services/streamActivity'
import {
ProjectUpdateInput,
ProjectUpdateRoleInput,
@@ -56,12 +55,10 @@ export const createStreamReturnRecordFactory =
createStream: StoreStream
createBranch: StoreBranch
inviteUsersToProject: ReturnType<typeof inviteUsersToProjectFactory>
addStreamCreatedActivity: ReturnType<typeof addStreamCreatedActivityFactory>
projectsEventsEmitter: ProjectsEventsEmitter
}): CreateStream =>
async (params, options): Promise<StreamRecord> => {
async (params): Promise<StreamRecord> => {
const { ownerId, ownerResourceAccessRules } = params
const { createActivity = true } = options || {}
const canCreateStream = isNewResourceAllowed({
resourceType: TokenResourceIdentifierType.Project,
@@ -95,16 +92,6 @@ export const createStreamReturnRecordFactory =
)
}
// Save activity
if (createActivity) {
await deps.addStreamCreatedActivity({
streamId,
input: params,
stream,
creatorId: ownerId
})
}
await deps.projectsEventsEmitter(ProjectEvents.Created, {
project: stream,
ownerId
@@ -119,9 +106,7 @@ export const createStreamReturnRecordFactory =
export const legacyCreateStreamFactory =
(deps: { createStreamReturnRecord: CreateStream }): LegacyCreateStream =>
async (params) => {
const { id } = await deps.createStreamReturnRecord(params, {
createActivity: false
})
const { id } = await deps.createStreamReturnRecord(params)
return id
}
@@ -73,9 +73,6 @@ const {
} = require('@/modules/serverinvites/services/coreEmailContents')
const { getEventBus } = require('@/modules/shared/services/eventBus')
const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter')
const {
addStreamCreatedActivityFactory
} = require('@/modules/activitystream/services/streamActivity')
const { saveActivityFactory } = require('@/modules/activitystream/repositories')
const { publish } = require('@/modules/shared/utils/subscriptions')
const {
@@ -169,10 +166,6 @@ const createCommitByBranchName = createCommitByBranchNameFactory({
getBranchById: getBranchByIdFactory({ db })
})
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
inviteUsersToProject: inviteUsersToProjectFactory({
@@ -197,7 +190,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -43,7 +43,8 @@ const {
} = require('@/modules/core/repositories/streams')
const {
addCommitUpdatedActivityFactory,
addCommitDeletedActivityFactory
addCommitDeletedActivityFactory,
addCommitCreatedActivityFactory
} = require('@/modules/activitystream/services/commitActivity')
const { VersionsEmitter } = require('@/modules/core/events/versionsEmitter')
const {
@@ -75,9 +76,6 @@ const {
} = require('@/modules/serverinvites/services/coreEmailContents')
const { getEventBus } = require('@/modules/shared/services/eventBus')
const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter')
const {
addStreamCreatedActivityFactory
} = require('@/modules/activitystream/services/streamActivity')
const { saveActivityFactory } = require('@/modules/activitystream/repositories')
const { publish } = require('@/modules/shared/utils/subscriptions')
const {
@@ -155,7 +153,7 @@ const createCommitByBranchId = createCommitByBranchIdFactory({
markCommitStreamUpdated,
markCommitBranchUpdated: markCommitBranchUpdatedFactory({ db }),
versionsEventEmitter: VersionsEmitter.emit,
addCommitCreatedActivity: addStreamCreatedActivityFactory({
addCommitCreatedActivity: addCommitCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
@@ -184,10 +182,6 @@ const updateCommitAndNotify = updateCommitAndNotifyFactory({
})
const getStreamCommitCount = getStreamCommitCountFactory({ db })
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
inviteUsersToProject: inviteUsersToProjectFactory({
@@ -212,7 +206,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -41,11 +41,6 @@ const {
const { getEventBus } = require('@/modules/shared/services/eventBus')
const { createBranchFactory } = require('@/modules/core/repositories/branches')
const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter')
const {
addStreamCreatedActivityFactory
} = require('@/modules/activitystream/services/streamActivity')
const { saveActivityFactory } = require('@/modules/activitystream/repositories')
const { publish } = require('@/modules/shared/utils/subscriptions')
const {
getUsersFactory,
getUserFactory,
@@ -79,10 +74,6 @@ const { getServerInfoFactory } = require('@/modules/core/repositories/server')
const getServerInfo = getServerInfoFactory({ db })
const getUser = getUserFactory({ db })
const getUsers = getUsersFactory({ db })
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const getStream = getStreamFactory({ db })
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
@@ -108,7 +99,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -46,11 +46,6 @@ const {
const { getEventBus } = require('@/modules/shared/services/eventBus')
const { createBranchFactory } = require('@/modules/core/repositories/branches')
const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter')
const {
addStreamCreatedActivityFactory
} = require('@/modules/activitystream/services/streamActivity')
const { saveActivityFactory } = require('@/modules/activitystream/repositories')
const { publish } = require('@/modules/shared/utils/subscriptions')
const {
getUsersFactory,
getUserFactory,
@@ -84,10 +79,6 @@ const { getServerInfoFactory } = require('@/modules/core/repositories/server')
const getServerInfo = getServerInfoFactory({ db })
const getUser = getUserFactory({ db })
const getUsers = getUsersFactory({ db })
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const getStream = getStreamFactory({ db })
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
@@ -113,7 +104,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -37,11 +37,6 @@ const {
const { getEventBus } = require('@/modules/shared/services/eventBus')
const { createBranchFactory } = require('@/modules/core/repositories/branches')
const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter')
const {
addStreamCreatedActivityFactory
} = require('@/modules/activitystream/services/streamActivity')
const { saveActivityFactory } = require('@/modules/activitystream/repositories')
const { publish } = require('@/modules/shared/utils/subscriptions')
const {
getUsersFactory,
getUserFactory,
@@ -113,10 +108,6 @@ const sampleObject = JSON.parse(`{
const getServerInfo = getServerInfoFactory({ db })
const getUser = getUserFactory({ db })
const getUsers = getUsersFactory({ db })
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const getStream = getStreamFactory({ db })
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
@@ -142,7 +133,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -39,11 +39,6 @@ const {
const { getEventBus } = require('@/modules/shared/services/eventBus')
const { createBranchFactory } = require('@/modules/core/repositories/branches')
const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter')
const {
addStreamCreatedActivityFactory
} = require('@/modules/activitystream/services/streamActivity')
const { saveActivityFactory } = require('@/modules/activitystream/repositories')
const { publish } = require('@/modules/shared/utils/subscriptions')
const {
getUsersFactory,
getUserFactory,
@@ -84,10 +79,6 @@ const { getServerInfoFactory } = require('@/modules/core/repositories/server')
const getServerInfo = getServerInfoFactory({ db })
const getUser = getUserFactory({ db })
const getUsers = getUsersFactory({ db })
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const getStream = getStreamFactory({ db })
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
@@ -113,7 +104,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -83,7 +83,6 @@ import { buildCoreInviteEmailContentsFactory } from '@/modules/serverinvites/ser
import { getEventBus } from '@/modules/shared/services/eventBus'
import { ProjectsEmitter } from '@/modules/core/events/projectsEmitter'
import {
addStreamCreatedActivityFactory,
addStreamInviteAcceptedActivityFactory,
addStreamPermissionsAddedActivityFactory
} from '@/modules/activitystream/services/streamActivity'
@@ -148,10 +147,6 @@ const createCommitByBranchName = createCommitByBranchNameFactory({
getBranchById: getBranchByIdFactory({ db })
})
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
inviteUsersToProject: inviteUsersToProjectFactory({
@@ -176,7 +171,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -70,9 +70,6 @@ const {
} = require('@/modules/serverinvites/services/coreEmailContents')
const { getEventBus } = require('@/modules/shared/services/eventBus')
const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter')
const {
addStreamCreatedActivityFactory
} = require('@/modules/activitystream/services/streamActivity')
const { saveActivityFactory } = require('@/modules/activitystream/repositories')
const { publish } = require('@/modules/shared/utils/subscriptions')
const {
@@ -180,10 +177,6 @@ const createCommitByBranchName = createCommitByBranchNameFactory({
getBranchById: getBranchByIdFactory({ db })
})
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
inviteUsersToProject: inviteUsersToProjectFactory({
@@ -208,7 +201,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -31,9 +31,6 @@ import { buildCoreInviteEmailContentsFactory } from '@/modules/serverinvites/ser
import { getEventBus } from '@/modules/shared/services/eventBus'
import { createBranchFactory } from '@/modules/core/repositories/branches'
import { ProjectsEmitter } from '@/modules/core/events/projectsEmitter'
import { addStreamCreatedActivityFactory } from '@/modules/activitystream/services/streamActivity'
import { saveActivityFactory } from '@/modules/activitystream/repositories'
import { publish } from '@/modules/shared/utils/subscriptions'
import {
countAdminUsersFactory,
getUserFactory,
@@ -62,10 +59,6 @@ const WAIT_TIMEOUT = 5
const getServerInfo = getServerInfoFactory({ db })
const getUser = getUserFactory({ db })
const getUsers = getUsersFactory({ db })
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const getStream = getStreamFactory({ db })
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
@@ -91,7 +84,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -55,6 +55,11 @@ export type DownloadProject = (
* Specify if target project is private
*/
token?: string
/**
* Specify a target workspace to download into
* The author needs to be member of the workspace
*/
workspaceId?: string
},
options?: Partial<{
logger: Logger
@@ -7,7 +7,6 @@ import {
addReplyAddedActivityFactory
} from '@/modules/activitystream/services/commentActivity'
import { addCommitCreatedActivityFactory } from '@/modules/activitystream/services/commitActivity'
import { addStreamCreatedActivityFactory } from '@/modules/activitystream/services/streamActivity'
import { getBlobsFactory } from '@/modules/blobstorage/repositories'
import { CommentsEmitter } from '@/modules/comments/events/emitter'
import {
@@ -41,26 +40,27 @@ import {
insertBranchCommitsFactory,
insertStreamCommitsFactory
} from '@/modules/core/repositories/commits'
import { storeModelFactory } from '@/modules/core/repositories/models'
import {
getObjectFactory,
getStreamObjectsFactory,
storeClosuresIfNotFoundFactory,
storeSingleObjectIfNotFoundFactory
} from '@/modules/core/repositories/objects'
import { getServerInfoFactory } from '@/modules/core/repositories/server'
import {
createStreamFactory,
deleteProjectFactory,
storeProjectFactory,
storeProjectRoleFactory
} from '@/modules/core/repositories/projects'
import {
getOnboardingBaseStreamFactory,
getProjectFactory,
getStreamCollaboratorsFactory,
getStreamFactory,
markCommitStreamUpdatedFactory,
markOnboardingBaseStreamFactory
} from '@/modules/core/repositories/streams'
import {
getFirstAdminFactory,
getUserFactory,
getUsersFactory
} from '@/modules/core/repositories/users'
import { getFirstAdminFactory, getUserFactory } from '@/modules/core/repositories/users'
import { createBranchAndNotifyFactory } from '@/modules/core/services/branch/management'
import { createCommitByBranchIdFactory } from '@/modules/core/services/commit/management'
import {
@@ -71,20 +71,11 @@ import {
getViewerResourcesFromLegacyIdentifiersFactory
} from '@/modules/core/services/commit/viewerResources'
import { createObjectFactory } from '@/modules/core/services/objects/management'
import { createStreamReturnRecordFactory } from '@/modules/core/services/streams/management'
import { createNewProjectFactory } from '@/modules/core/services/projects'
import { downloadCommitFactory } from '@/modules/cross-server-sync/services/commit'
import { ensureOnboardingProjectFactory } from '@/modules/cross-server-sync/services/onboardingProject'
import { downloadProjectFactory } from '@/modules/cross-server-sync/services/project'
import {
findUserByTargetFactory,
insertInviteAndDeleteOldFactory
} from '@/modules/serverinvites/repositories/serverInvites'
import { buildCoreInviteEmailContentsFactory } from '@/modules/serverinvites/services/coreEmailContents'
import { collectAndValidateCoreTargetsFactory } from '@/modules/serverinvites/services/coreResourceCollection'
import { createAndSendInviteFactory } from '@/modules/serverinvites/services/creation'
import { inviteUsersToProjectFactory } from '@/modules/serverinvites/services/projectInviteManagement'
import { SpeckleModule } from '@/modules/shared/helpers/typeHelper'
import { getEventBus } from '@/modules/shared/services/eventBus'
import { publish } from '@/modules/shared/utils/subscriptions'
const crossServerSyncModule: SpeckleModule = {
@@ -94,9 +85,7 @@ const crossServerSyncModule: SpeckleModule = {
finalize() {
crossServerSyncLogger.info('⬇️ Ensuring base onboarding stream asynchronously...')
const getServerInfo = getServerInfoFactory({ db })
const getUser = getUserFactory({ db })
const getUsers = getUsersFactory({ db })
const markOnboardingBaseStream = markOnboardingBaseStreamFactory({ db })
const markCommitStreamUpdated = markCommitStreamUpdatedFactory({ db })
const getStream = getStreamFactory({ db })
@@ -177,35 +166,16 @@ const crossServerSyncModule: SpeckleModule = {
storeSingleObjectIfNotFoundFactory: storeSingleObjectIfNotFoundFactory({ db }),
storeClosuresIfNotFound: storeClosuresIfNotFoundFactory({ db })
})
const createStreamReturnRecord = createStreamReturnRecordFactory({
inviteUsersToProject: inviteUsersToProjectFactory({
createAndSendInvite: createAndSendInviteFactory({
findUserByTarget: findUserByTargetFactory({ db }),
insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db }),
collectAndValidateResourceTargets: collectAndValidateCoreTargetsFactory({
getStream
}),
buildInviteEmailContents: buildCoreInviteEmailContentsFactory({
getStream
}),
emitEvent: ({ eventName, payload }) =>
getEventBus().emit({
eventName,
payload
}),
getUser,
getServerInfo
}),
getUsers
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity: addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
}),
const createNewProject = createNewProjectFactory({
storeProject: storeProjectFactory({ db }),
getProject: getProjectFactory({ db }),
deleteProject: deleteProjectFactory({ db }),
storeModel: storeModelFactory({ db }),
storeProjectRole: storeProjectRoleFactory({ db }),
projectsEventsEmitter: ProjectsEmitter.emit
})
const ensureOnboardingProject = ensureOnboardingProjectFactory({
getOnboardingBaseStream: getOnboardingBaseStreamFactory({ db }),
getFirstAdmin: getFirstAdminFactory({ db }),
@@ -221,7 +191,7 @@ const crossServerSyncModule: SpeckleModule = {
createCommentThreadAndNotify,
createCommentReplyAndNotify
}),
createStreamReturnRecord,
createNewProject,
getUser,
getStreamBranchByName,
createBranchAndNotify: createBranchAndNotifyFactory({
@@ -17,7 +17,7 @@ import {
CreateBranchAndNotify,
GetStreamBranchByName
} from '@/modules/core/domain/branches/operations'
import { CreateStream } from '@/modules/core/domain/streams/operations'
import { CreateProject } from '@/modules/core/domain/projects/operations'
import { GetUser } from '@/modules/core/domain/users/operations'
type ProjectMetadata = Awaited<ReturnType<typeof getProjectMetadata>>
@@ -193,7 +193,7 @@ const importVersionsFactory =
}
type DownloadProjectDeps = {
createStreamReturnRecord: CreateStream
createNewProject: CreateProject
} & GetLocalResourcesDeps &
ImportVersionsDeps
@@ -203,7 +203,7 @@ type DownloadProjectDeps = {
export const downloadProjectFactory =
(deps: DownloadProjectDeps): DownloadProject =>
async (params, options) => {
const { projectUrl, authorId, syncComments, token } = params
const { projectUrl, authorId, syncComments, token, workspaceId } = params
const { logger = crossServerSyncLogger } = options || {}
logger.info(`Project download started at: ${new Date().toISOString()}`)
@@ -219,8 +219,9 @@ export const downloadProjectFactory =
})
logger.debug(`Creating project locally...`)
const project = await deps.createStreamReturnRecord({
const project = await deps.createNewProject({
...projectInfo.projectInfo,
workspaceId,
ownerId: localResources.user.id
})
@@ -31,9 +31,6 @@ import { buildCoreInviteEmailContentsFactory } from '@/modules/serverinvites/ser
import { getEventBus } from '@/modules/shared/services/eventBus'
import { createBranchFactory } from '@/modules/core/repositories/branches'
import { ProjectsEmitter } from '@/modules/core/events/projectsEmitter'
import { addStreamCreatedActivityFactory } from '@/modules/activitystream/services/streamActivity'
import { saveActivityFactory } from '@/modules/activitystream/repositories'
import { publish } from '@/modules/shared/utils/subscriptions'
import {
countAdminUsersFactory,
getUserFactory,
@@ -65,10 +62,6 @@ import { getServerInfoFactory } from '@/modules/core/repositories/server'
const getServerInfo = getServerInfoFactory({ db })
const getUser = getUserFactory({ db })
const getUsers = getUsersFactory({ db })
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const getStream = getStreamFactory({ db })
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
@@ -94,7 +87,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -126,6 +126,9 @@ export const getRegisteredRegionClients = async (): Promise<RegionClients> => {
return registeredRegionClients
}
export const getRegisteredDbClients = async (): Promise<Knex[]> =>
Object.values(await getRegisteredRegionClients())
export const initializeRegion: InitializeRegion = async ({ regionKey }) => {
const knownClients = await getRegisteredRegionClients()
if (regionKey in knownClients)
@@ -59,7 +59,6 @@ import { collectAndValidateCoreTargetsFactory } from '@/modules/serverinvites/se
import { buildCoreInviteEmailContentsFactory } from '@/modules/serverinvites/services/coreEmailContents'
import { getEventBus } from '@/modules/shared/services/eventBus'
import { ProjectsEmitter } from '@/modules/core/events/projectsEmitter'
import { addStreamCreatedActivityFactory } from '@/modules/activitystream/services/streamActivity'
import { saveActivityFactory } from '@/modules/activitystream/repositories'
import { publish } from '@/modules/shared/utils/subscriptions'
import { addCommitCreatedActivityFactory } from '@/modules/activitystream/services/commitActivity'
@@ -118,10 +117,6 @@ const createCommitByBranchName = createCommitByBranchNameFactory({
getBranchById: getBranchByIdFactory({ db })
})
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const getStream = getStreamFactory({ db })
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
@@ -147,7 +142,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -16,9 +16,9 @@ import {
getWebhookEventsCountFactory,
updateWebhookConfigFactory
} from '@/modules/webhooks/repositories/webhooks'
import { db } from '@/db/knex'
import { ForbiddenError } from '@/modules/shared/errors'
import { TokenResourceIdentifier } from '@/modules/core/domain/tokens/types'
import { getProjectDbClient } from '@/modules/multiregion/dbSelector'
const streamWebhooksResolver = async (
parent: { id: string },
@@ -32,13 +32,17 @@ const streamWebhooksResolver = async (
context.resourceAccessRules
)
const projectDb = await getProjectDbClient({ projectId: parent.id })
if (args.id) {
const wh = await getWebhookByIdFactory({ db })({ id: args.id })
const wh = await getWebhookByIdFactory({ db: projectDb })({ id: args.id })
const items = wh ? [wh] : []
return { items, totalCount: items.length }
}
const items = await getStreamWebhooksFactory({ db })({ streamId: parent.id })
const items = await getStreamWebhooksFactory({ db: projectDb })({
streamId: parent.id
})
return { items, totalCount: items.length }
}
@@ -47,11 +51,13 @@ export = {
projectId: (parent) => parent.streamId,
hasSecret: (parent) => !!parent.secret?.length,
history: async (parent, args) => {
const items = await getLastWebhookEventsFactory({ db })({
const projectDb = await getProjectDbClient({ projectId: parent.streamId })
const items = await getLastWebhookEventsFactory({ db: projectDb })({
webhookId: parent.id,
limit: args.limit
})
const totalCount = await getWebhookEventsCountFactory({ db })({
const totalCount = await getWebhookEventsCountFactory({ db: projectDb })({
webhookId: parent.id
})
@@ -72,10 +78,11 @@ export = {
Roles.Stream.Owner,
context.resourceAccessRules
)
const projectDb = await getProjectDbClient({ projectId: args.webhook.streamId })
const id = await createWebhookFactory({
createWebhookConfig: createWebhookConfigFactory({ db }),
countWebhooksByStreamId: countWebhooksByStreamIdFactory({ db })
createWebhookConfig: createWebhookConfigFactory({ db: projectDb }),
countWebhooksByStreamId: countWebhooksByStreamIdFactory({ db: projectDb })
})({
streamId: args.webhook.streamId,
url: args.webhook.url,
@@ -95,14 +102,16 @@ export = {
context.resourceAccessRules
)
const wh = await getWebhookByIdFactory({ db })({ id: args.webhook.id })
const projectDb = await getProjectDbClient({ projectId: args.webhook.streamId })
const wh = await getWebhookByIdFactory({ db: projectDb })({ id: args.webhook.id })
if (args.webhook.streamId !== wh?.streamId)
throw new ForbiddenError(
'The webhook id and stream id do not match. Please check your inputs.'
)
const updated = await updateWebhookFactory({
updateWebhookConfig: updateWebhookConfigFactory({ db })
updateWebhookConfig: updateWebhookConfigFactory({ db: projectDb })
})({
id: args.webhook.id,
url: args.webhook.url,
@@ -122,9 +131,11 @@ export = {
context.resourceAccessRules
)
const projectDb = await getProjectDbClient({ projectId: args.webhook.streamId })
return await deleteWebhookFactory({
deleteWebhookConfig: deleteWebhookConfigFactory({ db }),
getWebhookById: getWebhookByIdFactory({ db })
deleteWebhookConfig: deleteWebhookConfigFactory({ db: projectDb }),
getWebhookById: getWebhookByIdFactory({ db: projectDb })
})(args.webhook)
}
}
@@ -9,6 +9,7 @@ import {
import { cleanOrphanedWebhookConfigsFactory } from '@/modules/webhooks/repositories/cleanup'
import { Knex } from 'knex'
import { db } from '@/db/knex'
import { getRegisteredDbClients } from '@/modules/multiregion/dbSelector'
const scheduleWebhookCleanupFactory = ({ db }: { db: Knex }) => {
const scheduleExecution = scheduleExecutionFactory({
@@ -19,6 +20,12 @@ const scheduleWebhookCleanupFactory = ({ db }: { db: Knex }) => {
const cronExpression = '0 4 * * 1'
return scheduleExecution(cronExpression, 'weeklyWebhookCleanup', async () => {
activitiesLogger.info('Starting weekly webhooks cleanup')
const dbClients = await getRegisteredDbClients()
await Promise.all(
dbClients.map((regionDb) =>
cleanOrphanedWebhookConfigsFactory({ db: regionDb })()
)
)
await cleanOrphanedWebhookConfigsFactory({ db })()
activitiesLogger.info('Finished cleanup')
})
@@ -4,6 +4,7 @@ import {
CreateWebhookConfig,
CreateWebhookEvent,
DeleteWebhookConfig,
GetStreamWebhooks,
GetWebhookById,
UpdateWebhookConfig
} from '@/modules/webhooks/domain/operations'
@@ -11,7 +12,6 @@ import { Webhook } from '@/modules/webhooks/domain/types'
import { SetValuesNullable } from '@speckle/shared'
import crs from 'crypto-random-string'
import { StreamWithOptionalRole } from '@/modules/core/repositories/streams'
import { Knex } from 'knex'
import { ServerInfo } from '@/modules/core/helpers/types'
import { GetStream } from '@/modules/core/domain/streams/operations'
import { UserWithOptionalRole } from '@/modules/core/domain/users/types'
@@ -99,14 +99,14 @@ export const deleteWebhookFactory =
export const dispatchStreamEventFactory =
({
db,
getServerInfo,
getStream,
createWebhookEvent,
getStreamWebhooks,
getUser
}: {
db: Knex // TODO: this should not be injected here
getServerInfo: GetServerInfo
getStreamWebhooks: GetStreamWebhooks
getStream: GetStream
createWebhookEvent: CreateWebhookEvent
getUser: GetUser
@@ -138,13 +138,10 @@ export const dispatchStreamEventFactory =
// Add stream info
if (payload.streamId) {
payload.stream = await getStream(
{
streamId: payload.streamId,
userId: payload.userId ?? undefined
},
{ trx: db.isTransaction ? await db.transaction() : undefined }
)
payload.stream = await getStream({
streamId: payload.streamId,
userId: payload.userId ?? undefined
})
}
// Add user info (except email and pwd)
@@ -158,15 +155,10 @@ export const dispatchStreamEventFactory =
// with this select, we must have the streamid available on the webhook config,
// even when the stream is deleted, to dispatch the stream deleted webhook events
const { rows } = await db.raw(
`
SELECT * FROM webhooks_config WHERE "streamId" = ?
`,
[streamId]
)
const rows = await getStreamWebhooks({ streamId })
for (const wh of rows) {
if (!wh.enabled) continue
if (!(event in wh.triggers)) continue
if (!wh.triggers.includes(event)) continue
// Add webhook info (the key `webhook` will be replaced for each webhook configured, before serializing the payload and storing it)
wh.triggers = Object.keys(wh.triggers)
@@ -1,6 +1,4 @@
import knex, { db } from '@/db/knex'
import { saveActivityFactory } from '@/modules/activitystream/repositories'
import { addStreamCreatedActivityFactory } from '@/modules/activitystream/services/streamActivity'
import { ProjectsEmitter } from '@/modules/core/events/projectsEmitter'
import { UsersEmitter } from '@/modules/core/events/usersEmitter'
import {
@@ -47,7 +45,6 @@ import { createAndSendInviteFactory } from '@/modules/serverinvites/services/cre
import { finalizeInvitedServerRegistrationFactory } from '@/modules/serverinvites/services/processing'
import { inviteUsersToProjectFactory } from '@/modules/serverinvites/services/projectInviteManagement'
import { getEventBus } from '@/modules/shared/services/eventBus'
import { publish } from '@/modules/shared/utils/subscriptions'
import { truncateTables } from '@/test/hooks'
import { expect } from 'chai'
import crs from 'crypto-random-string'
@@ -63,10 +60,6 @@ const cleanOrphanedWebhookConfigs = cleanOrphanedWebhookConfigsFactory({ db })
const getServerInfo = getServerInfoFactory({ db })
const getUsers = getUsersFactory({ db })
const getUser = getUserFactory({ db })
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const getStream = getStreamFactory({ db })
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
@@ -92,7 +85,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -57,11 +57,6 @@ const {
const { getEventBus } = require('@/modules/shared/services/eventBus')
const { createBranchFactory } = require('@/modules/core/repositories/branches')
const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter')
const {
addStreamCreatedActivityFactory
} = require('@/modules/activitystream/services/streamActivity')
const { saveActivityFactory } = require('@/modules/activitystream/repositories')
const { publish } = require('@/modules/shared/utils/subscriptions')
const {
getUserFactory,
getUsersFactory,
@@ -102,10 +97,6 @@ const { getServerInfoFactory } = require('@/modules/core/repositories/server')
const getServerInfo = getServerInfoFactory({ db })
const getUser = getUserFactory({ db })
const getUsers = getUsersFactory({ db })
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const getStream = getStreamFactory({ db })
const updateWebhook = updateWebhookFactory({
updateWebhookConfig: updateWebhookConfigFactory({ db })
@@ -135,7 +126,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -338,6 +328,7 @@ describe('Webhooks @webhooks', () => {
getServerInfo,
getStream,
createWebhookEvent: createWebhookEventFactory({ db }),
getStreamWebhooks: getStreamWebhooksFactory({ db }),
getUser
})({
streamId,
@@ -411,6 +402,7 @@ describe('Webhooks @webhooks', () => {
db,
getServerInfo,
getStream,
getStreamWebhooks: getStreamWebhooksFactory({ db }),
createWebhookEvent: createWebhookEventFactory({ db }),
getUser
})({
@@ -161,7 +161,6 @@ import {
isRateLimitBreached
} from '@/modules/core/services/ratelimiter'
import { RateLimitError } from '@/modules/core/errors/ratelimit'
import { createBranchFactory } from '@/modules/core/repositories/branches'
import { ProjectsEmitter } from '@/modules/core/events/projectsEmitter'
import { getDb } from '@/modules/multiregion/dbSelector'
import { createNewProjectFactory } from '@/modules/core/services/projects'
@@ -170,8 +169,6 @@ import {
storeProjectFactory,
storeProjectRoleFactory
} from '@/modules/core/repositories/projects'
import { StoreModel } from '@/modules/core/domain/projects/operations'
import { Knex } from 'knex'
import {
listUserExpiredSsoSessionsFactory,
listWorkspaceSsoMembershipsByUserEmailFactory
@@ -185,6 +182,7 @@ import {
} from '@/modules/workspaces/repositories/sso'
import { getDecryptor } from '@/modules/workspaces/helpers/sso'
import { getDefaultRegionFactory } from '@/modules/workspaces/repositories/regions'
import { storeModelFactory } from '@/modules/core/repositories/models'
const eventBus = getEventBus()
const getServerInfo = getServerInfoFactory({ db })
@@ -806,17 +804,6 @@ export = FF_WORKSPACES_MODULE_ENABLED
const projectDb = await getDb({ regionKey })
const storeModelFactory =
({ db }: { db: Knex }): StoreModel =>
async ({ authorId, projectId, name, description }) => {
await createBranchFactory({ db })({
authorId,
description,
name,
streamId: projectId
})
}
// todo, use the command factory here, but for that, we need to migrate to the event bus
const createNewProject = createNewProjectFactory({
storeProject: storeProjectFactory({ db: projectDb }),
-10
View File
@@ -34,11 +34,6 @@ const {
const { getEventBus } = require('@/modules/shared/services/eventBus')
const { createBranchFactory } = require('@/modules/core/repositories/branches')
const { ProjectsEmitter } = require('@/modules/core/events/projectsEmitter')
const {
addStreamCreatedActivityFactory
} = require('@/modules/activitystream/services/streamActivity')
const { saveActivityFactory } = require('@/modules/activitystream/repositories')
const { publish } = require('@/modules/shared/utils/subscriptions')
const {
getUsersFactory,
getUserFactory,
@@ -56,10 +51,6 @@ const { getServerInfoFactory } = require('@/modules/core/repositories/server')
const getServerInfo = getServerInfoFactory({ db })
const getUsers = getUsersFactory({ db })
const getUser = getUserFactory({ db })
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const getStream = getStreamFactory({ db })
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
@@ -85,7 +76,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
@@ -1,9 +1,6 @@
import { db } from '@/db/knex'
import { saveActivityFactory } from '@/modules/activitystream/repositories'
import {
addStreamCreatedActivityFactory,
addStreamPermissionsRevokedActivityFactory
} from '@/modules/activitystream/services/streamActivity'
import { addStreamPermissionsRevokedActivityFactory } from '@/modules/activitystream/services/streamActivity'
import { StreamAcl } from '@/modules/core/dbSchema'
import { ProjectsEmitter } from '@/modules/core/events/projectsEmitter'
import { StreamAclRecord, StreamRecord } from '@/modules/core/helpers/types'
@@ -43,10 +40,6 @@ import { omit } from 'lodash'
const getServerInfo = getServerInfoFactory({ db })
const getUsers = getUsersFactory({ db })
const getUser = getUserFactory({ db })
const addStreamCreatedActivity = addStreamCreatedActivityFactory({
saveActivity: saveActivityFactory({ db }),
publish
})
const getStream = getStreamFactory({ db })
const createStream = legacyCreateStreamFactory({
createStreamReturnRecord: createStreamReturnRecordFactory({
@@ -72,7 +65,6 @@ const createStream = legacyCreateStreamFactory({
}),
createStream: createStreamFactory({ db }),
createBranch: createBranchFactory({ db }),
addStreamCreatedActivity,
projectsEventsEmitter: ProjectsEmitter.emit
})
})
+3
View File
@@ -1,3 +1,6 @@
-- setup for replication
ALTER SYSTEM SET wal_level = logical;
CREATE DATABASE speckle2_test
WITH
OWNER = speckle
-1
View File
@@ -1 +0,0 @@
ALTER SYSTEM SET wal_level = logical;