Skip to main content

toro_auth_core/
provider.rs

1use actix_web::web::{Data, ServiceConfig};
2use serde::{Deserialize, Serialize};
3
4use crate::{
5    IntoPublic, ObjectId,
6    identity::{IdentityBackend, IdentityProvider},
7    session::{SessionBackend, SessionError, SessionProvider},
8};
9
10#[derive(Clone)]
11pub struct AuthProvider<T, J>
12where
13    T: IntoPublic
14        + ObjectId
15        + Serialize
16        + for<'de> Deserialize<'de>
17        + Clone
18        + Send
19        + Sync
20        + 'static,
21    J: SessionBackend<T> + IdentityBackend<T> + Clone + Send + Sync + 'static,
22{
23    pub session_provider: Data<SessionProvider<T>>,
24    pub identity_provider: Data<IdentityProvider<T>>,
25    _backend: Data<J>,
26}
27
28impl<
29    T: IntoPublic + ObjectId + Serialize + for<'de> Deserialize<'de> + Clone + Send + Sync + 'static,
30    J: SessionBackend<T> + IdentityBackend<T> + Clone + Send + Sync + 'static,
31> AuthProvider<T, J>
32{
33    pub fn builder(backend: J) -> AuthProviderBuilder<T, J> {
34        AuthProviderBuilder::default_with_backend(backend)
35    }
36
37    pub fn default_with_backend(backend: J) -> Self {
38        AuthProviderBuilder::default_with_backend(backend).build()
39    }
40
41    pub fn configure(self, cfg: &mut ServiceConfig) {
42        let data = Data::new(self);
43        cfg.app_data(data.clone())
44            .configure(|cfg| data.clone().identity_provider.configure(cfg))
45            .configure(|cfg| data.clone().session_provider.configure(cfg));
46    }
47
48    pub async fn validate_session(&self, session_id: String) -> Result<T, SessionError> {
49        self.session_provider.validate(session_id).await
50    }
51}
52
53pub struct AuthProviderBuilder<T, J>
54where
55    T: IntoPublic
56        + ObjectId
57        + Serialize
58        + for<'de> Deserialize<'de>
59        + Clone
60        + Send
61        + Sync
62        + 'static,
63    J: SessionBackend<T> + IdentityBackend<T> + Send + Sync + 'static,
64{
65    session_provider: SessionProvider<T>,
66    identity_provider: IdentityProvider<T>,
67    backend: J,
68}
69
70impl<
71    T: IntoPublic + ObjectId + Serialize + for<'de> Deserialize<'de> + Clone + Send + Sync + 'static,
72    J: SessionBackend<T> + IdentityBackend<T> + Clone + Send + Sync + 'static,
73> AuthProviderBuilder<T, J>
74{
75    pub fn default_with_backend(backend: J) -> Self {
76        Self {
77            session_provider: SessionProvider::<T>::default_with_backend(Data::new(Box::new(
78                backend.clone(),
79            ))),
80            identity_provider: IdentityProvider::<T>::default_with_backend(Data::new(Box::new(
81                backend.clone(),
82            ))),
83            backend,
84        }
85    }
86
87    pub fn build(self) -> AuthProvider<T, J> {
88        AuthProvider {
89            _backend: Data::new(self.backend),
90            session_provider: Data::new(self.session_provider),
91            identity_provider: Data::new(self.identity_provider),
92        }
93    }
94}