use crate::db::models::*;
use async_trait::async_trait;
#[async_trait]
pub trait ScanRepository: Send + Sync {
async fn create_scan(&self, scan: &ScanRecord) -> crate::Result<i64>;
async fn get_scan_by_id(&self, scan_id: i64) -> crate::Result<Option<ScanRecord>>;
async fn get_scans_by_hostname(
&self,
hostname: &str,
port: u16,
limit: i64,
) -> crate::Result<Vec<ScanRecord>>;
async fn get_latest_scan(&self, hostname: &str, port: u16)
-> crate::Result<Option<ScanRecord>>;
async fn delete_old_scans(&self, days: i64) -> crate::Result<u64>;
async fn update_scan_rating(&self, scan_id: i64, grade: &str, score: u8) -> crate::Result<()>;
}
#[async_trait]
pub trait ProtocolRepository: Send + Sync {
async fn create_protocol(&self, protocol: &ProtocolRecord) -> crate::Result<i64>;
async fn get_protocols_by_scan(&self, scan_id: i64) -> crate::Result<Vec<ProtocolRecord>>;
async fn create_protocols_bulk(&self, protocols: &[ProtocolRecord]) -> crate::Result<()>;
}
#[async_trait]
pub trait CipherRepository: Send + Sync {
async fn create_cipher(&self, cipher: &CipherRecord) -> crate::Result<i64>;
async fn get_ciphers_by_scan(&self, scan_id: i64) -> crate::Result<Vec<CipherRecord>>;
async fn get_ciphers_by_scan_and_protocol(
&self,
scan_id: i64,
protocol: &str,
) -> crate::Result<Vec<CipherRecord>>;
async fn create_ciphers_bulk(&self, ciphers: &[CipherRecord]) -> crate::Result<()>;
}
#[async_trait]
pub trait CertificateRepository: Send + Sync {
async fn create_or_get_certificate(&self, cert: &CertificateRecord) -> crate::Result<i64>;
async fn get_certificate_by_id(&self, cert_id: i64)
-> crate::Result<Option<CertificateRecord>>;
async fn get_certificate_by_fingerprint(
&self,
fingerprint: &str,
) -> crate::Result<Option<CertificateRecord>>;
async fn link_certificate_to_scan(
&self,
scan_id: i64,
cert_id: i64,
chain_position: i32,
) -> crate::Result<()>;
async fn get_certificate_chain_by_scan(
&self,
scan_id: i64,
) -> crate::Result<Vec<CertificateRecord>>;
}
#[async_trait]
pub trait VulnerabilityRepository: Send + Sync {
async fn create_vulnerability(&self, vuln: &VulnerabilityRecord) -> crate::Result<i64>;
async fn get_vulnerabilities_by_scan(
&self,
scan_id: i64,
) -> crate::Result<Vec<VulnerabilityRecord>>;
async fn get_vulnerabilities_by_severity(
&self,
scan_id: i64,
severity: &str,
) -> crate::Result<Vec<VulnerabilityRecord>>;
async fn create_vulnerabilities_bulk(&self, vulns: &[VulnerabilityRecord])
-> crate::Result<()>;
}
#[async_trait]
pub trait RatingRepository: Send + Sync {
async fn create_rating(&self, rating: &RatingRecord) -> crate::Result<i64>;
async fn get_ratings_by_scan(&self, scan_id: i64) -> crate::Result<Vec<RatingRecord>>;
async fn get_rating_by_category(
&self,
scan_id: i64,
category: &str,
) -> crate::Result<Option<RatingRecord>>;
async fn create_ratings_bulk(&self, ratings: &[RatingRecord]) -> crate::Result<()>;
}
#[async_trait]
pub trait Database: Send + Sync {
fn scans(&self) -> &dyn ScanRepository;
fn protocols(&self) -> &dyn ProtocolRepository;
fn ciphers(&self) -> &dyn CipherRepository;
fn certificates(&self) -> &dyn CertificateRepository;
fn vulnerabilities(&self) -> &dyn VulnerabilityRepository;
fn ratings(&self) -> &dyn RatingRepository;
}