use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
#[serde(rename_all = "UPPERCASE")]
pub enum DisclosureLevel {
Basic,
Standard,
Detailed,
Complete,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum EntityType {
Company,
Nonprofit,
Government,
Education,
Personal,
Other,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Entity {
pub id: String,
pub slug: String,
pub display_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub legal_name: Option<String>,
pub entity_type: EntityType,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default)]
pub domains: Vec<String>,
pub is_verified: bool,
pub is_active: bool,
#[serde(default)]
pub profile: HashMap<String, serde_json::Value>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub verification_date: Option<DateTime<Utc>>,
}
#[derive(Debug, Serialize)]
pub struct CreateEntityRequest {
pub display_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub legal_name: Option<String>,
pub entity_type: EntityType,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub domains: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub profile: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Default, Serialize)]
pub struct UpdateEntityRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub legal_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub domains: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub profile: Option<HashMap<String, serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_active: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Verification {
pub id: String,
pub domain: String,
pub method: String,
pub txt_record_name: String,
pub txt_record_value: String,
pub status: String,
pub created_at: DateTime<Utc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub verified_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WSAPData {
pub version: String,
pub entity_id: String,
pub domain: String,
pub disclosure_level: DisclosureLevel,
pub generated_at: DateTime<Utc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expires_at: Option<DateTime<Utc>>,
pub data: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct User {
pub id: String,
pub username: String,
pub email: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub first_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_name: Option<String>,
pub is_active: bool,
pub role: String,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaginatedResponse<T> {
pub count: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub next: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub previous: Option<String>,
pub results: Vec<T>,
}
#[derive(Debug, Default, Serialize)]
pub struct ListParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_size: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub entity_type: Option<EntityType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_verified: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_active: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub search: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HealthResponse {
pub status: String,
pub timestamp: DateTime<Utc>,
pub version: String,
#[serde(default)]
pub services: HashMap<String, bool>,
}