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 cookie_cache: CookieCacheOptions,
14    pub additional_fields: BTreeMap<String, SessionAdditionalField>,
15}
16
17impl SessionOptions {
18    pub fn new() -> Self {
19        Self::default()
20    }
21
22    pub fn builder() -> Self {
23        Self::new()
24    }
25
26    #[must_use]
27    pub fn expires_in(mut self, expires_in: u64) -> Self {
28        self.expires_in = Some(expires_in);
29        self
30    }
31
32    #[must_use]
33    pub fn update_age(mut self, update_age: u64) -> Self {
34        self.update_age = Some(update_age);
35        self
36    }
37
38    #[must_use]
39    pub fn fresh_age(mut self, fresh_age: u64) -> Self {
40        self.fresh_age = Some(fresh_age);
41        self
42    }
43
44    #[must_use]
45    pub fn cookie_cache(mut self, cookie_cache: CookieCacheOptions) -> Self {
46        self.cookie_cache = cookie_cache;
47        self
48    }
49
50    #[must_use]
51    pub fn additional_field(
52        mut self,
53        name: impl Into<String>,
54        field: SessionAdditionalField,
55    ) -> Self {
56        self.additional_fields.insert(name.into(), field);
57        self
58    }
59}
60
61/// Runtime metadata for custom session fields accepted by `/update-session`.
62#[derive(Debug, Clone, PartialEq)]
63pub struct SessionAdditionalField {
64    pub field_type: DbFieldType,
65    pub required: bool,
66    pub input: bool,
67    pub returned: bool,
68    pub default_value: Option<DbValue>,
69    pub db_name: Option<String>,
70}
71
72impl SessionAdditionalField {
73    pub fn new(field_type: DbFieldType) -> Self {
74        Self {
75            field_type,
76            required: true,
77            input: true,
78            returned: true,
79            default_value: None,
80            db_name: None,
81        }
82    }
83
84    #[must_use]
85    pub fn optional(mut self) -> Self {
86        self.required = false;
87        self
88    }
89
90    #[must_use]
91    pub fn generated(mut self) -> Self {
92        self.input = false;
93        self
94    }
95
96    #[must_use]
97    pub fn hidden(mut self) -> Self {
98        self.returned = false;
99        self
100    }
101
102    #[must_use]
103    pub fn default_value(mut self, value: DbValue) -> Self {
104        self.default_value = Some(value);
105        self
106    }
107
108    #[must_use]
109    pub fn db_name(mut self, db_name: impl Into<String>) -> Self {
110        self.db_name = Some(db_name.into());
111        self
112    }
113}