* fix * update sqlx * Update backend/windmill-api/src/scopes.rs Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * fix perfect match --------- Co-authored-by: Ruben Fiszel <ruben@windmill.dev> Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
250 lines
6.4 KiB
Rust
250 lines
6.4 KiB
Rust
use axum::Json;
|
|
use serde::{Deserialize, Serialize};
|
|
use sqlx::FromRow;
|
|
use windmill_common::error::JsonResult;
|
|
|
|
use crate::db::DB;
|
|
|
|
#[derive(Serialize, Deserialize, Debug)]
|
|
pub struct TriggerPrimarySchedule {
|
|
schedule: String,
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, Debug)]
|
|
pub struct TriggersCount {
|
|
primary_schedule: Option<TriggerPrimarySchedule>,
|
|
schedule_count: i64,
|
|
http_routes_count: i64,
|
|
webhook_count: i64,
|
|
email_count: i64,
|
|
websocket_count: i64,
|
|
kafka_count: i64,
|
|
nats_count: i64,
|
|
postgres_count: i64,
|
|
mqtt_count: i64,
|
|
sqs_count: i64,
|
|
gcp_count: i64,
|
|
}
|
|
pub(crate) async fn get_triggers_count_internal(
|
|
db: &DB,
|
|
w_id: &str,
|
|
path: &str,
|
|
is_flow: bool,
|
|
) -> JsonResult<TriggersCount> {
|
|
let primary_schedule = sqlx::query_scalar!(
|
|
"SELECT schedule FROM schedule WHERE path = $1 AND script_path = $1 AND is_flow = $2 AND workspace_id = $3",
|
|
path,
|
|
is_flow,
|
|
w_id
|
|
)
|
|
.fetch_optional(db)
|
|
.await?;
|
|
|
|
let schedule_count = sqlx::query_scalar!(
|
|
"SELECT COUNT(*) FROM schedule WHERE script_path = $1 AND is_flow = $2 AND workspace_id = $3",
|
|
path,
|
|
is_flow,
|
|
w_id
|
|
)
|
|
.fetch_one(db)
|
|
.await?
|
|
.unwrap_or(0);
|
|
|
|
let http_routes_count = sqlx::query_scalar!(
|
|
"SELECT COUNT(*) FROM http_trigger WHERE script_path = $1 AND is_flow = $2 AND workspace_id = $3",
|
|
path,
|
|
is_flow,
|
|
w_id
|
|
)
|
|
.fetch_one(db)
|
|
.await?
|
|
.unwrap_or(0);
|
|
|
|
let websocket_count = sqlx::query_scalar!(
|
|
"SELECT COUNT(*) FROM websocket_trigger WHERE script_path = $1 AND is_flow = $2 AND workspace_id = $3",
|
|
path,
|
|
is_flow,
|
|
w_id
|
|
)
|
|
.fetch_one(db)
|
|
.await?
|
|
.unwrap_or(0);
|
|
|
|
let kafka_count = sqlx::query_scalar!(
|
|
"SELECT COUNT(*) FROM kafka_trigger WHERE script_path = $1 AND is_flow = $2 AND workspace_id = $3",
|
|
path,
|
|
is_flow,
|
|
w_id
|
|
)
|
|
.fetch_one(db)
|
|
.await?
|
|
.unwrap_or(0);
|
|
|
|
let nats_count = sqlx::query_scalar!(
|
|
"SELECT COUNT(*) FROM nats_trigger WHERE script_path = $1 AND is_flow = $2 AND workspace_id = $3",
|
|
path,
|
|
is_flow,
|
|
w_id
|
|
)
|
|
.fetch_one(db)
|
|
.await?
|
|
.unwrap_or(0);
|
|
|
|
let postgres_count = sqlx::query_scalar!(
|
|
"SELECT COUNT(*) FROM postgres_trigger WHERE script_path = $1 AND is_flow = $2 AND workspace_id = $3",
|
|
path,
|
|
is_flow,
|
|
w_id
|
|
)
|
|
.fetch_one(db)
|
|
.await?
|
|
.unwrap_or(0);
|
|
|
|
let mqtt_count = sqlx::query_scalar!(
|
|
"SELECT COUNT(*) FROM mqtt_trigger WHERE script_path = $1 AND is_flow = $2 AND workspace_id = $3",
|
|
path,
|
|
is_flow,
|
|
w_id
|
|
)
|
|
.fetch_one(db)
|
|
.await?
|
|
.unwrap_or(0);
|
|
|
|
let sqs_count = sqlx::query_scalar!(
|
|
"SELECT COUNT(*) FROM sqs_trigger WHERE script_path = $1 AND is_flow = $2 AND workspace_id = $3",
|
|
path,
|
|
is_flow,
|
|
w_id
|
|
)
|
|
.fetch_one(db)
|
|
.await?
|
|
.unwrap_or(0);
|
|
|
|
let gcp_count = sqlx::query_scalar!(
|
|
"SELECT COUNT(*) FROM gcp_trigger WHERE script_path = $1 AND is_flow = $2 AND workspace_id = $3",
|
|
path,
|
|
is_flow,
|
|
w_id
|
|
)
|
|
.fetch_one(db)
|
|
.await?
|
|
.unwrap_or(0);
|
|
|
|
let webhook_count = (if is_flow {
|
|
sqlx::query_scalar!(
|
|
"SELECT COUNT(*) FROM token WHERE label LIKE 'webhook-%' AND workspace_id = $1 AND scopes @> ARRAY['run:flow/' || $2]::text[]",
|
|
w_id,
|
|
path,
|
|
)
|
|
|
|
} else {
|
|
sqlx::query_scalar!(
|
|
"SELECT COUNT(*) FROM token WHERE label LIKE 'webhook-%' AND workspace_id = $1 AND scopes @> ARRAY['run:' || $2]::text[]",
|
|
w_id,
|
|
path,
|
|
)
|
|
}).fetch_one(db)
|
|
.await?
|
|
.unwrap_or(0);
|
|
|
|
let email_count = (if is_flow {
|
|
sqlx::query_scalar!(
|
|
"SELECT COUNT(*) FROM token WHERE label LIKE 'email-%' AND workspace_id = $1 AND scopes @> ARRAY['run:flow/' || $2]::text[]",
|
|
w_id,
|
|
path,
|
|
)
|
|
|
|
} else {
|
|
sqlx::query_scalar!(
|
|
"SELECT COUNT(*) FROM token WHERE label LIKE 'email-%' AND workspace_id = $1 AND scopes @> ARRAY['run:script/' || $2]::text[]",
|
|
w_id,
|
|
path,
|
|
)
|
|
}).fetch_one(db)
|
|
.await?
|
|
.unwrap_or(0);
|
|
|
|
Ok(Json(TriggersCount {
|
|
primary_schedule: primary_schedule.map(|s| TriggerPrimarySchedule { schedule: s }),
|
|
schedule_count,
|
|
http_routes_count,
|
|
webhook_count,
|
|
email_count,
|
|
websocket_count,
|
|
kafka_count,
|
|
nats_count,
|
|
postgres_count,
|
|
mqtt_count,
|
|
gcp_count,
|
|
sqs_count,
|
|
}))
|
|
}
|
|
|
|
#[derive(FromRow, Serialize)]
|
|
pub struct TruncatedTokenWithEmail {
|
|
pub label: Option<String>,
|
|
pub token_prefix: Option<String>,
|
|
pub expiration: Option<chrono::DateTime<chrono::Utc>>,
|
|
pub created_at: chrono::DateTime<chrono::Utc>,
|
|
pub last_used_at: chrono::DateTime<chrono::Utc>,
|
|
pub scopes: Option<Vec<String>>,
|
|
pub email: Option<String>,
|
|
}
|
|
|
|
pub async fn list_tokens_internal(
|
|
db: &DB,
|
|
w_id: &str,
|
|
path: &str,
|
|
is_flow: bool,
|
|
) -> JsonResult<Vec<TruncatedTokenWithEmail>> {
|
|
let tokens = if is_flow {
|
|
sqlx::query_as!(
|
|
TruncatedTokenWithEmail,
|
|
r#"
|
|
SELECT label,
|
|
concat(substring(token for 10)) AS token_prefix,
|
|
expiration,
|
|
created_at,
|
|
last_used_at,
|
|
scopes,
|
|
email
|
|
FROM token
|
|
WHERE workspace_id = $1
|
|
AND (
|
|
scopes @> ARRAY['jobs:run:flows:' || $2]::text[]
|
|
OR scopes @> ARRAY['run:flows/' || $2]::text[]
|
|
)
|
|
"#,
|
|
w_id,
|
|
path
|
|
)
|
|
.fetch_all(db)
|
|
.await?
|
|
} else {
|
|
sqlx::query_as!(
|
|
TruncatedTokenWithEmail,
|
|
r#"
|
|
SELECT label,
|
|
concat(substring(token for 10)) AS token_prefix,
|
|
expiration,
|
|
created_at,
|
|
last_used_at,
|
|
scopes,
|
|
email
|
|
FROM token
|
|
WHERE workspace_id = $1
|
|
AND (
|
|
scopes @> ARRAY['jobs:run:scripts:' || $2]::text[]
|
|
OR scopes @> ARRAY['run:scripts/' || $2]::text[]
|
|
)
|
|
"#,
|
|
w_id,
|
|
path
|
|
)
|
|
.fetch_all(db)
|
|
.await?
|
|
};
|
|
|
|
Ok(Json(tokens))
|
|
}
|