use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct User {
pub id: String,
pub email: String,
pub role: String,
pub created_at: String,
pub wallet_address: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuthResponse {
pub token: String,
pub user: User,
pub expires_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Database {
pub name: String,
pub tables: Vec<String>,
pub created_at: Option<String>,
pub size: Option<u64>,
pub record_count: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Table {
pub name: String,
pub columns: Vec<Column>,
pub row_count: Option<u64>,
pub size: Option<u64>,
pub created_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Column {
pub name: String,
pub data_type: String,
pub nullable: bool,
pub default_value: Option<String>,
pub is_primary_key: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QueryResult {
pub data: QueryData,
pub meta: QueryMeta,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QueryData {
pub columns: Option<Vec<String>>,
pub rows: Vec<Vec<serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QueryMeta {
pub row_count: u64,
pub execution_time_ms: Option<u64>,
pub operation_type: OperationType,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum OperationType {
Read,
Write,
Schema,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HealthStatus {
pub status: String,
pub version: String,
pub database: String,
pub blockchain: String,
pub uptime: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SystemStats {
pub databases: u64,
pub tables: u64,
pub rows: u64,
pub storage_bytes: Option<u64>,
pub active_connections: Option<u64>,
}
#[cfg(feature = "migration")]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MigrationStatus {
pub id: String,
pub status: MigrationState,
pub records_processed: u64,
pub total_records: Option<u64>,
pub started_at: String,
pub completed_at: Option<String>,
pub error: Option<String>,
}
#[cfg(feature = "migration")]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MigrationState {
Pending,
Running,
Completed,
Failed,
Cancelled,
}
#[cfg(feature = "sync")]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SyncConfig {
pub name: String,
pub source_type: String,
pub source: String,
pub target: String,
pub interval: u64,
pub created_at: String,
pub last_sync: Option<String>,
pub status: SyncStatus,
}
#[cfg(feature = "sync")]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SyncStatus {
Stopped,
Running,
Error {
message: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Pagination {
pub offset: u64,
pub limit: u64,
}
impl Default for Pagination {
fn default() -> Self {
Self {
offset: 0,
limit: 100,
}
}
}
#[derive(Debug, Clone, Default)]
pub struct QueryOptions {
pub max_rows: Option<u64>,
pub timeout_ms: Option<u64>,
pub include_meta: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchResult {
pub successful: u64,
pub failed: u64,
pub errors: Vec<BatchError>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchError {
pub index: u64,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApiResponse<T> {
pub data: T,
pub success: bool,
pub message: Option<String>,
pub meta: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone)]
pub struct RequestMeta {
pub request_id: Option<String>,
pub timestamp: chrono::DateTime<chrono::Utc>,
pub timeout: std::time::Duration,
}
impl Default for RequestMeta {
fn default() -> Self {
Self {
request_id: Some(uuid::Uuid::new_v4().to_string()),
timestamp: chrono::Utc::now(),
timeout: std::time::Duration::from_secs(30),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_pagination_default() {
let pagination = Pagination::default();
assert_eq!(pagination.offset, 0);
assert_eq!(pagination.limit, 100);
}
#[test]
fn test_query_options_default() {
let options = QueryOptions::default();
assert!(options.max_rows.is_none());
assert!(options.timeout_ms.is_none());
assert!(!options.include_meta);
}
#[test]
fn test_user_serialization() {
let user = User {
id: "123".to_string(),
email: "test@example.com".to_string(),
role: "user".to_string(),
created_at: "2023-01-01T00:00:00Z".to_string(),
wallet_address: Some("0x1234567890abcdef".to_string()),
};
let json = serde_json::to_string(&user).unwrap();
let deserialized: User = serde_json::from_str(&json).unwrap();
assert_eq!(user.id, deserialized.id);
assert_eq!(user.email, deserialized.email);
assert_eq!(user.wallet_address, deserialized.wallet_address);
}
}