Skip to main content

rvoip_core/
conversation.rs

1use 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    /// Bumped on every lifecycle event the Conversation owns (Session
40    /// start/end, Participant join/leave, Message send). Drives the
41    /// Ephemeral-policy idle-close timer landing in P10; populated now
42    /// so call sites don't churn when the driver is wired up.
43    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}