Skip to main content

openauth_core/options/
session.rs

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