use serde::{Deserialize, Serialize}; use sqlx::FromRow; use std::time::Duration; use uuid::Uuid; use chrono::{DateTime, Utc}; use utoipa::{ToSchema, IntoParams}; /// WebDAV operation types for categorizing different kinds of operations #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema)] #[serde(rename_all = "snake_case")] pub enum WebDAVOperationType { Discovery, Download, MetadataFetch, ConnectionTest, Validation, FullSync, } impl std::fmt::Display for WebDAVOperationType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Self::Discovery => write!(f, "discovery"), Self::Download => write!(f, "download"), Self::MetadataFetch => write!(f, "metadata_fetch"), Self::ConnectionTest => write!(f, "connection_test"), Self::Validation => write!(f, "validation"), Self::FullSync => write!(f, "full_sync"), } } } /// WebDAV request types (HTTP methods) #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema)] #[serde(rename_all = "UPPERCASE")] pub enum WebDAVRequestType { #[serde(rename = "PROPFIND")] PropFind, #[serde(rename = "GET")] Get, #[serde(rename = "HEAD")] Head, #[serde(rename = "OPTIONS")] Options, #[serde(rename = "POST")] Post, #[serde(rename = "PUT")] Put, #[serde(rename = "DELETE")] Delete, } impl std::fmt::Display for WebDAVRequestType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Self::PropFind => write!(f, "PROPFIND"), Self::Get => write!(f, "GET"), Self::Head => write!(f, "HEAD"), Self::Options => write!(f, "OPTIONS"), Self::Post => write!(f, "POST"), Self::Put => write!(f, "PUT"), Self::Delete => write!(f, "DELETE"), } } } /// Status of a WebDAV sync session #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)] #[serde(rename_all = "snake_case")] pub enum WebDAVSyncStatus { InProgress, Completed, Failed, Cancelled, } impl std::fmt::Display for WebDAVSyncStatus { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Self::InProgress => write!(f, "in_progress"), Self::Completed => write!(f, "completed"), Self::Failed => write!(f, "failed"), Self::Cancelled => write!(f, "cancelled"), } } } /// Request to create a new WebDAV sync session #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct CreateWebDAVSyncSession { pub user_id: Uuid, pub source_id: Option, pub sync_type: String, pub root_path: String, pub max_depth: Option, } /// WebDAV sync session record #[derive(Debug, Clone, FromRow, Serialize, Deserialize, ToSchema)] pub struct WebDAVSyncSession { pub id: Uuid, pub user_id: Uuid, pub source_id: Option, pub started_at: DateTime, pub completed_at: Option>, pub duration_ms: Option, pub sync_type: String, pub root_path: String, pub max_depth: Option, pub directories_discovered: i32, pub directories_processed: i32, pub files_discovered: i32, pub files_processed: i32, pub total_bytes_discovered: i64, pub total_bytes_processed: i64, pub avg_file_size_bytes: Option, pub processing_rate_files_per_sec: Option, pub total_http_requests: i32, pub successful_requests: i32, pub failed_requests: i32, pub retry_attempts: i32, pub directories_skipped: i32, pub files_skipped: i32, pub skip_reasons: Option, pub status: String, pub final_error_message: Option, pub slowest_operation_ms: Option, pub slowest_operation_path: Option, pub network_time_ms: Option, pub processing_time_ms: Option, pub created_at: DateTime, pub updated_at: DateTime, } /// Request to create a directory metrics record #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct CreateWebDAVDirectoryMetric { pub session_id: Uuid, pub user_id: Uuid, pub source_id: Option, pub directory_path: String, pub directory_depth: i32, pub parent_directory_path: Option, } /// WebDAV directory scan metrics #[derive(Debug, Clone, FromRow, Serialize, Deserialize, ToSchema)] pub struct WebDAVDirectoryMetric { pub id: Uuid, pub session_id: Uuid, pub user_id: Uuid, pub source_id: Option, pub directory_path: String, pub directory_depth: i32, pub parent_directory_path: Option, pub started_at: DateTime, pub completed_at: Option>, pub scan_duration_ms: Option, pub files_found: i32, pub subdirectories_found: i32, pub total_size_bytes: i64, pub files_processed: i32, pub files_skipped: i32, pub files_failed: i32, pub http_requests_made: i32, pub propfind_requests: i32, pub get_requests: i32, pub errors_encountered: i32, pub error_types: Option, pub warnings_count: i32, pub avg_response_time_ms: Option, pub slowest_request_ms: Option, pub fastest_request_ms: Option, pub etag_matches: i32, pub etag_mismatches: i32, pub cache_hits: i32, pub cache_misses: i32, pub status: String, pub skip_reason: Option, pub error_message: Option, pub created_at: DateTime, } /// Request to create an HTTP request metric record #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct CreateWebDAVRequestMetric { pub session_id: Option, pub directory_metric_id: Option, pub user_id: Uuid, pub source_id: Option, pub request_type: WebDAVRequestType, pub operation_type: WebDAVOperationType, pub target_path: String, pub duration_ms: i64, pub request_size_bytes: Option, pub response_size_bytes: Option, pub http_status_code: Option, pub dns_lookup_ms: Option, pub tcp_connect_ms: Option, pub tls_handshake_ms: Option, pub time_to_first_byte_ms: Option, pub success: bool, pub retry_attempt: i32, pub error_type: Option, pub error_message: Option, pub server_header: Option, pub dav_header: Option, pub etag_value: Option, pub last_modified: Option>, pub content_type: Option, pub remote_ip: Option, pub user_agent: Option, } /// WebDAV HTTP request metrics #[derive(Debug, Clone, FromRow, Serialize, Deserialize, ToSchema)] pub struct WebDAVRequestMetric { pub id: Uuid, pub session_id: Option, pub directory_metric_id: Option, pub user_id: Uuid, pub source_id: Option, pub request_type: String, pub operation_type: String, pub target_path: String, pub started_at: DateTime, pub completed_at: Option>, pub duration_ms: i64, pub request_size_bytes: Option, pub response_size_bytes: Option, pub http_status_code: Option, pub dns_lookup_ms: Option, pub tcp_connect_ms: Option, pub tls_handshake_ms: Option, pub time_to_first_byte_ms: Option, pub success: bool, pub retry_attempt: i32, pub error_type: Option, pub error_message: Option, pub server_header: Option, pub dav_header: Option, pub etag_value: Option, pub last_modified: Option>, pub content_type: Option, pub remote_ip: Option, pub user_agent: Option, } /// Summary metrics for WebDAV operations #[derive(Debug, Clone, FromRow, Serialize, Deserialize, ToSchema)] pub struct WebDAVMetricsSummary { pub total_sessions: i32, pub successful_sessions: i32, pub failed_sessions: i32, pub total_files_processed: i64, pub total_bytes_processed: i64, pub avg_session_duration_sec: f64, pub avg_processing_rate: f64, pub total_http_requests: i64, pub request_success_rate: f64, pub avg_request_duration_ms: f64, pub common_error_types: serde_json::Value, } /// Request parameters for querying WebDAV metrics #[derive(Debug, Clone, Serialize, Deserialize, ToSchema, IntoParams)] pub struct WebDAVMetricsQuery { pub user_id: Option, pub source_id: Option, pub start_time: Option>, pub end_time: Option>, pub limit: Option, pub offset: Option, } /// Performance insights for WebDAV operations #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct WebDAVPerformanceInsights { pub session_id: Uuid, pub avg_directory_scan_time_ms: f64, pub slowest_directories: Vec, pub request_distribution: RequestTypeDistribution, pub error_analysis: ErrorAnalysis, pub performance_trends: PerformanceTrends, } #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct SlowDirectoryInfo { pub path: String, pub scan_duration_ms: i64, pub files_count: i32, pub size_bytes: i64, pub error_count: i32, } #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct RequestTypeDistribution { pub propfind_count: i32, pub get_count: i32, pub head_count: i32, pub options_count: i32, pub total_count: i32, pub avg_propfind_duration_ms: f64, pub avg_get_duration_ms: f64, } #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct ErrorAnalysis { pub total_errors: i32, pub network_errors: i32, pub auth_errors: i32, pub timeout_errors: i32, pub server_errors: i32, pub most_problematic_paths: Vec, } #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct PerformanceTrends { pub requests_per_minute: Vec, pub avg_response_time_trend: Vec, pub error_rate_trend: Vec, pub throughput_mbps_trend: Vec, } /// Update request for WebDAV sync session #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct UpdateWebDAVSyncSession { pub directories_discovered: Option, pub directories_processed: Option, pub files_discovered: Option, pub files_processed: Option, pub total_bytes_discovered: Option, pub total_bytes_processed: Option, pub directories_skipped: Option, pub files_skipped: Option, pub skip_reasons: Option, pub status: Option, pub final_error_message: Option, } /// Update request for WebDAV directory metric #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct UpdateWebDAVDirectoryMetric { pub files_found: Option, pub subdirectories_found: Option, pub total_size_bytes: Option, pub files_processed: Option, pub files_skipped: Option, pub files_failed: Option, pub http_requests_made: Option, pub propfind_requests: Option, pub get_requests: Option, pub errors_encountered: Option, pub error_types: Option, pub warnings_count: Option, pub etag_matches: Option, pub etag_mismatches: Option, pub cache_hits: Option, pub cache_misses: Option, pub status: Option, pub skip_reason: Option, pub error_message: Option, }