rustauth-sso 0.3.0

Single sign-on support for RustAuth.
Documentation
use indexmap::IndexMap;
use rustauth_core::db::{DbField, DbFieldType, DbTable, ForeignKey, OnDelete};
use rustauth_core::plugin::PluginSchemaContribution;

use crate::options::SsoOptions;

pub const SSO_PROVIDER_MODEL: &str = "sso_provider";

pub fn contributions(options: &SsoOptions) -> Vec<PluginSchemaContribution> {
    vec![PluginSchemaContribution::table(
        options.model_name.clone(),
        provider_table(options),
    )]
}

fn provider_table(options: &SsoOptions) -> DbTable {
    let mut fields = IndexMap::new();
    fields.insert("id".to_owned(), DbField::new("id", DbFieldType::String));
    fields.insert(
        "issuer".to_owned(),
        DbField::new("issuer", DbFieldType::String),
    );
    fields.insert(
        "oidc_config".to_owned(),
        DbField::new("oidc_config", DbFieldType::String)
            .optional()
            .hidden(),
    );
    fields.insert(
        "saml_config".to_owned(),
        DbField::new("saml_config", DbFieldType::String)
            .optional()
            .hidden(),
    );
    fields.insert(
        "user_id".to_owned(),
        DbField::new("user_id", DbFieldType::String)
            .indexed()
            .references(ForeignKey::new("users", "id", OnDelete::Cascade)),
    );
    fields.insert(
        "provider_id".to_owned(),
        DbField::new("provider_id", DbFieldType::String).unique(),
    );
    fields.insert(
        "organization_id".to_owned(),
        DbField::new("organization_id", DbFieldType::String)
            .optional()
            .indexed(),
    );
    fields.insert(
        "domain".to_owned(),
        DbField::new("domain", DbFieldType::String).indexed(),
    );
    if options.domain_verification.enabled {
        fields.insert(
            "domain_verified".to_owned(),
            DbField::new("domain_verified", DbFieldType::Boolean).optional(),
        );
    }
    fields.insert(
        "created_at".to_owned(),
        DbField::new("created_at", DbFieldType::Timestamp)
            .optional()
            .generated(),
    );
    fields.insert(
        "updated_at".to_owned(),
        DbField::new("updated_at", DbFieldType::Timestamp)
            .optional()
            .generated(),
    );

    DbTable {
        name: options.provider_table.clone(),
        fields,
        order: Some(30),
    }
}