use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use std::collections::HashMap;
use super::datetime_format;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, ToSchema)]
#[serde(rename_all = "snake_case")]
pub enum RelationType {
Contains,
References,
RelatedTo,
DependsOn,
Supersedes,
Complements,
HasInstance,
HasAgent,
}
impl std::fmt::Display for RelationType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
RelationType::Contains => write!(f, "contains"),
RelationType::References => write!(f, "references"),
RelationType::RelatedTo => write!(f, "related_to"),
RelationType::DependsOn => write!(f, "depends_on"),
RelationType::Supersedes => write!(f, "supersedes"),
RelationType::Complements => write!(f, "complements"),
RelationType::HasInstance => write!(f, "has_instance"),
RelationType::HasAgent => write!(f, "has_agent"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct Relation {
#[serde(rename = "_id")]
pub id: String,
pub from_asset_id: String,
pub to_asset_id: String,
pub relation_type: RelationType,
#[serde(default)]
pub metadata: HashMap<String, serde_json::Value>,
#[serde(with = "datetime_format")]
pub created_at: DateTime<Utc>,
pub created_by: String,
}
#[derive(Debug, Clone, Deserialize, ToSchema)]
pub struct CreateRelationRequest {
pub from_asset_id: String,
pub to_asset_id: String,
pub relation_type: RelationType,
#[serde(default)]
pub metadata: HashMap<String, serde_json::Value>,
}