rvoip_core/
conversation.rs1use crate::ids::{ConversationId, MessageId, SessionId, TenantId};
2use crate::participant::Participant;
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6use std::fmt;
7
8#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
9pub enum ConversationState {
10 Open,
11 Closed,
12}
13
14#[derive(Clone, Debug, Serialize, Deserialize)]
15pub enum ConversationPolicy {
16 Ephemeral { idle_close_secs: u64 },
17 Persistent,
18}
19
20impl Default for ConversationPolicy {
21 fn default() -> Self {
22 ConversationPolicy::Ephemeral {
23 idle_close_secs: 30,
24 }
25 }
26}
27
28#[derive(Clone)]
29pub struct Conversation {
30 pub id: ConversationId,
31 pub tenant_id: TenantId,
32 pub state: ConversationState,
33 pub policy: ConversationPolicy,
34 pub participants: Vec<Participant>,
35 pub sessions: Vec<SessionId>,
36 pub messages: Vec<MessageId>,
37 pub opened_at: DateTime<Utc>,
38 pub closed_at: Option<DateTime<Utc>>,
39 pub last_activity_at: DateTime<Utc>,
44 pub metadata: HashMap<String, String>,
45}
46
47impl fmt::Debug for Conversation {
48 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
49 formatter
50 .debug_struct("Conversation")
51 .field("state", &self.state)
52 .field("policy", &self.policy)
53 .field("participant_count", &self.participants.len())
54 .field("session_count", &self.sessions.len())
55 .field("message_count", &self.messages.len())
56 .field("opened_at", &self.opened_at)
57 .field("closed_at", &self.closed_at)
58 .field("last_activity_at", &self.last_activity_at)
59 .field("metadata_count", &self.metadata.len())
60 .finish()
61 }
62}