use serde::{Deserialize, Serialize};
use validator::Validate;
#[derive(Debug, Clone, Serialize, Deserialize, Validate)]
pub struct BootstrapRequest {
#[validate(length(min = 1, max = 255))]
pub node_id: String,
pub csr: String,
pub requested_at: i64,
pub status: String,
#[serde(default)]
pub certificate: Option<String>,
}
impl BootstrapRequest {
pub fn is_pending(&self) -> bool {
self.status == "pending"
}
pub fn is_approved(&self) -> bool {
self.status == "approved"
}
pub fn approve(&mut self) {
self.status = "approved".to_string();
}
pub fn reject(&mut self) {
self.status = "rejected".to_string();
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct BootstrapResponse {
pub status: String,
pub message: String,
pub certificate: Option<String>,
pub ca_certificate: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegisteredAgent {
pub node_id: String,
pub cert_cn: String,
pub certificate_pem: String,
pub approved_at: i64,
pub last_seen: Option<i64>,
pub is_active: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BootstrapRequestMetadata {
pub node_id: String,
pub status: String,
pub requested_at: i64,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_bootstrap_request_status() {
let mut req = BootstrapRequest {
node_id: "agent-01".to_string(),
csr: "test_csr".to_string(),
requested_at: 1234567890,
status: "pending".to_string(),
certificate: None,
};
assert!(req.is_pending());
assert!(!req.is_approved());
req.approve();
assert!(req.is_approved());
assert!(!req.is_pending());
}
}