Skip to main content

authx_core/
identity.rs

1use serde::{Deserialize, Serialize};
2
3use crate::models::{Membership, Organization, Session, User};
4
5/// Request-scoped resolved identity — user + active org context.
6///
7/// Constructed by the session middleware and passed to route handlers
8/// via framework extractors. Never persisted.
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct Identity {
11    pub user: User,
12    pub session: Session,
13    pub active_org: Option<Organization>,
14    pub active_membership: Option<Membership>,
15}
16
17impl Identity {
18    pub fn new(user: User, session: Session) -> Self {
19        Self {
20            user,
21            session,
22            active_org: None,
23            active_membership: None,
24        }
25    }
26
27    pub fn with_org(mut self, org: Organization, membership: Membership) -> Self {
28        self.active_org = Some(org);
29        self.active_membership = Some(membership);
30        self
31    }
32
33    pub fn has_permission(&self, permission: &str) -> bool {
34        self.active_membership
35            .as_ref()
36            .map(|m| m.role.permissions.iter().any(|p| p == permission))
37            .unwrap_or(false)
38    }
39
40    pub fn has_role(&self, role: &str) -> bool {
41        self.active_membership
42            .as_ref()
43            .map(|m| m.role.name == role)
44            .unwrap_or(false)
45    }
46}