Skip to main content

rustauth_core/options/
session.rs

1use std::collections::BTreeMap;
2
3use time::Duration;
4
5use crate::db::{DbFieldType, DbValue};
6
7use super::cookies::CookieCacheOptions;
8use super::model_schema::ModelSchemaOptions;
9
10/// Session configuration.
11#[derive(Debug, Clone, PartialEq, Default)]
12pub struct SessionOptions {
13    pub schema: ModelSchemaOptions,
14    pub expires_in: Option<Duration>,
15    pub update_age: Option<Duration>,
16    pub fresh_age: Option<Duration>,
17    pub disable_session_refresh: bool,
18    pub defer_session_refresh: bool,
19    pub store_session_in_database: bool,
20    pub preserve_session_in_database: bool,
21    pub cookie_cache: CookieCacheOptions,
22    pub additional_fields: BTreeMap<String, SessionAdditionalField>,
23}
24
25impl SessionOptions {
26    pub fn new() -> Self {
27        Self::default()
28    }
29
30    pub fn builder() -> Self {
31        Self::new()
32    }
33
34    #[must_use]
35    pub fn schema(mut self, schema: ModelSchemaOptions) -> Self {
36        self.schema = schema;
37        self
38    }
39
40    #[must_use]
41    pub fn expires_in(mut self, expires_in: Duration) -> Self {
42        self.expires_in = Some(expires_in);
43        self
44    }
45
46    #[must_use]
47    pub fn update_age(mut self, update_age: Duration) -> Self {
48        self.update_age = Some(update_age);
49        self
50    }
51
52    #[must_use]
53    pub fn fresh_age(mut self, fresh_age: Duration) -> Self {
54        self.fresh_age = Some(fresh_age);
55        self
56    }
57
58    #[must_use]
59    pub fn disable_session_refresh(mut self, disabled: bool) -> Self {
60        self.disable_session_refresh = disabled;
61        self
62    }
63
64    #[must_use]
65    pub fn defer_session_refresh(mut self, deferred: bool) -> Self {
66        self.defer_session_refresh = deferred;
67        self
68    }
69
70    #[must_use]
71    pub fn store_session_in_database(mut self, enabled: bool) -> Self {
72        self.store_session_in_database = enabled;
73        self
74    }
75
76    #[must_use]
77    pub fn preserve_session_in_database(mut self, enabled: bool) -> Self {
78        self.preserve_session_in_database = enabled;
79        self
80    }
81
82    #[must_use]
83    pub fn cookie_cache(mut self, cookie_cache: CookieCacheOptions) -> Self {
84        self.cookie_cache = cookie_cache;
85        self
86    }
87
88    #[must_use]
89    pub fn additional_field(
90        mut self,
91        name: impl Into<String>,
92        field: SessionAdditionalField,
93    ) -> Self {
94        self.additional_fields.insert(name.into(), field);
95        self
96    }
97}
98
99/// Runtime metadata for custom session fields accepted by `/update-session`.
100#[derive(Debug, Clone, PartialEq)]
101pub struct SessionAdditionalField {
102    pub field_type: DbFieldType,
103    pub required: bool,
104    pub input: bool,
105    pub returned: bool,
106    pub default_value: Option<DbValue>,
107    pub db_name: Option<String>,
108}
109
110impl SessionAdditionalField {
111    pub fn new(field_type: DbFieldType) -> Self {
112        Self {
113            field_type,
114            required: true,
115            input: true,
116            returned: true,
117            default_value: None,
118            db_name: None,
119        }
120    }
121
122    #[must_use]
123    pub fn optional(mut self) -> Self {
124        self.required = false;
125        self
126    }
127
128    #[must_use]
129    pub fn generated(mut self) -> Self {
130        self.input = false;
131        self
132    }
133
134    #[must_use]
135    pub fn hidden(mut self) -> Self {
136        self.returned = false;
137        self
138    }
139
140    #[must_use]
141    pub fn default_value(mut self, value: DbValue) -> Self {
142        self.default_value = Some(value);
143        self
144    }
145
146    #[must_use]
147    pub fn db_name(mut self, db_name: impl Into<String>) -> Self {
148        self.db_name = Some(db_name.into());
149        self
150    }
151}