use super::KonarrProject;
use crate::{
KonarrClient, KonarrError,
client::{ServerInfo, snapshot::KonarrSnapshot},
};
use log::{debug, info};
#[derive(Debug, Default)]
pub struct KonarrProjectSnapshotData {
pub info: Option<ServerInfo>,
pub container_sha: Option<String>,
pub tool: Option<String>,
}
impl KonarrProject {
pub async fn snapshot(
&mut self,
client: &KonarrClient,
data: &KonarrProjectSnapshotData,
) -> Result<KonarrSnapshot, KonarrError> {
let version = data.info.clone().unwrap_or_default().version()?;
if let Some(snap) = &self.snapshot {
if let Some(data) = snap.metadata.get("rescan") {
if data == "true" {
info!("Force rescan flag is set, creating new snapshot");
self.create_snapshot(client).await?;
return Ok(self.snapshot.clone().unwrap());
}
}
if let Some(data_tool) = &data.tool {
log::debug!("Local tool version: {}", data_tool);
if let Some(tool) = snap.metadata.get("bom.tool") {
if version.major <= 0 && version.minor <= 3 {
log::debug!("Remote Tool version: {}", tool);
if tool != data_tool {
info!("Tool version is different, creating new snapshot with new tool");
self.create_snapshot(client).await?;
return Ok(self.snapshot.clone().unwrap());
}
} else {
log::warn!(
"Checking tool name and version does not work for v0.2 or below"
);
}
}
}
let now = chrono::Utc::now();
if now.signed_duration_since(snap.created_at).num_hours() >= 24 {
info!("24 hours has passed since the last snapshot, creating a new one");
self.create_snapshot(client).await?;
return Ok(self.snapshot.clone().unwrap());
}
if let Some(container_sha) = &data.container_sha {
if let Some(sha) = snap.metadata.get("container.sha") {
debug!("Container Snapshot SHA: {} == {}", &container_sha, sha);
if sha != container_sha {
info!("Snapshot SHA for Container is different: {}", self.name);
self.create_snapshot(client).await?;
return Ok(self.snapshot.clone().unwrap());
}
log::debug!("Container SHAs are the same, skipping creation");
} else {
debug!("Creating new Snapshot for Container: {}", self.name);
self.create_snapshot(client).await?;
}
}
} else {
info!("Creating initial Snapshot...");
self.create_snapshot(client).await?;
}
Ok(self.snapshot.clone().unwrap())
}
async fn create_snapshot(&mut self, client: &KonarrClient) -> Result<(), KonarrError> {
let snap = KonarrSnapshot::create(client, self.id).await?;
self.snapshot = Some(snap);
Ok(())
}
}