use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use tracing::info;
use swift_rs_core::domain::Message;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FraudScore {
pub score: f64,
pub risk_level: RiskLevel,
pub flags: Vec<String>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub enum RiskLevel {
Low,
Medium,
High,
Critical,
}
#[async_trait]
pub trait FraudDetector: Send + Sync {
async fn analyze(&self, message: &Message) -> FraudScore;
}
pub struct BasicFraudDetector;
impl BasicFraudDetector {
pub fn new() -> Self {
Self
}
}
#[async_trait]
impl FraudDetector for BasicFraudDetector {
async fn analyze(&self, message: &Message) -> FraudScore {
info!("Analyzing message {} for fraud", message.metadata.id);
let score = 0.1; let risk_level = if score > 0.8 {
RiskLevel::Critical
} else if score > 0.5 {
RiskLevel::High
} else if score > 0.3 {
RiskLevel::Medium
} else {
RiskLevel::Low
};
FraudScore {
score,
risk_level,
flags: vec![],
}
}
}