openauth-plugins 0.0.3

Official OpenAuth plugin modules.
Documentation
use indexmap::IndexMap;
use openauth_core::db::{DbField, DbFieldType, DbTable};
use openauth_core::plugin::PluginSchemaContribution;

use super::options::{DeviceAuthorizationSchemaFields, DeviceAuthorizationSchemaOptions};

pub const DEVICE_CODE_MODEL: &str = "deviceCode";

pub fn device_code_table(options: &DeviceAuthorizationSchemaOptions) -> PluginSchemaContribution {
    PluginSchemaContribution::table(
        DEVICE_CODE_MODEL,
        DbTable {
            name: options
                .table_name
                .clone()
                .unwrap_or_else(|| "device_codes".to_owned()),
            order: Some(10),
            fields: fields(&options.fields),
        },
    )
}

fn fields(options: &DeviceAuthorizationSchemaFields) -> IndexMap<String, DbField> {
    [
        (
            "id",
            DbField::new(field_name(&options.id, "id"), DbFieldType::String),
        ),
        (
            "deviceCode",
            DbField::new(
                field_name(&options.device_code, "deviceCode"),
                DbFieldType::String,
            )
            .unique(),
        ),
        (
            "userCode",
            DbField::new(
                field_name(&options.user_code, "userCode"),
                DbFieldType::String,
            )
            .unique()
            .indexed(),
        ),
        (
            "userId",
            DbField::new(field_name(&options.user_id, "userId"), DbFieldType::String)
                .optional()
                .indexed(),
        ),
        (
            "expiresAt",
            DbField::new(
                field_name(&options.expires_at, "expiresAt"),
                DbFieldType::Timestamp,
            ),
        ),
        (
            "status",
            DbField::new(field_name(&options.status, "status"), DbFieldType::String),
        ),
        (
            "lastPolledAt",
            DbField::new(
                field_name(&options.last_polled_at, "lastPolledAt"),
                DbFieldType::Timestamp,
            )
            .optional(),
        ),
        (
            "pollingInterval",
            DbField::new(
                field_name(&options.polling_interval, "pollingInterval"),
                DbFieldType::Number,
            )
            .optional(),
        ),
        (
            "clientId",
            DbField::new(
                field_name(&options.client_id, "clientId"),
                DbFieldType::String,
            )
            .optional(),
        ),
        (
            "scope",
            DbField::new(field_name(&options.scope, "scope"), DbFieldType::String).optional(),
        ),
        (
            "createdAt",
            DbField::new(
                field_name(&options.created_at, "createdAt"),
                DbFieldType::Timestamp,
            )
            .generated(),
        ),
        (
            "updatedAt",
            DbField::new(
                field_name(&options.updated_at, "updatedAt"),
                DbFieldType::Timestamp,
            )
            .generated(),
        ),
    ]
    .into_iter()
    .map(|(name, field)| (name.to_owned(), field))
    .collect()
}

fn field_name<'a>(configured: &'a Option<String>, default: &'static str) -> &'a str {
    configured.as_deref().unwrap_or(default)
}