rustauth_plugins/organization/
mod.rs1mod 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}