From c63c92245fd283dd1de38683231e746e796e4a19 Mon Sep 17 00:00:00 2001 From: nutcas3 Date: Tue, 14 Apr 2026 16:29:27 +0300 Subject: [PATCH] refactor: Reorganize charging and errors modules into proper directory structure - Move charging module files into charging/ directory (types.rs, engine.rs, credit_management.rs, rating_billing.rs) - Move error module files into errors/ directory (types.rs, helpers.rs) - Create mod.rs files for charging and errors modules with simplified exports - Update import paths to use super:: for intra-module references - Remove charging_new/errors_new aliases and use charging/errors directly - Simplify module --- apps/charging-engine/src/charging.rs | 20 +- .../src/{ => charging}/credit_management.rs | 2 +- .../engine.rs} | 2 +- apps/charging-engine/src/charging/mod.rs | 6 + .../src/{ => charging}/rating_billing.rs | 2 +- .../{charging_types.rs => charging/types.rs} | 0 apps/charging-engine/src/errors.rs | 7 +- .../{error_helpers.rs => errors/helpers.rs} | 0 apps/charging-engine/src/errors/mod.rs | 2 + .../src/{error_types.rs => errors/types.rs} | 0 apps/charging-engine/src/main.rs | 16 +- apps/charging-engine/src/monitoring.rs | 175 +----------------- apps/charging-engine/src/monitoring/mod.rs | 4 + .../src/monitoring/monitoring.rs | 172 +++++++++++++++++ .../operations.rs} | 0 .../sync.rs} | 0 .../types.rs} | 0 17 files changed, 199 insertions(+), 209 deletions(-) rename apps/charging-engine/src/{ => charging}/credit_management.rs (98%) rename apps/charging-engine/src/{charging_engine.rs => charging/engine.rs} (98%) create mode 100644 apps/charging-engine/src/charging/mod.rs rename apps/charging-engine/src/{ => charging}/rating_billing.rs (99%) rename apps/charging-engine/src/{charging_types.rs => charging/types.rs} (100%) rename apps/charging-engine/src/{error_helpers.rs => errors/helpers.rs} (100%) create mode 100644 apps/charging-engine/src/errors/mod.rs rename apps/charging-engine/src/{error_types.rs => errors/types.rs} (100%) create mode 100644 apps/charging-engine/src/monitoring/mod.rs create mode 100644 apps/charging-engine/src/monitoring/monitoring.rs rename apps/charging-engine/src/{sync_operations.rs => monitoring/operations.rs} (100%) rename apps/charging-engine/src/{monitoring_sync.rs => monitoring/sync.rs} (100%) rename apps/charging-engine/src/{monitoring_types.rs => monitoring/types.rs} (100%) diff --git a/apps/charging-engine/src/charging.rs b/apps/charging-engine/src/charging.rs index 904d5fb..67f7d28 100644 --- a/apps/charging-engine/src/charging.rs +++ b/apps/charging-engine/src/charging.rs @@ -1,20 +1,6 @@ -pub mod charging_types; -pub mod charging_engine; +pub mod types; +pub mod engine; pub mod credit_management; pub mod rating_billing; -pub mod monitoring_sync; -pub mod monitoring_types; -pub mod sync_operations; -pub mod monitoring; -pub use charging_types::{ - SubscriberAccount, AccountStatus, UsageEvent, UsageType, RatingPlan, - ChargingSession, SessionStatus, ChargingRule, Condition, Action -}; - -pub use charging_engine::ChargingEngine; - -pub use monitoring::{SystemStats, HealthStatus}; -pub use monitoring_types::{PerformanceMetrics, ErrorStats}; - -pub use crate::errors::{ChargingError, ChargingResult, ErrorContext}; +pub use engine::ChargingEngine; diff --git a/apps/charging-engine/src/credit_management.rs b/apps/charging-engine/src/charging/credit_management.rs similarity index 98% rename from apps/charging-engine/src/credit_management.rs rename to apps/charging-engine/src/charging/credit_management.rs index b10ac3e..f2988db 100644 --- a/apps/charging-engine/src/credit_management.rs +++ b/apps/charging-engine/src/charging/credit_management.rs @@ -1,7 +1,7 @@ use redis::AsyncCommands; use tracing::{info, warn, error, debug}; -use crate::charging_types::{SubscriberAccount, UsageEvent}; +use super::types::{SubscriberAccount, UsageEvent}; use crate::errors::{ChargingError, ChargingResult, ErrorContext}; impl super::ChargingEngine { diff --git a/apps/charging-engine/src/charging_engine.rs b/apps/charging-engine/src/charging/engine.rs similarity index 98% rename from apps/charging-engine/src/charging_engine.rs rename to apps/charging-engine/src/charging/engine.rs index 31c0dc1..3bb6c2d 100644 --- a/apps/charging-engine/src/charging_engine.rs +++ b/apps/charging-engine/src/charging/engine.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use std::time::Duration; -use crate::charging_types::{RatingPlan, SubscriberAccount}; +use super::types::{RatingPlan, SubscriberAccount}; use crate::errors::{ChargingError, ChargingResult, ErrorContext}; pub struct ChargingEngine { diff --git a/apps/charging-engine/src/charging/mod.rs b/apps/charging-engine/src/charging/mod.rs new file mode 100644 index 0000000..67f7d28 --- /dev/null +++ b/apps/charging-engine/src/charging/mod.rs @@ -0,0 +1,6 @@ +pub mod types; +pub mod engine; +pub mod credit_management; +pub mod rating_billing; + +pub use engine::ChargingEngine; diff --git a/apps/charging-engine/src/rating_billing.rs b/apps/charging-engine/src/charging/rating_billing.rs similarity index 99% rename from apps/charging-engine/src/rating_billing.rs rename to apps/charging-engine/src/charging/rating_billing.rs index 4dbf06c..81cf805 100644 --- a/apps/charging-engine/src/rating_billing.rs +++ b/apps/charging-engine/src/charging/rating_billing.rs @@ -1,7 +1,7 @@ use chrono::Utc; use tracing::{info, debug, warn}; -use crate::charging_types::{UsageEvent, UsageType, RatingPlan}; +use super::types::{UsageEvent, UsageType, RatingPlan}; use crate::errors::{ChargingError, ChargingResult, ErrorContext}; impl super::ChargingEngine { diff --git a/apps/charging-engine/src/charging_types.rs b/apps/charging-engine/src/charging/types.rs similarity index 100% rename from apps/charging-engine/src/charging_types.rs rename to apps/charging-engine/src/charging/types.rs diff --git a/apps/charging-engine/src/errors.rs b/apps/charging-engine/src/errors.rs index dd7edee..96c1cb9 100644 --- a/apps/charging-engine/src/errors.rs +++ b/apps/charging-engine/src/errors.rs @@ -1,5 +1,2 @@ -pub mod error_types; -pub mod error_helpers; - -pub use error_types::{ChargingError}; -pub use error_helpers::{ChargingResult, ErrorContext, validate_ip, validate_bytes, validate_imsi, validate_session_id, validate_amount, log_error}; +pub mod types; +pub mod helpers; diff --git a/apps/charging-engine/src/error_helpers.rs b/apps/charging-engine/src/errors/helpers.rs similarity index 100% rename from apps/charging-engine/src/error_helpers.rs rename to apps/charging-engine/src/errors/helpers.rs diff --git a/apps/charging-engine/src/errors/mod.rs b/apps/charging-engine/src/errors/mod.rs new file mode 100644 index 0000000..96c1cb9 --- /dev/null +++ b/apps/charging-engine/src/errors/mod.rs @@ -0,0 +1,2 @@ +pub mod types; +pub mod helpers; diff --git a/apps/charging-engine/src/error_types.rs b/apps/charging-engine/src/errors/types.rs similarity index 100% rename from apps/charging-engine/src/error_types.rs rename to apps/charging-engine/src/errors/types.rs diff --git a/apps/charging-engine/src/main.rs b/apps/charging-engine/src/main.rs index fee60d4..329619b 100644 --- a/apps/charging-engine/src/main.rs +++ b/apps/charging-engine/src/main.rs @@ -1,18 +1,8 @@ mod api; -mod charging_new as charging; -mod errors_new as errors; -mod models; - -// Include the new modular components -mod charging_types; -mod charging_engine; -mod credit_management; -mod rating_billing; -mod monitoring_sync; -mod sync_operations; +mod charging; mod monitoring; -mod error_types; -mod error_helpers; +mod errors; +mod models; use anyhow::Result; use std::sync::Arc; diff --git a/apps/charging-engine/src/monitoring.rs b/apps/charging-engine/src/monitoring.rs index 9d52b2e..94177cc 100644 --- a/apps/charging-engine/src/monitoring.rs +++ b/apps/charging-engine/src/monitoring.rs @@ -1,171 +1,4 @@ -use tracing::{info, debug}; -use std::time::SystemTime; - -use crate::errors::{ChargingError, ChargingResult, ErrorContext}; - -impl super::ChargingEngine { - pub async fn get_system_statistics(&self) -> ChargingResult { - let mut conn = self.redis_client.get_async_connection().await - .context("Failed to get Redis connection")?; - - let active_sessions: u64 = conn.get("stats:active_sessions").await.unwrap_or(0); - let total_accounts: u64 = conn.keys("account:*").await.unwrap_or_default().len() as u64; - let blocked_users: u64 = conn.keys("block:*").await.unwrap_or_default().len() as u64; - let low_balance_alerts: u64 = conn.keys("alert:low_balance:*").await.unwrap_or_default().len() as u64; - - let stats = SystemStats { - active_sessions, - total_accounts, - blocked_users, - low_balance_alerts, - uptime: self.get_uptime().await?, - }; - - Ok(stats) - } - - async fn get_uptime(&self) -> ChargingResult { - // This would track the actual uptime in a real implementation - // For now, return a placeholder - Ok(SystemTime::now() - .duration_since(SystemTime::UNIX_EPOCH) - .unwrap_or_default() - .as_secs()) - } - - pub async fn health_check(&self) -> ChargingResult { - let mut conn = self.redis_client.get_async_connection().await - .context("Failed to get Redis connection")?; - - // Test Redis connection - let _: String = conn.get("health_check").await.unwrap_or_else(|_| "ok".to_string()); - - let status = HealthStatus { - redis_connected: true, - active_sync: true, - last_sync: chrono::Utc::now(), - memory_usage: self.get_memory_usage().await?, - }; - - Ok(status) - } - - async fn get_memory_usage(&self) -> ChargingResult { - // This would get actual memory usage in a real implementation - // For now, return a placeholder - Ok(50_000_000) // 50MB placeholder - } - - pub async fn get_performance_metrics(&self) -> ChargingResult { - let mut conn = self.redis_client.get_async_connection().await - .context("Failed to get Redis connection")?; - - // Get Redis info - let info: String = redis::cmd("INFO").query_async(&mut conn).await.unwrap_or_default(); - - // Parse Redis info for metrics (simplified) - let connected_clients = self.extract_metric(&info, "connected_clients"); - let used_memory = self.extract_metric(&info, "used_memory"); - let total_commands_processed = self.extract_metric(&info, "total_commands_processed"); - - let metrics = PerformanceMetrics { - connected_clients, - used_memory, - total_commands_processed, - requests_per_second: self.calculate_rps().await?, - average_response_time: self.calculate_avg_response_time().await?, - }; - - Ok(metrics) - } - - fn extract_metric(&self, info: &str, metric: &str) -> u64 { - info.lines() - .find(|line| line.starts_with(metric)) - .and_then(|line| line.split(':').nth(1)) - .and_then(|value| value.parse::().ok()) - .unwrap_or(0) - } - - async fn calculate_rps(&self) -> ChargingResult { - // This would calculate actual requests per second - // For now, return a placeholder - Ok(100.0) - } - - async fn calculate_avg_response_time(&self) -> ChargingResult { - // This would calculate actual average response time - // For now, return a placeholder - Ok(5.0) // 5ms - } - - pub async fn get_error_statistics(&self) -> ChargingResult { - let mut conn = self.redis_client.get_async_connection().await - .context("Failed to get Redis connection")?; - - let pattern = "error:*".to_string(); - let keys: Vec = conn.keys(&pattern).await - .context("Failed to get error keys")?; - - let mut total_errors = 0u64; - let mut error_types = std::collections::HashMap::new(); - - for key in keys { - if let Ok(count) = conn.get::<_, u64>(&key).await { - total_errors += count; - - let error_type = key.split(':').nth(1).unwrap_or("unknown"); - *error_types.entry(error_type.to_string()).or_insert(0) += count; - } - } - - let stats = ErrorStats { - total_errors, - error_types, - last_error: self.get_last_error().await?, - }; - - Ok(stats) - } - - async fn get_last_error(&self) -> ChargingResult> { - let mut conn = self.redis_client.get_async_connection().await - .context("Failed to get Redis connection")?; - - let last_error: Option = conn.get("last_error").await.unwrap_or(None); - Ok(last_error) - } -} - -#[derive(Debug, Clone)] -pub struct SystemStats { - pub active_sessions: u64, - pub total_accounts: u64, - pub blocked_users: u64, - pub low_balance_alerts: u64, - pub uptime: u64, -} - -#[derive(Debug, Clone)] -pub struct HealthStatus { - pub redis_connected: bool, - pub active_sync: bool, - pub last_sync: chrono::DateTime, - pub memory_usage: u64, -} - -#[derive(Debug, Clone)] -pub struct PerformanceMetrics { - pub connected_clients: u64, - pub used_memory: u64, - pub total_commands_processed: u64, - pub requests_per_second: f64, - pub average_response_time: f64, -} - -#[derive(Debug, Clone)] -pub struct ErrorStats { - pub total_errors: u64, - pub error_types: std::collections::HashMap, - pub last_error: Option, -} +pub mod sync; +pub mod types; +pub mod monitoring; +pub mod operations; diff --git a/apps/charging-engine/src/monitoring/mod.rs b/apps/charging-engine/src/monitoring/mod.rs new file mode 100644 index 0000000..94177cc --- /dev/null +++ b/apps/charging-engine/src/monitoring/mod.rs @@ -0,0 +1,4 @@ +pub mod sync; +pub mod types; +pub mod monitoring; +pub mod operations; diff --git a/apps/charging-engine/src/monitoring/monitoring.rs b/apps/charging-engine/src/monitoring/monitoring.rs new file mode 100644 index 0000000..d3fd7f7 --- /dev/null +++ b/apps/charging-engine/src/monitoring/monitoring.rs @@ -0,0 +1,172 @@ +use tracing::{info, debug}; +use std::time::SystemTime; + +use crate::errors::{ChargingError, ChargingResult, ErrorContext}; +use super::types::{SystemStats, HealthStatus}; + +impl super::ChargingEngine { + pub async fn get_system_statistics(&self) -> ChargingResult { + let mut conn = self.redis_client.get_async_connection().await + .context("Failed to get Redis connection")?; + + let active_sessions: u64 = conn.get("stats:active_sessions").await.unwrap_or(0); + let total_accounts: u64 = conn.keys("account:*").await.unwrap_or_default().len() as u64; + let blocked_users: u64 = conn.keys("block:*").await.unwrap_or_default().len() as u64; + let low_balance_alerts: u64 = conn.keys("alert:low_balance:*").await.unwrap_or_default().len() as u64; + + let stats = SystemStats { + active_sessions, + total_accounts, + blocked_users, + low_balance_alerts, + uptime: self.get_uptime().await?, + }; + + Ok(stats) + } + + async fn get_uptime(&self) -> ChargingResult { + // This would track the actual uptime in a real implementation + // For now, return a placeholder + Ok(SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap_or_default() + .as_secs()) + } + + pub async fn health_check(&self) -> ChargingResult { + let mut conn = self.redis_client.get_async_connection().await + .context("Failed to get Redis connection")?; + + // Test Redis connection + let _: String = conn.get("health_check").await.unwrap_or_else(|_| "ok".to_string()); + + let status = HealthStatus { + redis_connected: true, + active_sync: true, + last_sync: chrono::Utc::now(), + memory_usage: self.get_memory_usage().await?, + }; + + Ok(status) + } + + async fn get_memory_usage(&self) -> ChargingResult { + // This would get actual memory usage in a real implementation + // For now, return a placeholder + Ok(50_000_000) // 50MB placeholder + } + + pub async fn get_performance_metrics(&self) -> ChargingResult { + let mut conn = self.redis_client.get_async_connection().await + .context("Failed to get Redis connection")?; + + // Get Redis info + let info: String = redis::cmd("INFO").query_async(&mut conn).await.unwrap_or_default(); + + // Parse Redis info for metrics (simplified) + let connected_clients = self.extract_metric(&info, "connected_clients"); + let used_memory = self.extract_metric(&info, "used_memory"); + let total_commands_processed = self.extract_metric(&info, "total_commands_processed"); + + let metrics = PerformanceMetrics { + connected_clients, + used_memory, + total_commands_processed, + requests_per_second: self.calculate_rps().await?, + average_response_time: self.calculate_avg_response_time().await?, + }; + + Ok(metrics) + } + + fn extract_metric(&self, info: &str, metric: &str) -> u64 { + info.lines() + .find(|line| line.starts_with(metric)) + .and_then(|line| line.split(':').nth(1)) + .and_then(|value| value.parse::().ok()) + .unwrap_or(0) + } + + async fn calculate_rps(&self) -> ChargingResult { + // This would calculate actual requests per second + // For now, return a placeholder + Ok(100.0) + } + + async fn calculate_avg_response_time(&self) -> ChargingResult { + // This would calculate actual average response time + // For now, return a placeholder + Ok(5.0) // 5ms + } + + pub async fn get_error_statistics(&self) -> ChargingResult { + let mut conn = self.redis_client.get_async_connection().await + .context("Failed to get Redis connection")?; + + let pattern = "error:*".to_string(); + let keys: Vec = conn.keys(&pattern).await + .context("Failed to get error keys")?; + + let mut total_errors = 0u64; + let mut error_types = std::collections::HashMap::new(); + + for key in keys { + if let Ok(count) = conn.get::<_, u64>(&key).await { + total_errors += count; + + let error_type = key.split(':').nth(1).unwrap_or("unknown"); + *error_types.entry(error_type.to_string()).or_insert(0) += count; + } + } + + let stats = ErrorStats { + total_errors, + error_types, + last_error: self.get_last_error().await?, + }; + + Ok(stats) + } + + async fn get_last_error(&self) -> ChargingResult> { + let mut conn = self.redis_client.get_async_connection().await + .context("Failed to get Redis connection")?; + + let last_error: Option = conn.get("last_error").await.unwrap_or(None); + Ok(last_error) + } +} + +#[derive(Debug, Clone)] +pub struct SystemStats { + pub active_sessions: u64, + pub total_accounts: u64, + pub blocked_users: u64, + pub low_balance_alerts: u64, + pub uptime: u64, +} + +#[derive(Debug, Clone)] +pub struct HealthStatus { + pub redis_connected: bool, + pub active_sync: bool, + pub last_sync: chrono::DateTime, + pub memory_usage: u64, +} + +#[derive(Debug, Clone)] +pub struct PerformanceMetrics { + pub connected_clients: u64, + pub used_memory: u64, + pub total_commands_processed: u64, + pub requests_per_second: f64, + pub average_response_time: f64, +} + +#[derive(Debug, Clone)] +pub struct ErrorStats { + pub total_errors: u64, + pub error_types: std::collections::HashMap, + pub last_error: Option, +} diff --git a/apps/charging-engine/src/sync_operations.rs b/apps/charging-engine/src/monitoring/operations.rs similarity index 100% rename from apps/charging-engine/src/sync_operations.rs rename to apps/charging-engine/src/monitoring/operations.rs diff --git a/apps/charging-engine/src/monitoring_sync.rs b/apps/charging-engine/src/monitoring/sync.rs similarity index 100% rename from apps/charging-engine/src/monitoring_sync.rs rename to apps/charging-engine/src/monitoring/sync.rs diff --git a/apps/charging-engine/src/monitoring_types.rs b/apps/charging-engine/src/monitoring/types.rs similarity index 100% rename from apps/charging-engine/src/monitoring_types.rs rename to apps/charging-engine/src/monitoring/types.rs