use super::service::PricingService;
use super::types::{PricingEventType, PricingUpdateEvent};
use crate::utils::error::gateway_error::Result;
use std::sync::Arc;
use std::time::SystemTime;
use tracing::{debug, info, warn};
impl PricingService {
pub fn start_auto_refresh_task(self: Arc<Self>) -> tokio::task::JoinHandle<()> {
let service = Arc::clone(&self);
tokio::spawn(async move {
let mut interval = tokio::time::interval(service.cache_ttl);
loop {
interval.tick().await;
if let Err(e) = service.refresh_pricing_data().await {
warn!("Auto-refresh pricing data failed: {}", e);
} else {
debug!("Auto-refresh pricing data completed successfully");
}
}
})
}
pub async fn force_refresh(&self) -> Result<()> {
info!("Force refreshing pricing data");
self.refresh_pricing_data().await
}
pub async fn refresh_pricing_data(&self) -> Result<()> {
info!("Refreshing pricing data from: {}", self.pricing_url);
let data = if self.pricing_url.starts_with("http") {
self.load_from_url().await?
} else {
self.load_from_file().await?
};
{
let mut pricing_data = self.pricing_data.write();
pricing_data.models.clear();
pricing_data.models.extend(data);
pricing_data.last_updated = SystemTime::now();
}
let _ = self.event_sender.send(PricingUpdateEvent {
event_type: PricingEventType::DataRefreshed,
model: "*".to_string(),
provider: "*".to_string(),
timestamp: SystemTime::now(),
});
info!("Pricing data refreshed successfully");
Ok(())
}
pub fn needs_refresh(&self) -> bool {
let data = self.pricing_data.read();
SystemTime::now()
.duration_since(data.last_updated)
.map(|duration| duration > self.cache_ttl)
.unwrap_or(true)
}
}