use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct ClerkAuth {
pub user_id: String,
#[serde(default)]
pub session_id: Option<String>,
#[serde(default)]
pub org_id: Option<String>,
#[serde(default)]
pub org_slug: Option<String>,
#[serde(default)]
pub org_role: Option<String>,
#[serde(default)]
pub org_permissions: Vec<String>,
pub exp: i64,
pub nbf: i64,
pub iat: i64,
}
impl ClerkAuth {
pub fn new(user_id: impl Into<String>, exp: i64) -> Self {
Self {
user_id: user_id.into(),
session_id: None,
org_id: None,
org_slug: None,
org_role: None,
org_permissions: vec![],
exp,
nbf: 0,
iat: 0,
}
}
pub fn has_permission(&self, permission: &str) -> bool {
self.org_permissions.iter().any(|p| p == permission)
}
pub fn has_role(&self, role: &str) -> bool {
self.org_role.as_deref() == Some(role)
}
pub fn has(&self, requirement: &super::AuthRequirement) -> bool {
use super::AuthRequirement;
match requirement {
AuthRequirement::SignedIn => true,
AuthRequirement::Role(role) => self.has_role(role),
AuthRequirement::Permission(permission) => self.has_permission(permission),
}
}
}