mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-08-20 00:02:19 +00:00
9ff8a85af6
* refactor: extract windmill-api into 4 subcrates (api-auth, store, api-sse, api-jobs) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: eliminate refresh_token OnceLock bridge in windmill-store Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: eliminate FromRequestParts OnceLock bridge in windmill-api-auth Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: wire subcrates into workspace and clean up unused re-exports Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: resolve cargo check --all-features errors in subcrate wiring Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * sqlx * all * chore: update ee-repo-ref for warning fixes Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: extract windmill-trigger crate and expand windmill-api-jobs Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: extract windmill-trigger-kafka crate from windmill-api Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: extract windmill-trigger-postgres crate from windmill-api Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: extract windmill-trigger-websocket and windmill-trigger-mqtt crates Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: extract windmill-trigger-nats, sqs, gcp, and email crates Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: extract windmill-trigger-http crate from windmill-api Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: move token creation and permission helpers to windmill-api-auth Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: extract windmill-native-triggers crate from windmill-api Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * sqlx * all * refactor: extract windmill-api-embeddings crate and fix CI warnings Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: resolve type mismatch in oauth2_oss and remaining warnings Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use correct HTTP_CLIENT config in embeddings crate (30s timeout, cert override) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * all * fix: gate oauth_refresh_ee on oauth2 feature to fix warnings Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * all --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
128 lines
3.0 KiB
Rust
128 lines
3.0 KiB
Rust
/*
|
|
* Author: Windmill Labs, Inc
|
|
* Copyright: Windmill Labs, Inc 2024
|
|
* This file and its contents are licensed under the AGPLv3 License.
|
|
* Please see the included NOTICE for copyright information and
|
|
* LICENSE-AGPL for a copy of the license.
|
|
*/
|
|
|
|
use sqlx::types::Json as SqlxJson;
|
|
use windmill_common::{
|
|
db::DB, error::Result, triggers::TriggerKind, utils::not_found_if_none, worker::CLOUD_HOSTED,
|
|
};
|
|
use windmill_queue::{PushArgs, PushArgsOwned};
|
|
|
|
const KEEP_LAST: i64 = 20;
|
|
|
|
struct ActiveCaptureOwner {
|
|
owner: String,
|
|
email: String,
|
|
}
|
|
|
|
pub async fn get_active_capture_owner_and_email(
|
|
db: &DB,
|
|
w_id: &str,
|
|
path: &str,
|
|
is_flow: bool,
|
|
kind: &TriggerKind,
|
|
) -> Result<(String, String)> {
|
|
let capture_config = sqlx::query_as!(
|
|
ActiveCaptureOwner,
|
|
r#"
|
|
SELECT
|
|
owner,
|
|
email
|
|
FROM
|
|
capture_config
|
|
WHERE
|
|
workspace_id = $1
|
|
AND path = $2
|
|
AND is_flow = $3
|
|
AND trigger_kind = $4
|
|
AND last_client_ping > NOW() - INTERVAL '10 seconds'
|
|
"#,
|
|
&w_id,
|
|
&path,
|
|
is_flow,
|
|
kind as &TriggerKind,
|
|
)
|
|
.fetch_optional(db)
|
|
.await?;
|
|
|
|
let capture_config = not_found_if_none(
|
|
capture_config,
|
|
&format!("capture config for {} trigger", kind),
|
|
path,
|
|
)?;
|
|
|
|
Ok((capture_config.owner, capture_config.email))
|
|
}
|
|
|
|
async fn clear_captures_history(db: &DB, w_id: &str) -> Result<()> {
|
|
if *CLOUD_HOSTED {
|
|
/* Retain only KEEP_LAST most recent captures in this workspace. */
|
|
sqlx::query!(
|
|
r#"
|
|
DELETE FROM
|
|
capture
|
|
WHERE
|
|
workspace_id = $1
|
|
AND created_at <= (
|
|
SELECT
|
|
created_at
|
|
FROM
|
|
capture
|
|
WHERE
|
|
workspace_id = $1
|
|
ORDER BY
|
|
created_at DESC
|
|
OFFSET $2
|
|
LIMIT 1
|
|
)
|
|
"#,
|
|
&w_id,
|
|
KEEP_LAST,
|
|
)
|
|
.execute(db)
|
|
.await?;
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
pub async fn insert_capture_payload(
|
|
db: &DB,
|
|
w_id: &str,
|
|
path: &str,
|
|
is_flow: bool,
|
|
trigger_kind: &TriggerKind,
|
|
main_args: PushArgsOwned,
|
|
preprocessor_args: PushArgsOwned,
|
|
owner: &str,
|
|
) -> Result<()> {
|
|
sqlx::query!(
|
|
r#"
|
|
INSERT INTO
|
|
capture (
|
|
workspace_id, path, is_flow, trigger_kind, main_args, preprocessor_args, created_by
|
|
)
|
|
VALUES (
|
|
$1, $2, $3, $4, $5, $6, $7
|
|
)
|
|
"#,
|
|
&w_id,
|
|
path,
|
|
is_flow,
|
|
trigger_kind as &TriggerKind,
|
|
SqlxJson(PushArgs { args: &main_args.args, extra: main_args.extra }) as SqlxJson<PushArgs>,
|
|
SqlxJson(PushArgs { args: &preprocessor_args.args, extra: preprocessor_args.extra })
|
|
as SqlxJson<PushArgs>,
|
|
owner,
|
|
)
|
|
.execute(db)
|
|
.await?;
|
|
|
|
clear_captures_history(db, &w_id).await?;
|
|
|
|
Ok(())
|
|
}
|