diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index b63326cfa4..f3bcc40e2d 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -12981,7 +12981,7 @@ paths: - $ref: '#/components/parameters/WorkspaceId' responses: '200': - description: assets linked + description: all assets in the workspace content: application/json: schema: @@ -13005,6 +13005,32 @@ paths: usage_kind: $ref: '#/components/schemas/AssetUsageKind' + /w/{workspace}/assets/list_for_usage: + get: + summary: List all assets used by a given usage path + operationId: listAssetsForUsage + tags: + - asset + parameters: + - $ref: '#/components/parameters/WorkspaceId' + - $ref: '#/components/parameters/AssetUsageKind' + - $ref: '#/components/parameters/AssetUsagePath' + responses: + '200': + description: all assets used by the given usage path + content: + application/json: + schema: + type: array + items: + type: object + required: [path, kind] + properties: + path: + type: string + kind: + $ref: '#/components/schemas/AssetKind' + components: securitySchemes: bearerAuth: @@ -13034,6 +13060,18 @@ components: required: true schema: type: string + AssetUsageKind: + name: usage_kind + in: query + required: true + schema: + $ref: "#/components/schemas/AssetUsageKind" + AssetUsagePath: + name: usage_path + in: query + required: true + schema: + type: string PublicationName: name: publication in: path diff --git a/backend/windmill-api/src/assets.rs b/backend/windmill-api/src/assets.rs index d8602cf5ac..335483ca4b 100644 --- a/backend/windmill-api/src/assets.rs +++ b/backend/windmill-api/src/assets.rs @@ -1,15 +1,23 @@ -use axum::{extract::{Path}, routing::{post, get}, Extension, Json, Router}; +use axum::{ + extract::{Path, Query}, + routing::{get, post}, + Extension, Json, Router, +}; use serde::{Deserialize, Serialize}; use serde_json::Value; use sqlx::{Postgres, Transaction}; -use windmill_common::{db::UserDB, error::{JsonResult, Result}}; +use windmill_common::{ + db::UserDB, + error::{JsonResult, Result}, +}; use crate::db::ApiAuthed; pub fn workspaced_service() -> Router { Router::new() - .route("/link", post(link_assets)) - .route("/list", get(list_assets)) + .route("/link", post(link_assets)) + .route("/list", get(list_assets)) + .route("/list_for_usage", get(list_assets_for_usage)) } #[derive(Serialize, Deserialize, Debug, PartialEq, Copy, Clone, Hash, Eq, sqlx::Type)] @@ -71,7 +79,7 @@ async fn link_assets_internal( sqlx::query!( r#"INSERT INTO asset (workspace_id, path, kind, usage_path, usage_kind) VALUES ($1, $2, $3, $4, $5);"#, w_id, - asset.path, + asset.path, asset.kind as AssetKind, body.usage_path, body.usage_kind as AssetUsageKind @@ -106,4 +114,34 @@ async fn list_assets( .await?; Ok(Json(assets)) -} \ No newline at end of file +} + +#[derive(Deserialize)] +struct ListAssetForUsageQuery { + usage_kind: AssetUsageKind, + usage_path: String, +} + +async fn list_assets_for_usage( + authed: ApiAuthed, + Path(w_id): Path, + Query(ListAssetForUsageQuery { usage_kind, usage_path }): Query, + Extension(user_db): Extension, +) -> JsonResult> { + let assets = sqlx::query_scalar!( + r#"SELECT + jsonb_build_object( + 'path', path, + 'kind', kind + ) as "list!: _" + FROM asset + WHERE workspace_id = $1 AND usage_path = $2 AND usage_kind = $3"#, + w_id, + usage_path, + usage_kind as AssetUsageKind + ) + .fetch_all(&mut *user_db.begin(&authed).await?) + .await?; + + Ok(Json(assets)) +} diff --git a/frontend/src/lib/components/runs/JobPreview.svelte b/frontend/src/lib/components/runs/JobPreview.svelte index 02da78f9ea..203cc5a47f 100644 --- a/frontend/src/lib/components/runs/JobPreview.svelte +++ b/frontend/src/lib/components/runs/JobPreview.svelte @@ -1,6 +1,6 @@