Files
speckle-server/packages/server/test/speckle-helpers/inviteHelper.ts
T
Gergő Jedlicska c6cd4c311d feat(serverinvites): create domain module in server invites (#2401)
* chore(serverinvites): repository refactor for multiregion

* chore(serverinvites): remove migrated functions from old repository

* chore(serverinvites): refactor serverInviteForToken resolver for multiregion

* chore(serverinvites): invite processing service refactor for multiregion

* chore(serverinvites): subscription refactor for multiregion

* chore(serverinvites): move buildEmailContents to dedicated file

* chore(serverinvites): deleteAllStreamInvites function multiregion refactor

* chore(serverinvites): refactor deleteServerOnlyInvites multiregion repository

* chore(serverinvites): complete repository refactor for multiregion

* feat(serverinvites): create domain module in server invites

* fix(serverinvites): no relative imports

* feat(serverinvites): extract individual types from repository

* feat(serverinvites): move interfaces to operations

* fix(serverinvites): update imports referencing old interfaces file

* fix(serverinvites): type mismatch for insert invite and delete old

* chore(serverinvites): refactor to single repo function

* test(serverinvites): fix tests

* fix(serverinvites): use domain types in all places

* feat(serverinvites): WIP unity

* feat(serverinvites): move to new facory names and types

* feat(serverinvites): fix tests

* fix(serverinvites): use factory name

---------

Co-authored-by: Alessandro Magionami <alessandro.magionami@gmail.com>
2024-06-25 13:24:37 +02:00

59 lines
1.9 KiB
TypeScript

import { Roles } from '@speckle/shared'
import {
buildUserTarget,
ResourceTargets
} from '@/modules/serverinvites/helpers/inviteHelper'
import { InviteResult } from '@/modules/serverinvites/services/operations'
import { StreamRecord, UserRecord } from '@/modules/core/helpers/types'
import {
findResourceFactory,
findUserByTargetFactory,
insertInviteAndDeleteOldFactory
} from '@/modules/serverinvites/repositories/serverInvites'
import { Knex } from 'knex'
import { createAndSendInviteFactory } from '@/modules/serverinvites/services/inviteCreationService'
/**
* Create a new invite. User & userId are alternatives for each other, and so
* are stream & streamId
*/
export const createInviteDirectlyFactory =
// This is a test helper, so im ok, with leaking the internal abstractions here
({ db }: { db: Knex }) =>
async (
invite: {
email?: string
user?: UserRecord
userId?: string
message?: string
stream?: StreamRecord
streamId?: string
},
creatorId: string
): Promise<InviteResult> => {
const userId = invite.userId || invite.user?.id || null
const email = invite.email || null
if (!userId && !email) throw new Error('Either user/userId or email must be set')
const streamId = invite.streamId || invite.stream?.id
const target = email || buildUserTarget(userId)
if (!target) throw new Error('Cannot create invite without a target')
return await createAndSendInviteFactory({
findUserByTarget: findUserByTargetFactory(),
findResource: findResourceFactory(),
insertInviteAndDeleteOld: insertInviteAndDeleteOldFactory({ db })
})({
target,
inviterId: creatorId,
message: invite.message,
resourceTarget: streamId ? ResourceTargets.Streams : undefined,
resourceId: streamId,
role: streamId ? Roles.Stream.Contributor : undefined
})
}