use serde::{Deserialize, Serialize};
use crate::key_service::{ApiKeyInfo, PublicKey};
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SyncAudit {
#[serde(default)]
pub scanned_count: usize,
#[serde(default)]
pub applied_count: usize,
#[serde(default)]
pub skipped_count: usize,
#[serde(default)]
pub failed_count: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum NetworkAsset {
Gene {
id: String,
signals: Vec<String>,
strategy: Vec<String>,
validation: Vec<String>,
confidence: f64,
quality_score: f64,
use_count: u64,
success_count: u64,
created_at: String,
#[serde(skip_serializing_if = "Option::is_none")]
contributor_id: Option<String>,
},
Capsule {
id: String,
gene_id: String,
confidence: f64,
quality_score: f64,
use_count: u64,
success_count: u64,
created_at: String,
#[serde(skip_serializing_if = "Option::is_none")]
contributor_id: Option<String>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FetchResponse {
pub assets: Vec<NetworkAsset>,
#[serde(skip_serializing_if = "Option::is_none")]
pub next_cursor: Option<String>,
pub sync_audit: SyncAudit,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ShareResponse {
pub gene_id: String,
pub status: String,
pub published_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorResponse {
pub error: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub error_code: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HealthResponse {
pub status: String,
pub version: String,
}
impl HealthResponse {
pub fn ok() -> Self {
Self {
status: "ok".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateKeyResponse {
pub key_id: String,
pub api_key: String,
pub agent_id: String,
pub created_at: String,
pub expires_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListKeysResponse {
pub keys: Vec<ApiKeyInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RotateKeyResponse {
pub key_id: String,
pub api_key: String,
pub rotated_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegisterPublicKeyResponse {
pub sender_id: String,
pub version: i32,
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListPublicKeysResponse {
pub keys: Vec<PublicKeyInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PublicKeyInfo {
pub sender_id: String,
pub version: i32,
pub status: String,
pub created_at: String,
}
impl From<&PublicKey> for PublicKeyInfo {
fn from(pk: &PublicKey) -> Self {
Self {
sender_id: pk.sender_id.clone(),
version: pk.version,
status: pk.status.to_string(),
created_at: pk.created_at.to_rfc3339(),
}
}
}