mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-09-10 16:05:58 +00:00
* feat: test trigger connection * fix build * fix build * update ee ref * nit --------- Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
155 lines
4.4 KiB
Rust
155 lines
4.4 KiB
Rust
use crate::{
|
|
db::{ApiAuthed, DB},
|
|
jobs::{run_flow_by_path_inner, run_script_by_path_inner, RunJobQuery},
|
|
resources::get_resource_value_interpolated_internal,
|
|
users::fetch_api_authed,
|
|
};
|
|
use serde_json::value::RawValue;
|
|
use std::collections::HashMap;
|
|
|
|
use axum::{
|
|
routing::{delete, get, post},
|
|
Router,
|
|
};
|
|
use handler::{
|
|
alter_publication, create_postgres_trigger, create_publication, create_slot,
|
|
create_template_script, delete_postgres_trigger, delete_publication, drop_slot_name,
|
|
exists_postgres_trigger, get_postgres_trigger, get_publication_info, get_template_script,
|
|
is_database_in_logical_level, list_database_publication, list_postgres_triggers,
|
|
list_slot_name, set_enabled, update_postgres_trigger, Database, PostgresTrigger,
|
|
};
|
|
use windmill_common::{db::UserDB, error::Error, utils::StripPath};
|
|
use windmill_queue::PushArgsOwned;
|
|
|
|
mod bool;
|
|
mod converter;
|
|
mod handler;
|
|
mod hex;
|
|
mod mapper;
|
|
mod relation;
|
|
mod replication_message;
|
|
mod trigger;
|
|
|
|
pub use trigger::start_database;
|
|
|
|
pub async fn get_database_resource(
|
|
authed: ApiAuthed,
|
|
user_db: Option<UserDB>,
|
|
db: &DB,
|
|
database_resource_path: &str,
|
|
w_id: &str,
|
|
) -> Result<Database, Error> {
|
|
let resource = get_resource_value_interpolated_internal(
|
|
&authed,
|
|
user_db,
|
|
&db,
|
|
&w_id,
|
|
&database_resource_path,
|
|
None,
|
|
"",
|
|
)
|
|
.await
|
|
.map_err(|_| Error::NotFound("Database resource do not exist".to_string()))?;
|
|
|
|
let resource = match resource {
|
|
Some(resource) => serde_json::from_value::<Database>(resource).map_err(Error::SerdeJson)?,
|
|
None => {
|
|
return {
|
|
Err(Error::NotFound(
|
|
"Database resource do not exist".to_string(),
|
|
))
|
|
}
|
|
}
|
|
};
|
|
|
|
Ok(resource)
|
|
}
|
|
|
|
fn publication_service() -> Router {
|
|
Router::new()
|
|
.route("/get/:publication_name/*path", get(get_publication_info))
|
|
.route("/create/:publication_name/*path", post(create_publication))
|
|
.route("/update/:publication_name/*path", post(alter_publication))
|
|
.route(
|
|
"/delete/:publication_name/*path",
|
|
delete(delete_publication),
|
|
)
|
|
.route("/list/*path", get(list_database_publication))
|
|
}
|
|
|
|
fn slot_service() -> Router {
|
|
Router::new()
|
|
.route("/list/*path", get(list_slot_name))
|
|
.route("/create/*path", post(create_slot))
|
|
.route("/delete/*path", delete(drop_slot_name))
|
|
}
|
|
|
|
pub fn workspaced_service() -> Router {
|
|
Router::new()
|
|
.route("/create", post(create_postgres_trigger))
|
|
.route("/list", get(list_postgres_triggers))
|
|
.route("/get/*path", get(get_postgres_trigger))
|
|
.route("/update/*path", post(update_postgres_trigger))
|
|
.route("/delete/*path", delete(delete_postgres_trigger))
|
|
.route("/exists/*path", get(exists_postgres_trigger))
|
|
.route("/setenabled/*path", post(set_enabled))
|
|
.route("/get_template_script/:id", get(get_template_script))
|
|
.route("/create_template_script", post(create_template_script))
|
|
.route(
|
|
"/is_valid_postgres_configuration/*path",
|
|
get(is_database_in_logical_level),
|
|
)
|
|
.nest("/publication", publication_service())
|
|
.nest("/slot", slot_service())
|
|
}
|
|
|
|
async fn run_job(
|
|
args: Option<HashMap<String, Box<RawValue>>>,
|
|
extra: Option<HashMap<String, Box<RawValue>>>,
|
|
db: &DB,
|
|
trigger: &PostgresTrigger,
|
|
) -> anyhow::Result<()> {
|
|
let args = PushArgsOwned { args: args.unwrap_or_default(), extra };
|
|
|
|
let authed = fetch_api_authed(
|
|
trigger.edited_by.clone(),
|
|
trigger.email.clone(),
|
|
&trigger.workspace_id,
|
|
db,
|
|
Some(format!("postgres-{}", trigger.path)),
|
|
)
|
|
.await?;
|
|
|
|
let user_db = UserDB::new(db.clone());
|
|
|
|
let run_query = RunJobQuery::default();
|
|
|
|
if trigger.is_flow {
|
|
run_flow_by_path_inner(
|
|
authed,
|
|
db.clone(),
|
|
user_db,
|
|
trigger.workspace_id.clone(),
|
|
StripPath(trigger.script_path.to_owned()),
|
|
run_query,
|
|
args,
|
|
None,
|
|
)
|
|
.await?;
|
|
} else {
|
|
run_script_by_path_inner(
|
|
authed,
|
|
db.clone(),
|
|
user_db,
|
|
trigger.workspace_id.clone(),
|
|
StripPath(trigger.script_path.to_owned()),
|
|
run_query,
|
|
args,
|
|
None,
|
|
)
|
|
.await?;
|
|
}
|
|
|
|
Ok(())
|
|
}
|