From 73cc7e67d3107f6208d02d6cd2e80d26bcb7f5b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20Jedlicska?= <57442769+gjedlicska@users.noreply.github.com> Date: Fri, 8 Nov 2024 10:45:39 +0100 Subject: [PATCH] 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 --- docker-compose-deps.yml | 2 - .../server/modules/activitystream/index.ts | 112 +++++++++---- .../activitystream/repositories/index.ts | 7 +- .../activitystream/services/eventListener.ts | 92 ++++++----- .../services/serverInvitesActivity.ts | 65 -------- .../tests/activitySummary.spec.ts | 23 +-- .../server/modules/auth/tests/auth.spec.js | 10 -- .../tests/blobstorage.graph.spec.js | 10 -- .../tests/blobstorage.integration.spec.js | 10 -- .../modules/cli/commands/download/commit.ts | 67 ++++---- .../modules/cli/commands/download/project.ts | 150 +++++++++--------- .../modules/comments/services/management.ts | 51 +++--- .../comments/tests/comments.graph.spec.js | 8 - .../modules/comments/tests/comments.spec.js | 8 - .../modules/core/domain/streams/operations.ts | 5 +- .../modules/core/graph/resolvers/projects.ts | 18 +-- .../modules/core/graph/resolvers/streams.ts | 18 +-- .../modules/core/repositories/models.ts | 14 ++ .../core/services/streams/management.ts | 19 +-- .../modules/core/tests/branches.spec.js | 8 - .../server/modules/core/tests/commits.spec.js | 13 +- .../core/tests/favoriteStreams.spec.js | 10 -- .../server/modules/core/tests/generic.spec.js | 10 -- .../server/modules/core/tests/objects.spec.js | 10 -- .../server/modules/core/tests/rest.spec.js | 10 -- .../server/modules/core/tests/streams.spec.ts | 6 - .../server/modules/core/tests/users.spec.js | 8 - .../modules/core/tests/usersAdminList.spec.ts | 8 - .../cross-server-sync/domain/operations.ts | 5 + .../server/modules/cross-server-sync/index.ts | 66 +++----- .../cross-server-sync/services/project.ts | 9 +- .../tests/fileuploads.integration.spec.ts | 8 - .../server/modules/multiregion/dbSelector.ts | 3 + .../server/modules/stats/tests/stats.spec.ts | 6 - .../webhooks/graph/resolvers/webhooks.ts | 33 ++-- packages/server/modules/webhooks/index.ts | 7 + .../modules/webhooks/services/webhooks.ts | 26 ++- .../modules/webhooks/tests/cleanup.spec.ts | 8 - .../modules/webhooks/tests/webhooks.spec.js | 12 +- .../workspaces/graph/resolvers/workspaces.ts | 15 +- packages/server/scripts/streamObjects.js | 10 -- .../test/speckle-helpers/streamHelper.ts | 10 +- setup/db/10-docker_postgres_init.sql | 3 + setup/db/9-docker_postgres_aiven.sql | 1 - 44 files changed, 383 insertions(+), 611 deletions(-) delete mode 100644 packages/server/modules/activitystream/services/serverInvitesActivity.ts create mode 100644 packages/server/modules/core/repositories/models.ts delete mode 100644 setup/db/9-docker_postgres_aiven.sql diff --git a/docker-compose-deps.yml b/docker-compose-deps.yml index e5e1876d7..a152da674 100644 --- a/docker-compose-deps.yml +++ b/docker-compose-deps.yml @@ -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: diff --git a/packages/server/modules/activitystream/index.ts b/packages/server/modules/activitystream/index.ts index f893c6b2b..0b97221a1 100644 --- a/packages/server/modules/activitystream/index.ts +++ b/packages/server/modules/activitystream/index.ts @@ -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 | null = null -let quitEventListeners: Optional> = - 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() diff --git a/packages/server/modules/activitystream/repositories/index.ts b/packages/server/modules/activitystream/repositories/index.ts index 24afebc46..bf5bbb5f2 100644 --- a/packages/server/modules/activitystream/repositories/index.ts +++ b/packages/server/modules/activitystream/repositories/index.ts @@ -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 }), diff --git a/packages/server/modules/activitystream/services/eventListener.ts b/packages/server/modules/activitystream/services/eventListener.ts index 17e2c2429..2a979bc66 100644 --- a/packages/server/modules/activitystream/services/eventListener.ts +++ b/packages/server/modules/activitystream/services/eventListener.ts @@ -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 + }) } diff --git a/packages/server/modules/activitystream/services/serverInvitesActivity.ts b/packages/server/modules/activitystream/services/serverInvitesActivity.ts deleted file mode 100644 index e004e952d..000000000 --- a/packages/server/modules/activitystream/services/serverInvitesActivity.ts +++ /dev/null @@ -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()) - } diff --git a/packages/server/modules/activitystream/tests/activitySummary.spec.ts b/packages/server/modules/activitystream/tests/activitySummary.spec.ts index 796ed4fa7..5c699b64b 100644 --- a/packages/server/modules/activitystream/tests/activitySummary.spec.ts +++ b/packages/server/modules/activitystream/tests/activitySummary.spec.ts @@ -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 () => { diff --git a/packages/server/modules/auth/tests/auth.spec.js b/packages/server/modules/auth/tests/auth.spec.js index af4f07675..56a2e2928 100644 --- a/packages/server/modules/auth/tests/auth.spec.js +++ b/packages/server/modules/auth/tests/auth.spec.js @@ -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 }) }) diff --git a/packages/server/modules/blobstorage/tests/blobstorage.graph.spec.js b/packages/server/modules/blobstorage/tests/blobstorage.graph.spec.js index 17e189d8f..a61259937 100644 --- a/packages/server/modules/blobstorage/tests/blobstorage.graph.spec.js +++ b/packages/server/modules/blobstorage/tests/blobstorage.graph.spec.js @@ -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 }) }) diff --git a/packages/server/modules/blobstorage/tests/blobstorage.integration.spec.js b/packages/server/modules/blobstorage/tests/blobstorage.integration.spec.js index b61ee6343..29b994c18 100644 --- a/packages/server/modules/blobstorage/tests/blobstorage.integration.spec.js +++ b/packages/server/modules/blobstorage/tests/blobstorage.integration.spec.js @@ -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 }) }) diff --git a/packages/server/modules/cli/commands/download/commit.ts b/packages/server/modules/cli/commands/download/commit.ts index 89723d2d9..d1156898f 100644 --- a/packages/server/modules/cli/commands/download/commit.ts +++ b/packages/server/modules/cli/commands/download/commit.ts @@ -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, diff --git a/packages/server/modules/cli/commands/download/project.ts b/packages/server/modules/cli/commands/download/project.ts index 0b1f9cca8..d149a0305 100644 --- a/packages/server/modules/cli/commands/download/project.ts +++ b/packages/server/modules/cli/commands/download/project.ts @@ -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 [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 }) }) diff --git a/packages/server/modules/comments/services/management.ts b/packages/server/modules/comments/services/management.ts index a395b14fd..97d3a7b3c 100644 --- a/packages/server/modules/comments/services/management.ts +++ b/packages/server/modules/comments/services/management.ts @@ -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) }) } diff --git a/packages/server/modules/comments/tests/comments.graph.spec.js b/packages/server/modules/comments/tests/comments.graph.spec.js index 33b9f4b35..25322858d 100644 --- a/packages/server/modules/comments/tests/comments.graph.spec.js +++ b/packages/server/modules/comments/tests/comments.graph.spec.js @@ -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 }) }) diff --git a/packages/server/modules/comments/tests/comments.spec.js b/packages/server/modules/comments/tests/comments.spec.js index 431cc4802..3ee1460ba 100644 --- a/packages/server/modules/comments/tests/comments.spec.js +++ b/packages/server/modules/comments/tests/comments.spec.js @@ -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 }) }) diff --git a/packages/server/modules/core/domain/streams/operations.ts b/packages/server/modules/core/domain/streams/operations.ts index 94feb59e2..18b95575d 100644 --- a/packages/server/modules/core/domain/streams/operations.ts +++ b/packages/server/modules/core/domain/streams/operations.ts @@ -250,10 +250,7 @@ export type CreateStream = ( params: (StreamCreateInput | ProjectCreateArgs) & { ownerId: string ownerResourceAccessRules?: MaybeNullOrUndefined - }, - options?: Partial<{ - createActivity: boolean - }> + } ) => Promise export type LegacyCreateStream = ( diff --git a/packages/server/modules/core/graph/resolvers/projects.ts b/packages/server/modules/core/graph/resolvers/projects.ts index 23ba0cf85..aba6bc2cf 100644 --- a/packages/server/modules/core/graph/resolvers/projects.ts +++ b/packages/server/modules/core/graph/resolvers/projects.ts @@ -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 }, diff --git a/packages/server/modules/core/graph/resolvers/streams.ts b/packages/server/modules/core/graph/resolvers/streams.ts index 2f3511c9c..3d839f0cd 100644 --- a/packages/server/modules/core/graph/resolvers/streams.ts +++ b/packages/server/modules/core/graph/resolvers/streams.ts @@ -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 }, diff --git a/packages/server/modules/core/repositories/models.ts b/packages/server/modules/core/repositories/models.ts new file mode 100644 index 000000000..6628af785 --- /dev/null +++ b/packages/server/modules/core/repositories/models.ts @@ -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 + }) + } diff --git a/packages/server/modules/core/services/streams/management.ts b/packages/server/modules/core/services/streams/management.ts index 953e8bd1a..f9209edae 100644 --- a/packages/server/modules/core/services/streams/management.ts +++ b/packages/server/modules/core/services/streams/management.ts @@ -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 - addStreamCreatedActivity: ReturnType projectsEventsEmitter: ProjectsEventsEmitter }): CreateStream => - async (params, options): Promise => { + async (params): Promise => { 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 } diff --git a/packages/server/modules/core/tests/branches.spec.js b/packages/server/modules/core/tests/branches.spec.js index bbdd2648d..fb86a67d2 100644 --- a/packages/server/modules/core/tests/branches.spec.js +++ b/packages/server/modules/core/tests/branches.spec.js @@ -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 }) }) diff --git a/packages/server/modules/core/tests/commits.spec.js b/packages/server/modules/core/tests/commits.spec.js index 8ec18dce5..0399e5aeb 100644 --- a/packages/server/modules/core/tests/commits.spec.js +++ b/packages/server/modules/core/tests/commits.spec.js @@ -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 }) }) diff --git a/packages/server/modules/core/tests/favoriteStreams.spec.js b/packages/server/modules/core/tests/favoriteStreams.spec.js index 9ad85cfaf..eb3ff059e 100644 --- a/packages/server/modules/core/tests/favoriteStreams.spec.js +++ b/packages/server/modules/core/tests/favoriteStreams.spec.js @@ -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 }) }) diff --git a/packages/server/modules/core/tests/generic.spec.js b/packages/server/modules/core/tests/generic.spec.js index 7a44e0f89..ee35707e3 100644 --- a/packages/server/modules/core/tests/generic.spec.js +++ b/packages/server/modules/core/tests/generic.spec.js @@ -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 }) }) diff --git a/packages/server/modules/core/tests/objects.spec.js b/packages/server/modules/core/tests/objects.spec.js index 0f36e780f..d51a62ae3 100644 --- a/packages/server/modules/core/tests/objects.spec.js +++ b/packages/server/modules/core/tests/objects.spec.js @@ -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 }) }) diff --git a/packages/server/modules/core/tests/rest.spec.js b/packages/server/modules/core/tests/rest.spec.js index 848fa99b2..9b9d9b0ef 100644 --- a/packages/server/modules/core/tests/rest.spec.js +++ b/packages/server/modules/core/tests/rest.spec.js @@ -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 }) }) diff --git a/packages/server/modules/core/tests/streams.spec.ts b/packages/server/modules/core/tests/streams.spec.ts index 36bcb98fa..a621f792d 100644 --- a/packages/server/modules/core/tests/streams.spec.ts +++ b/packages/server/modules/core/tests/streams.spec.ts @@ -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 }) }) diff --git a/packages/server/modules/core/tests/users.spec.js b/packages/server/modules/core/tests/users.spec.js index 82d19c9ba..c88a5d17c 100644 --- a/packages/server/modules/core/tests/users.spec.js +++ b/packages/server/modules/core/tests/users.spec.js @@ -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 }) }) diff --git a/packages/server/modules/core/tests/usersAdminList.spec.ts b/packages/server/modules/core/tests/usersAdminList.spec.ts index c0a447345..6b310f6bf 100644 --- a/packages/server/modules/core/tests/usersAdminList.spec.ts +++ b/packages/server/modules/core/tests/usersAdminList.spec.ts @@ -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 }) }) diff --git a/packages/server/modules/cross-server-sync/domain/operations.ts b/packages/server/modules/cross-server-sync/domain/operations.ts index d9c4be767..efdb4f699 100644 --- a/packages/server/modules/cross-server-sync/domain/operations.ts +++ b/packages/server/modules/cross-server-sync/domain/operations.ts @@ -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 diff --git a/packages/server/modules/cross-server-sync/index.ts b/packages/server/modules/cross-server-sync/index.ts index 8566e4b1d..f3078b503 100644 --- a/packages/server/modules/cross-server-sync/index.ts +++ b/packages/server/modules/cross-server-sync/index.ts @@ -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({ diff --git a/packages/server/modules/cross-server-sync/services/project.ts b/packages/server/modules/cross-server-sync/services/project.ts index 8c7dff001..b23265c15 100644 --- a/packages/server/modules/cross-server-sync/services/project.ts +++ b/packages/server/modules/cross-server-sync/services/project.ts @@ -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> @@ -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 }) diff --git a/packages/server/modules/fileuploads/tests/fileuploads.integration.spec.ts b/packages/server/modules/fileuploads/tests/fileuploads.integration.spec.ts index a90f4f57f..bb219862d 100644 --- a/packages/server/modules/fileuploads/tests/fileuploads.integration.spec.ts +++ b/packages/server/modules/fileuploads/tests/fileuploads.integration.spec.ts @@ -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 }) }) diff --git a/packages/server/modules/multiregion/dbSelector.ts b/packages/server/modules/multiregion/dbSelector.ts index 32f8c122a..18f2af125 100644 --- a/packages/server/modules/multiregion/dbSelector.ts +++ b/packages/server/modules/multiregion/dbSelector.ts @@ -126,6 +126,9 @@ export const getRegisteredRegionClients = async (): Promise => { return registeredRegionClients } +export const getRegisteredDbClients = async (): Promise => + Object.values(await getRegisteredRegionClients()) + export const initializeRegion: InitializeRegion = async ({ regionKey }) => { const knownClients = await getRegisteredRegionClients() if (regionKey in knownClients) diff --git a/packages/server/modules/stats/tests/stats.spec.ts b/packages/server/modules/stats/tests/stats.spec.ts index e9ea08c7a..99f199149 100644 --- a/packages/server/modules/stats/tests/stats.spec.ts +++ b/packages/server/modules/stats/tests/stats.spec.ts @@ -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 }) }) diff --git a/packages/server/modules/webhooks/graph/resolvers/webhooks.ts b/packages/server/modules/webhooks/graph/resolvers/webhooks.ts index 3401ad7aa..b0aad1607 100644 --- a/packages/server/modules/webhooks/graph/resolvers/webhooks.ts +++ b/packages/server/modules/webhooks/graph/resolvers/webhooks.ts @@ -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) } } diff --git a/packages/server/modules/webhooks/index.ts b/packages/server/modules/webhooks/index.ts index f1036dbf5..0ca35a563 100644 --- a/packages/server/modules/webhooks/index.ts +++ b/packages/server/modules/webhooks/index.ts @@ -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') }) diff --git a/packages/server/modules/webhooks/services/webhooks.ts b/packages/server/modules/webhooks/services/webhooks.ts index a138cfd74..eb471e771 100644 --- a/packages/server/modules/webhooks/services/webhooks.ts +++ b/packages/server/modules/webhooks/services/webhooks.ts @@ -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) diff --git a/packages/server/modules/webhooks/tests/cleanup.spec.ts b/packages/server/modules/webhooks/tests/cleanup.spec.ts index 7b879b122..0d287bd47 100644 --- a/packages/server/modules/webhooks/tests/cleanup.spec.ts +++ b/packages/server/modules/webhooks/tests/cleanup.spec.ts @@ -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 }) }) diff --git a/packages/server/modules/webhooks/tests/webhooks.spec.js b/packages/server/modules/webhooks/tests/webhooks.spec.js index 7b12d8c49..d389175c3 100644 --- a/packages/server/modules/webhooks/tests/webhooks.spec.js +++ b/packages/server/modules/webhooks/tests/webhooks.spec.js @@ -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 })({ diff --git a/packages/server/modules/workspaces/graph/resolvers/workspaces.ts b/packages/server/modules/workspaces/graph/resolvers/workspaces.ts index f78a38fa6..a074c90d6 100644 --- a/packages/server/modules/workspaces/graph/resolvers/workspaces.ts +++ b/packages/server/modules/workspaces/graph/resolvers/workspaces.ts @@ -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 }), diff --git a/packages/server/scripts/streamObjects.js b/packages/server/scripts/streamObjects.js index 819de81cc..fa39ca45c 100644 --- a/packages/server/scripts/streamObjects.js +++ b/packages/server/scripts/streamObjects.js @@ -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 }) }) diff --git a/packages/server/test/speckle-helpers/streamHelper.ts b/packages/server/test/speckle-helpers/streamHelper.ts index ce51913a6..957422350 100644 --- a/packages/server/test/speckle-helpers/streamHelper.ts +++ b/packages/server/test/speckle-helpers/streamHelper.ts @@ -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 }) }) diff --git a/setup/db/10-docker_postgres_init.sql b/setup/db/10-docker_postgres_init.sql index fbe3923ec..adaf78e15 100644 --- a/setup/db/10-docker_postgres_init.sql +++ b/setup/db/10-docker_postgres_init.sql @@ -1,3 +1,6 @@ +-- setup for replication +ALTER SYSTEM SET wal_level = logical; + CREATE DATABASE speckle2_test WITH OWNER = speckle diff --git a/setup/db/9-docker_postgres_aiven.sql b/setup/db/9-docker_postgres_aiven.sql deleted file mode 100644 index 809337064..000000000 --- a/setup/db/9-docker_postgres_aiven.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER SYSTEM SET wal_level = logical;