import { TokenResourceIdentifier } from '@/modules/core/domain/tokens/types' import { ServerInfo } from '@/modules/core/helpers/types' import { UserWithOptionalRole } from '@/modules/core/repositories/users' import { EmailTemplateParams } from '@/modules/emails/services/emailRendering' import { CreateInviteParams } from '@/modules/serverinvites/domain/operations' import { InviteResourceTarget, InviteResourceTargetType, PrimaryInviteResourceTarget, ServerInviteRecord } from '@/modules/serverinvites/domain/types' import { ResolvedTargetData } from '@/modules/serverinvites/helpers/core' import { MaybeAsync, MaybeNullOrUndefined } from '@speckle/shared' export type InviteResult = { inviteId: string token: string } export type CreateAndSendInvite = ( params: CreateInviteParams, inviterResourceAccessLimits: MaybeNullOrUndefined ) => Promise export type FinalizeInvite = (params: { finalizerUserId: string finalizerResourceAccessLimits: MaybeNullOrUndefined accept: boolean token: string resourceType?: InviteResourceTargetType }) => Promise export type ResendInviteEmail = (params: { inviteId: string }) => Promise export type CollectAndValidateResourceTargets = (params: { input: CreateInviteParams inviter: UserWithOptionalRole inviterResourceAccessLimits: MaybeNullOrUndefined target: ResolvedTargetData targetUser: MaybeNullOrUndefined serverInfo: ServerInfo }) => MaybeAsync> export type BuildInviteEmailContents = (params: { invite: ServerInviteRecord serverInfo: ServerInfo inviter: UserWithOptionalRole }) => MaybeAsync<{ emailParams: EmailTemplateParams subject: string }> export enum InviteFinalizationAction { ACCEPT = 'accept', DECLINE = 'decline', /** * Cancel differs from decline in the way that only the resource owner can cancel the invite, * invite target can only decline */ CANCEL = 'cancel' } /** * This function should throw if there's validation issue */ export type ValidateResourceInviteBeforeFinalization = (params: { invite: ServerInviteRecord finalizerUserId: string finalizerResourceAccessLimits: MaybeNullOrUndefined action: InviteFinalizationAction }) => MaybeAsync /** * Actually handle the invite being accepted or declined. The actual invite record * is already deleted by this point and doesn't require handling. */ export type ProcessFinalizedResourceInvite = (params: { invite: ServerInviteRecord finalizerUserId: string action: InviteFinalizationAction.ACCEPT | InviteFinalizationAction.DECLINE }) => MaybeAsync export type GetInvitationTargetUsers = (params: { invites: ServerInviteRecord[] }) => Promise<{ [key: string]: UserWithOptionalRole }>