Files
2026-02-08 14:15:07 +00:00

87 lines
2.8 KiB
Rust

use sqlx::PgExecutor;
use crate::{error, scripts::ScriptHash};
pub use windmill_types::assets::*;
pub async fn insert_static_asset_usage<'e>(
executor: impl PgExecutor<'e>,
workspace_id: &str,
asset: &AssetWithAltAccessType,
usage_path: &str,
usage_kind: AssetUsageKind,
) -> error::Result<()> {
// Convert columns BTreeMap to JSONB format
let columns_json = asset
.columns
.as_ref()
.map(|cols| serde_json::to_value(cols).unwrap_or(serde_json::Value::Null));
sqlx::query!(
r#"INSERT INTO asset (workspace_id, path, kind, usage_access_type, usage_path, usage_kind, columns)
VALUES ($1, $2, $3, $4, $5, $6, $7) ON CONFLICT DO NOTHING"#,
workspace_id,
asset.path,
asset.kind as AssetKind,
(asset.access_type.or(asset.alt_access_type)) as Option<AssetUsageAccessType>,
usage_path,
usage_kind as AssetUsageKind,
columns_json as Option<serde_json::Value>
)
.execute(executor)
.await?;
Ok(())
}
pub async fn clear_static_asset_usage<'e>(
executor: impl PgExecutor<'e>,
workspace_id: &str,
usage_path: &str,
usage_kind: AssetUsageKind,
) -> error::Result<()> {
sqlx::query!(
r#"DELETE FROM asset WHERE workspace_id = $1 AND usage_path = $2 AND usage_kind = $3"#,
workspace_id,
usage_path,
usage_kind as AssetUsageKind
)
.execute(executor)
.await?;
Ok(())
}
pub async fn clear_static_asset_usage_by_script_hash<'e>(
executor: impl PgExecutor<'e>,
workspace_id: &str,
script_hash: ScriptHash,
) -> error::Result<()> {
sqlx::query!(
"DELETE FROM asset WHERE workspace_id = $1 AND usage_kind = 'script' AND usage_path = (SELECT path FROM script WHERE hash = $2 AND workspace_id = $1)",
workspace_id,
script_hash.0
)
.execute(executor)
.await?;
Ok(())
}
pub fn asset_kind_from_parser(parser_kind: windmill_parser::asset_parser::AssetKind) -> AssetKind {
match parser_kind {
windmill_parser::asset_parser::AssetKind::S3Object => AssetKind::S3Object,
windmill_parser::asset_parser::AssetKind::Resource => AssetKind::Resource,
windmill_parser::asset_parser::AssetKind::Ducklake => AssetKind::Ducklake,
windmill_parser::asset_parser::AssetKind::DataTable => AssetKind::DataTable,
}
}
pub fn asset_access_type_from_parser(
parser_kind: windmill_parser::asset_parser::AssetUsageAccessType,
) -> AssetUsageAccessType {
match parser_kind {
windmill_parser::asset_parser::AssetUsageAccessType::R => AssetUsageAccessType::R,
windmill_parser::asset_parser::AssetUsageAccessType::W => AssetUsageAccessType::W,
windmill_parser::asset_parser::AssetUsageAccessType::RW => AssetUsageAccessType::RW,
}
}