ede566eed9
* prep for new resources algo * typescriptifying stuff * minor types fix * migrate to resources col * repo & creation updated, WIP processing/retrieval * WIP invite processing * finished finalization refactor * project invite management * transformed all invites services * fixed up projects & core serverinvites resolvers * test fixes * WIP workspace create GQL & test * basic invite creation test works * a buncha working tests * more tests * cancelation tests * minor invite use refactor * invite retrieval tasks * invite use() works as expected * filtering out broken invites * enabled invite retrieval by token irregardless of who is it for * minor adjustments * tests fix * test config improvements * test env adjustment * extra test case * making resource access limits harder to ignore * linter fixes * eventBus type cleanup * better generic names * refactored serverinvites resource migration * fix(server): better error message in project invite edge case
61 lines
1.9 KiB
TypeScript
61 lines
1.9 KiB
TypeScript
import {
|
|
ServerInvitesEvents,
|
|
ServerInvitesEventsPayloads
|
|
} from '@/modules/serverinvites/domain/events'
|
|
import {
|
|
isProjectResourceTarget,
|
|
resolveTarget
|
|
} from '@/modules/serverinvites/helpers/core'
|
|
import { EventBus } from '@/modules/shared/services/eventBus'
|
|
import { addStreamInviteSentOutActivity } from '@/modules/activitystream/services/streamActivity'
|
|
import { getStream } from '@/modules/core/repositories/streams'
|
|
import { Logger } from '@/logging/logging'
|
|
|
|
type OnServerInviteCreatedFactoryDeps = {
|
|
getStream: typeof getStream
|
|
logger: Logger
|
|
}
|
|
|
|
const onServerInviteCreatedFactory =
|
|
({ getStream, logger }: 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())
|
|
}
|