mas_data_model/compat/
session.rs1use std::net::IpAddr;
8
9use chrono::{DateTime, Utc};
10use serde::Serialize;
11use ulid::Ulid;
12
13use super::Device;
14use crate::{InvalidTransitionError, UserAgent};
15
16#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize)]
17pub enum CompatSessionState {
18 #[default]
19 Valid,
20 Finished {
21 finished_at: DateTime<Utc>,
22 },
23}
24
25impl CompatSessionState {
26 #[must_use]
30 pub fn is_valid(&self) -> bool {
31 matches!(self, Self::Valid)
32 }
33
34 #[must_use]
38 pub fn is_finished(&self) -> bool {
39 matches!(self, Self::Finished { .. })
40 }
41
42 pub fn finish(self, finished_at: DateTime<Utc>) -> Result<Self, InvalidTransitionError> {
54 match self {
55 Self::Valid => Ok(Self::Finished { finished_at }),
56 Self::Finished { .. } => Err(InvalidTransitionError),
57 }
58 }
59
60 #[must_use]
61 pub fn finished_at(&self) -> Option<DateTime<Utc>> {
62 match self {
63 CompatSessionState::Valid => None,
64 CompatSessionState::Finished { finished_at } => Some(*finished_at),
65 }
66 }
67}
68
69#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
70pub struct CompatSession {
71 pub id: Ulid,
72 pub state: CompatSessionState,
73 pub user_id: Ulid,
74 pub device: Option<Device>,
75 pub human_name: Option<String>,
76 pub user_session_id: Option<Ulid>,
77 pub created_at: DateTime<Utc>,
78 pub is_synapse_admin: bool,
79 pub user_agent: Option<UserAgent>,
80 pub last_active_at: Option<DateTime<Utc>>,
81 pub last_active_ip: Option<IpAddr>,
82}
83
84impl std::ops::Deref for CompatSession {
85 type Target = CompatSessionState;
86
87 fn deref(&self) -> &Self::Target {
88 &self.state
89 }
90}
91
92impl CompatSession {
93 pub fn finish(mut self, finished_at: DateTime<Utc>) -> Result<Self, InvalidTransitionError> {
103 self.state = self.state.finish(finished_at)?;
104 Ok(self)
105 }
106}