use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct UpdateDidWebvhBody {
#[serde(default)]
pub document: Option<Value>,
#[serde(default)]
pub pre_rotation_count: Option<u32>,
#[serde(default)]
pub witnesses: Option<Value>,
#[serde(default)]
pub watchers: Option<Vec<String>>,
#[serde(default)]
pub ttl: Option<u32>,
#[serde(default)]
pub label: Option<String>,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct RotateDidWebvhKeysBody {
#[serde(default)]
pub pre_rotation_count: Option<u32>,
#[serde(default)]
pub label: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateDidWebvhResultBody {
pub did: String,
pub new_version_id: String,
pub new_scid: String,
pub new_log_entry: String,
pub update_keys_count: u32,
pub pre_rotation_key_count: u32,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn update_body_round_trips_minimal() {
let body = UpdateDidWebvhBody::default();
let json = serde_json::to_string(&body).unwrap();
let restored: UpdateDidWebvhBody = serde_json::from_str(&json).unwrap();
assert!(restored.document.is_none());
assert!(restored.pre_rotation_count.is_none());
}
#[test]
fn update_body_round_trips_full() {
let body = UpdateDidWebvhBody {
document: Some(serde_json::json!({"id": "did:webvh:abc"})),
pre_rotation_count: Some(2),
witnesses: None,
watchers: Some(vec!["https://watcher.example.com".into()]),
ttl: Some(3600),
label: Some("rotate after audit".into()),
};
let json = serde_json::to_string(&body).unwrap();
let restored: UpdateDidWebvhBody = serde_json::from_str(&json).unwrap();
assert_eq!(restored.pre_rotation_count, Some(2));
assert_eq!(restored.ttl, Some(3600));
assert_eq!(restored.label.as_deref(), Some("rotate after audit"));
}
#[test]
fn rotate_body_round_trips() {
let body = RotateDidWebvhKeysBody {
pre_rotation_count: Some(3),
label: Some("scheduled".into()),
};
let json = serde_json::to_string(&body).unwrap();
let restored: RotateDidWebvhKeysBody = serde_json::from_str(&json).unwrap();
assert_eq!(restored.pre_rotation_count, Some(3));
}
#[test]
fn result_body_round_trips() {
let r = UpdateDidWebvhResultBody {
did: "did:webvh:abc".into(),
new_version_id: "3-zVer".into(),
new_scid: "abc".into(),
new_log_entry: "{\"versionId\":\"3-...\"}".into(),
update_keys_count: 1,
pre_rotation_key_count: 2,
};
let json = serde_json::to_string(&r).unwrap();
let restored: UpdateDidWebvhResultBody = serde_json::from_str(&json).unwrap();
assert_eq!(restored.update_keys_count, 1);
assert_eq!(restored.new_version_id, "3-zVer");
}
}