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};