use serde::{Deserialize, Serialize};
use uuid::Uuid;
use crate::auth::{PrincipalId, PrincipalKindTag, SecretBearer};
use crate::reference::CardRef;
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
#[cfg_attr(feature = "server", derive(utoipa::ToSchema))]
#[serde(deny_unknown_fields)]
pub struct CreateServicePrincipalRequest {
pub name: String,
pub roles: Vec<String>,
#[serde(default)]
pub description: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, schemars::JsonSchema)]
#[cfg_attr(feature = "server", derive(utoipa::ToSchema))]
pub struct CreateServicePrincipalResponse {
pub principal_id: PrincipalId,
#[schemars(with = "String")]
pub credential: SecretBearer,
}
#[derive(Debug, Serialize, Deserialize, schemars::JsonSchema)]
#[cfg_attr(feature = "server", derive(utoipa::ToSchema))]
pub struct IssuedCredential {
pub id: Uuid,
#[schemars(with = "String")]
pub credential: SecretBearer,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
#[cfg_attr(feature = "server", derive(utoipa::ToSchema))]
pub struct CredentialMetadata {
pub id: Uuid,
pub prefix: String,
pub created_at: String,
#[serde(default)]
pub expires_at: Option<String>,
#[serde(default)]
pub revoked_at: Option<String>,
#[serde(default)]
pub last_used_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
#[cfg_attr(feature = "server", derive(utoipa::ToSchema))]
pub struct CredentialListResponse {
pub credentials: Vec<CredentialMetadata>,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct ListCredentialsArgs {
pub principal_id: PrincipalId,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct RevokeCredentialArgs {
pub principal_id: PrincipalId,
pub credential_id: Uuid,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct CredentialRevoked {
pub revoked: bool,
pub credential_id: Uuid,
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Serialize,
Deserialize,
schemars::JsonSchema,
)]
#[cfg_attr(feature = "server", derive(utoipa::ToSchema))]
#[serde(rename_all = "snake_case")]
pub enum RoleSource {
Idp,
Direct,
}
impl RoleSource {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Idp => "idp",
Self::Direct => "direct",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
#[cfg_attr(feature = "server", derive(utoipa::ToSchema))]
#[serde(deny_unknown_fields)]
pub struct RoleAssignment {
pub role: String,
pub source: RoleSource,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
#[cfg_attr(feature = "server", derive(utoipa::ToSchema))]
#[serde(deny_unknown_fields)]
pub struct PrincipalRoles {
pub principal_id: PrincipalId,
pub kind: PrincipalKindTag,
pub roles: Vec<RoleAssignment>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
#[cfg_attr(feature = "server", derive(utoipa::ToSchema))]
#[serde(deny_unknown_fields)]
pub struct RoleAssignmentChange {
pub principal_id: PrincipalId,
pub kind: PrincipalKindTag,
pub role: String,
pub changed: bool,
pub roles: Vec<RoleAssignment>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, schemars::JsonSchema)]
#[cfg_attr(feature = "server", derive(utoipa::ToSchema))]
#[serde(rename_all = "snake_case")]
pub enum PrincipalStatus {
Active,
Suspended,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
#[cfg_attr(feature = "server", derive(utoipa::ToSchema))]
#[serde(deny_unknown_fields)]
pub struct PrincipalSummary {
pub principal_id: PrincipalId,
pub kind: PrincipalKindTag,
pub status: PrincipalStatus,
#[serde(default)]
pub email: Option<String>,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub card_ref: Option<CardRef>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
#[cfg_attr(feature = "server", derive(utoipa::ToSchema))]
#[serde(deny_unknown_fields)]
pub struct PrincipalPage {
pub principals: Vec<PrincipalSummary>,
#[serde(default)]
pub next: Option<PrincipalId>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
#[cfg_attr(feature = "server", derive(utoipa::IntoParams))]
#[cfg_attr(feature = "server", into_params(parameter_in = Query))]
#[serde(deny_unknown_fields)]
pub struct PrincipalQuery {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub kind: Option<PrincipalKindTag>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[schemars(range(min = 1, max = 200))]
#[cfg_attr(feature = "server", param(minimum = 1, maximum = 200))]
pub limit: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub after: Option<PrincipalId>,
}