openauth-plugins 0.0.4

Official OpenAuth plugin modules.
Documentation
//! Organization plugin.

mod additional_fields;
mod errors;
mod hooks;
mod http;
mod models;
mod options;
mod permissions;
mod record;
mod routes;
mod schema;
mod store;

pub use errors::ORGANIZATION_ERROR_CODES;
pub use hooks::{
    AfterAcceptInvitation, AfterAddMember, AfterAddTeamMember, AfterCancelInvitation,
    AfterCreateInvitation, AfterCreateOrganization, AfterCreateTeam, AfterDeleteOrganization,
    AfterDeleteTeam, AfterRejectInvitation, AfterRemoveMember, AfterRemoveTeamMember,
    AfterUpdateMemberRole, AfterUpdateOrganization, AfterUpdateTeam, BeforeAcceptInvitation,
    BeforeAddMember, BeforeAddTeamMember, BeforeCancelInvitation, BeforeCreateInvitation,
    BeforeCreateOrganization, BeforeCreateTeam, BeforeDeleteOrganization, BeforeDeleteTeam,
    BeforeRejectInvitation, BeforeRemoveMember, BeforeRemoveTeamMember, BeforeUpdateMemberRole,
    BeforeUpdateOrganization, BeforeUpdateTeam, InvitationHookData, MemberHookData,
    MemberRoleUpdateData, OrganizationHooks, OrganizationUpdateData, TeamHookData,
    TeamMemberHookData,
};
pub use models::{
    Invitation, InvitationStatus, Member, Organization, OrganizationRoleRecord, Team, TeamMember,
};
pub use options::{
    DynamicAccessControlOptions, InvitationEmail, OrganizationOptions, OrganizationOptionsBuilder,
    OrganizationSchemaOptions, SendInvitationEmailHook, TeamOptions,
};
pub use permissions::{has_permission, OrganizationPermission, OrganizationRole};

use openauth_core::db::{DbFieldType, DbValue};
use openauth_core::options::SessionAdditionalField;
use openauth_core::plugin::{AuthPlugin, PluginInitOutput};

pub mod access;

pub const UPSTREAM_PLUGIN_ID: &str = "organization";

pub fn organization() -> AuthPlugin {
    organization_with_options(OrganizationOptions::default())
}

pub fn organization_with_options(options: OrganizationOptions) -> AuthPlugin {
    let mut plugin = AuthPlugin::new(UPSTREAM_PLUGIN_ID)
        .with_version(env!("CARGO_PKG_VERSION"))
        .with_options(options.to_metadata());

    for contribution in schema::schema_contributions(&options) {
        plugin = plugin.with_schema(contribution);
    }
    for error_code in errors::error_codes() {
        plugin = plugin.with_error_code(error_code);
    }
    for endpoint in routes::endpoints(options.clone()) {
        plugin = plugin.with_endpoint(endpoint);
    }
    plugin.with_init(move |_context| {
        let mut output = PluginInitOutput::new().session_additional_field(
            "activeOrganizationId",
            SessionAdditionalField::new(DbFieldType::String)
                .optional()
                .generated()
                .default_value(DbValue::Null),
        );
        if options.teams.enabled {
            output = output.session_additional_field(
                "activeTeamId",
                SessionAdditionalField::new(DbFieldType::String)
                    .optional()
                    .generated()
                    .default_value(DbValue::Null),
            );
        }
        Ok(output)
    })
}