use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
use validator::Validate;
#[derive(Debug, Clone, Serialize, Deserialize, Validate)]
pub struct Document {
#[validate(length(min = 1, max = 64))]
pub id: String,
#[validate(length(min = 1, max = 64))]
pub form_id: String,
#[validate(length(min = 1, max = 64))]
pub workflow_id: String,
pub current_phase: String,
pub data: HashMap<String, Value>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
impl Document {
pub fn new(id: &str, form_id: &str, workflow_id: &str) -> Self {
let now = Utc::now();
Self {
id: id.to_string(),
form_id: form_id.to_string(),
workflow_id: workflow_id.to_string(),
current_phase: "".to_string(),
data: HashMap::new(),
created_at: now,
updated_at: now,
}
}
pub fn get_value(&self, field_id: &str) -> Option<&Value> {
self.data.get(field_id)
}
pub fn set_value(&mut self, field_id: &str, value: Value) {
self.data.insert(field_id.to_string(), value);
self.updated_at = Utc::now();
}
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn test_document_creation() {
let mut doc = Document::new("doc_123", "incident_report", "flow_123");
doc.set_value("title", json!("Server Crash"));
doc.set_value("severity", json!(5));
assert_eq!(doc.id, "doc_123");
assert_eq!(doc.data.get("title"), Some(&json!("Server Crash")));
}
#[test]
fn test_serialization() {
let mut doc = Document::new("doc_1", "form_1", "flow_1");
doc.set_value("active", json!(true));
let json_output = serde_json::to_string(&doc).unwrap();
assert!(json_output.contains("doc_1"));
assert!(json_output.contains("active"));
assert!(json_output.contains("true"));
}
}