stormchaser-engine 1.4.2

A robust, distributed workflow engine for event-driven and human-triggered workflows.
Documentation
use anyhow::Result;
use stormchaser_dsl::ast::Workflow;
use stormchaser_model::{RunId, StepInstanceId};
use uuid::Uuid;

pub async fn persist_artifact_metadata(
    tx: &mut sqlx::PgConnection,
    run_id: RunId,
    step_id: StepInstanceId,
    artifacts: Option<&serde_json::Map<String, serde_json::Value>>,
    workflow: &Workflow,
) -> Result<()> {
    let Some(artifacts) = artifacts else {
        return Ok(());
    };

    for (name, meta) in artifacts {
        let storage = workflow
            .storage
            .iter()
            .find(|s| s.artifacts.iter().any(|a| a.name == *name));

        if let Some(s) = storage {
            let connection_id: Option<Uuid> = if let Some(ref backend_name) = s.backend {
                crate::db::get_storage_backend_id_by_name(&mut *tx, backend_name).await?
            } else {
                crate::db::get_default_sfs_backend_id(&mut *tx).await?
            };

            if let Some(bid) = connection_id {
                let remote_path = format!("artifacts/{}/{}/{}", run_id, s.name, name);
                crate::db::insert_artifact_registry(
                    &mut *tx,
                    run_id,
                    step_id,
                    name,
                    stormchaser_model::ConnectionId::new(bid),
                    remote_path,
                    meta.clone(),
                )
                .await?;
            }
        }
    }
    Ok(())
}