Skip to main content

rustauth_plugins/anonymous/
mod.rs

1//! Anonymous authentication plugin.
2
3mod cookies;
4mod endpoints;
5mod errors;
6mod fields;
7mod hooks;
8mod model;
9mod options;
10mod response;
11mod schema;
12
13pub use errors::{AnonymousError, ANONYMOUS_ERROR_CODES};
14pub use hooks::AnonymousLinkAccount;
15pub use model::{AnonymousSession, AnonymousUser, LinkedSession};
16pub use options::{AnonymousOptions, AnonymousOptionsBuilder};
17
18use rustauth_core::plugin::AuthPlugin;
19use rustauth_core::{
20    db::{DbFieldType, DbValue},
21    options::UserAdditionalField,
22    plugin::PluginInitOutput,
23};
24
25pub const UPSTREAM_PLUGIN_ID: &str = "anonymous";
26
27#[must_use]
28pub fn anonymous(options: AnonymousOptions) -> AuthPlugin {
29    let init_options = options.clone();
30    let mut plugin = AuthPlugin::new(UPSTREAM_PLUGIN_ID)
31        .with_version(env!("CARGO_PKG_VERSION"))
32        .with_schema(schema::user_is_anonymous_schema(
33            options.field_name.as_deref(),
34        ))
35        .with_init(move |_| {
36            Ok(PluginInitOutput::new().user_additional_field(
37                "is_anonymous",
38                UserAdditionalField::new(DbFieldType::Boolean)
39                    .optional()
40                    .generated()
41                    .default_value(DbValue::Boolean(false))
42                    .db_name(init_options.storage_field_name()),
43            ))
44        })
45        .with_endpoint(endpoints::sign_in_anonymous_endpoint(options.clone()))
46        .with_endpoint(endpoints::delete_anonymous_user_endpoint(options.clone()));
47
48    for code in errors::error_codes() {
49        plugin = plugin.with_error_code(code);
50    }
51    hooks::attach_link_hooks(plugin, options)
52}