use serde::{Deserialize, Serialize};
use utoipa::{IntoParams, ToSchema};
#[derive(Debug, Clone, Serialize, ToSchema)]
pub struct TraversalResultItem {
pub target_id: u64,
pub depth: u32,
pub path: Vec<u64>,
}
#[derive(Debug, Deserialize, IntoParams)]
pub struct EdgeQueryParams {
#[param(example = "KNOWS")]
pub label: Option<String>,
}
#[derive(Debug, Deserialize, ToSchema)]
pub struct TraverseRequest {
pub source: u64,
#[serde(default = "default_strategy")]
pub strategy: String,
#[serde(default = "default_max_depth")]
pub max_depth: u32,
#[serde(default = "default_limit")]
pub limit: usize,
pub cursor: Option<String>,
#[serde(default)]
pub rel_types: Vec<String>,
}
fn default_strategy() -> String {
"bfs".to_string()
}
fn default_max_depth() -> u32 {
3
}
fn default_limit() -> usize {
100
}
#[derive(Debug, Serialize, ToSchema)]
pub struct TraverseResponse {
pub results: Vec<TraversalResultItem>,
pub next_cursor: Option<String>,
pub has_more: bool,
pub stats: TraversalStats,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct TraversalStats {
pub visited: usize,
pub depth_reached: u32,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct DegreeResponse {
pub in_degree: usize,
pub out_degree: usize,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct EdgesResponse {
pub edges: Vec<EdgeResponse>,
pub count: usize,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct EdgeResponse {
pub id: u64,
pub source: u64,
pub target: u64,
pub label: String,
pub properties: serde_json::Value,
}
#[derive(Debug, Deserialize, ToSchema)]
pub struct AddEdgeRequest {
pub id: u64,
pub source: u64,
pub target: u64,
pub label: String,
#[serde(default)]
pub properties: serde_json::Value,
}
#[derive(Debug, Deserialize, IntoParams)]
pub struct StreamTraverseParams {
#[param(example = 123)]
pub start_node: u64,
#[serde(default = "default_algorithm")]
#[param(example = "bfs")]
pub algorithm: String,
#[serde(default = "default_stream_max_depth")]
#[param(example = 5)]
pub max_depth: u32,
#[serde(default = "default_stream_limit")]
#[param(example = 1000)]
pub limit: usize,
#[serde(default)]
#[param(example = "KNOWS,FOLLOWS")]
pub relationship_types: Option<String>,
}
fn default_algorithm() -> String {
"bfs".to_string()
}
fn default_stream_max_depth() -> u32 {
5
}
fn default_stream_limit() -> usize {
1000
}
#[derive(Debug, Serialize, ToSchema)]
pub struct StreamNodeEvent {
pub id: u64,
pub depth: u32,
pub path: Vec<u64>,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct StreamStatsEvent {
pub nodes_visited: usize,
pub elapsed_ms: u64,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct StreamDoneEvent {
pub total_nodes: usize,
pub max_depth_reached: u32,
pub elapsed_ms: u64,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct StreamErrorEvent {
pub error: String,
}