Skip to main content

better_auth_api/plugins/
mod.rs

1pub mod account_management;
2pub mod admin;
3pub mod api_key;
4pub mod email_password;
5pub mod email_verification;
6pub mod helpers;
7pub mod oauth;
8pub mod organization;
9pub mod passkey;
10pub mod password_management;
11pub mod session_management;
12pub mod two_factor;
13pub mod user_management;
14
15use serde::{Deserialize, Serialize};
16
17#[derive(Debug, Serialize, Deserialize)]
18pub(crate) struct StatusResponse {
19    status: bool,
20}
21
22#[cfg(test)]
23pub(crate) mod test_helpers {
24    use better_auth_core::adapters::{MemoryDatabaseAdapter, SessionOps, UserOps};
25    use better_auth_core::config::AuthConfig;
26    use better_auth_core::{
27        AuthContext, AuthRequest, CreateSession, CreateUser, HttpMethod, Session, User,
28    };
29    use chrono::{Duration, Utc};
30    use std::collections::HashMap;
31    use std::sync::Arc;
32
33    pub fn create_test_config() -> AuthConfig {
34        AuthConfig::new("test-secret-key-at-least-32-chars-long")
35    }
36
37    pub fn create_test_context() -> AuthContext<MemoryDatabaseAdapter> {
38        create_test_context_with_config(create_test_config())
39    }
40
41    pub fn create_test_context_with_config(
42        config: AuthConfig,
43    ) -> AuthContext<MemoryDatabaseAdapter> {
44        let config = Arc::new(config);
45        let database = Arc::new(MemoryDatabaseAdapter::new());
46        AuthContext::new(config, database)
47    }
48
49    pub async fn create_user(
50        ctx: &AuthContext<MemoryDatabaseAdapter>,
51        create_user: CreateUser,
52    ) -> User {
53        ctx.database.create_user(create_user).await.unwrap()
54    }
55
56    pub async fn create_session(
57        ctx: &AuthContext<MemoryDatabaseAdapter>,
58        user_id: String,
59        expires_in: Duration,
60    ) -> Session {
61        let create_session = CreateSession {
62            user_id,
63            expires_at: Utc::now() + expires_in,
64            ip_address: Some("127.0.0.1".to_string()),
65            user_agent: Some("test-agent".to_string()),
66            impersonated_by: None,
67            active_organization_id: None,
68        };
69        ctx.database.create_session(create_session).await.unwrap()
70    }
71
72    pub async fn create_user_and_session(
73        ctx: &AuthContext<MemoryDatabaseAdapter>,
74        user_data: CreateUser,
75        session_expires_in: Duration,
76    ) -> (User, Session) {
77        let user = create_user(ctx, user_data).await;
78        let session = create_session(ctx, user.id.clone(), session_expires_in).await;
79        (user, session)
80    }
81
82    pub async fn create_test_context_with_user(
83        create_user: CreateUser,
84        session_expires_in: Duration,
85    ) -> (AuthContext<MemoryDatabaseAdapter>, User, Session) {
86        let ctx = create_test_context();
87        let (user, session) = create_user_and_session(&ctx, create_user, session_expires_in).await;
88        (ctx, user, session)
89    }
90
91    pub fn create_auth_request(
92        method: HttpMethod,
93        path: &str,
94        token: Option<&str>,
95        body: Option<Vec<u8>>,
96        query: HashMap<String, String>,
97    ) -> AuthRequest {
98        let mut headers = HashMap::new();
99        if let Some(token) = token {
100            headers.insert("authorization".to_string(), format!("Bearer {}", token));
101        }
102
103        AuthRequest::from_parts(method, path.to_string(), headers, body, query)
104    }
105
106    pub fn create_auth_request_no_query(
107        method: HttpMethod,
108        path: &str,
109        token: Option<&str>,
110        body: Option<Vec<u8>>,
111    ) -> AuthRequest {
112        create_auth_request(method, path, token, body, HashMap::new())
113    }
114
115    pub fn create_auth_json_request_no_query(
116        method: HttpMethod,
117        path: &str,
118        token: Option<&str>,
119        body: Option<serde_json::Value>,
120    ) -> AuthRequest {
121        create_auth_json_request(method, path, token, body, HashMap::new())
122    }
123
124    pub fn create_auth_json_request(
125        method: HttpMethod,
126        path: &str,
127        token: Option<&str>,
128        body: Option<serde_json::Value>,
129        query: HashMap<String, String>,
130    ) -> AuthRequest {
131        let mut req = create_auth_request(
132            method,
133            path,
134            token,
135            body.map(|b| serde_json::to_vec(&b).unwrap()),
136            query,
137        );
138        req.headers
139            .insert("content-type".to_string(), "application/json".to_string());
140        req
141    }
142}
143
144pub use account_management::AccountManagementPlugin;
145pub use admin::{AdminConfig, AdminPlugin};
146pub use api_key::{ApiKeyConfig, ApiKeyPlugin};
147pub use better_auth_core::PasswordHasher;
148pub use email_password::{EmailPasswordConfig, EmailPasswordPlugin};
149pub use email_verification::{
150    EmailVerificationConfig, EmailVerificationHook, EmailVerificationPlugin, SendVerificationEmail,
151};
152pub use organization::{OrganizationConfig, OrganizationPlugin};
153pub use passkey::{PasskeyConfig, PasskeyPlugin};
154pub use password_management::{
155    PasswordManagementConfig, PasswordManagementPlugin, SendResetPassword,
156};
157pub use session_management::SessionManagementPlugin;
158pub use two_factor::{TwoFactorConfig, TwoFactorPlugin};
159pub use user_management::{
160    ChangeEmailConfig, DeleteUserConfig, UserManagementConfig, UserManagementPlugin,
161};