import { OutboxEvent } from './Outbox'; import { AssignmentActorReference, AssignmentStateReference, ConversationAssignmentReason } from './Assignment'; import { ID } from './Conversation'; export type TransferConversationReason = Extract; export type TransferConversationTarget = { type: 'queue'; queueId: ID; } | { type: 'user'; queueId: ID; userId: ID; }; export interface TransferConversationCommand { commandId: ID; spaceId: ID; conversationId: ID; target: TransferConversationTarget; expectedConversationVersion: number; actor: AssignmentActorReference; reason: TransferConversationReason; requestedAt: Date; } export type TransferConversationRejectionCode = 'conversation_not_found' | 'target_queue_not_found' | 'target_queue_disabled' | 'target_user_not_found' | 'target_user_not_authorized' | 'target_user_not_available' | 'target_user_has_no_capacity' | 'channel_not_supported' | 'same_queue' | 'same_owner' | 'actor_not_authorized' | 'conversation_not_transferable'; export type TransferConversationResult = { status: 'transferred'; commandId: ID; conversationId: ID; previousVersion: number; conversationVersion: number; previous: AssignmentStateReference; current: AssignmentStateReference; assignmentEventId: ID; outboxEventId: ID; } | { status: 'already_applied'; commandId: ID; conversationId: ID; conversationVersion: number; assignmentEventId: ID; outboxEventId: ID; } | { status: 'version_conflict'; commandId: ID; conversationId: ID; expectedVersion: number; currentVersion: number; } | { status: 'rejected'; commandId: ID; conversationId: ID; code: TransferConversationRejectionCode; }; export interface ConversationAssignmentChanged { eventId: ID; sourceEventId: ID; type: 'conversation.assignment.changed'; schemaVersion: 1; spaceId: ID; conversationId: ID; conversationVersion: number; reason: ConversationAssignmentReason; previous?: AssignmentStateReference; current: AssignmentStateReference; actor: AssignmentActorReference; correlationId: ID; causationId: ID; occurredAt: Date; } export type ConversationAssignmentChangedOutboxEvent = OutboxEvent & { aggregateType: 'conversation'; eventType: 'conversation.assignment.changed'; schemaVersion: 1; };