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