Skip to main content

rustauth_plugins/organization/
mod.rs

1//! Organization plugin.
2
3mod additional_fields;
4mod errors;
5mod hooks;
6mod http;
7mod limits;
8mod models;
9mod options;
10mod permissions;
11mod provisioning;
12mod record;
13mod routes;
14mod schema;
15mod store;
16
17pub use errors::ORGANIZATION_ERROR_CODES;
18pub use hooks::{
19    AfterAcceptInvitation, AfterAddMember, AfterAddTeamMember, AfterCancelInvitation,
20    AfterCreateInvitation, AfterCreateOrganization, AfterCreateTeam, AfterDeleteOrganization,
21    AfterDeleteTeam, AfterRejectInvitation, AfterRemoveMember, AfterRemoveTeamMember,
22    AfterUpdateMemberRole, AfterUpdateOrganization, AfterUpdateTeam, BeforeAcceptInvitation,
23    BeforeAddMember, BeforeAddTeamMember, BeforeCancelInvitation, BeforeCreateInvitation,
24    BeforeCreateOrganization, BeforeCreateTeam, BeforeDeleteOrganization, BeforeDeleteTeam,
25    BeforeRejectInvitation, BeforeRemoveMember, BeforeRemoveTeamMember, BeforeUpdateMemberRole,
26    BeforeUpdateOrganization, BeforeUpdateTeam, InvitationHookData, MemberHookData,
27    MemberRoleUpdateData, OrganizationHookData, OrganizationHooks, OrganizationUpdateData,
28    TeamHookData, TeamMemberHookData,
29};
30pub use limits::{
31    MembershipLimit, MembershipLimitCallback, OrganizationLimit, OrganizationLimitCallback,
32};
33pub use models::{
34    Invitation, InvitationStatus, Member, Organization, OrganizationRoleRecord, Team, TeamMember,
35};
36pub use options::{
37    CustomCreateDefaultTeamHook, DefaultTeamSpec, DynamicAccessControlOptions, InvitationEmail,
38    OrganizationOptions, OrganizationOptionsBuilder, OrganizationSchemaOptions,
39    SendInvitationEmailHook, TeamOptions,
40};
41pub use permissions::{has_permission, OrganizationPermission, OrganizationRole};
42pub use provisioning::{provision_organization_member, ProvisionOrganizationMemberInput};
43
44use rustauth_core::db::{DbFieldType, DbValue};
45use rustauth_core::options::SessionAdditionalField;
46use rustauth_core::plugin::{AuthPlugin, PluginInitOutput};
47
48pub mod access;
49
50pub const UPSTREAM_PLUGIN_ID: &str = "organization";
51
52#[must_use]
53pub fn organization(options: OrganizationOptions) -> AuthPlugin {
54    let mut plugin = AuthPlugin::new(UPSTREAM_PLUGIN_ID)
55        .with_version(env!("CARGO_PKG_VERSION"))
56        .with_options(options.to_metadata())
57        .with_state(options.clone());
58
59    for contribution in schema::schema_contributions(&options) {
60        plugin = plugin.with_schema(contribution);
61    }
62    for error_code in errors::error_codes() {
63        plugin = plugin.with_error_code(error_code);
64    }
65    for endpoint in routes::endpoints(options.clone()) {
66        plugin = plugin.with_endpoint(endpoint);
67    }
68    plugin.with_init(move |_context| {
69        let mut output = PluginInitOutput::new().session_additional_field(
70            "activeOrganizationId",
71            SessionAdditionalField::new(DbFieldType::String)
72                .optional()
73                .generated()
74                .db_name("active_organization_id")
75                .default_value(DbValue::Null),
76        );
77        if options.teams.enabled {
78            output = output.session_additional_field(
79                "activeTeamId",
80                SessionAdditionalField::new(DbFieldType::String)
81                    .optional()
82                    .generated()
83                    .db_name("active_team_id")
84                    .default_value(DbValue::Null),
85            );
86        }
87        Ok(output)
88    })
89}
90
91pub fn organization_options_from_context(
92    context: &rustauth_core::context::AuthContext,
93) -> Option<std::sync::Arc<OrganizationOptions>> {
94    context
95        .plugins
96        .iter()
97        .find(|plugin| plugin.id == UPSTREAM_PLUGIN_ID)
98        .and_then(|plugin| plugin.state::<OrganizationOptions>())
99}