feat: add sync webhook for flows

This commit is contained in:
Ruben Fiszel
2023-01-31 10:21:48 +01:00
parent 772c768cda
commit f377c84f5a
4 changed files with 117 additions and 9 deletions

View File

@@ -2445,6 +2445,44 @@ paths:
application/json:
schema: {}
/w/{workspace}/jobs/run_wait_result/f/{path}:
post:
summary: run flow by path and wait until completion
operationId: runWaitResultFlowByPath
tags:
- job
parameters:
- $ref: "#/components/parameters/WorkspaceId"
- $ref: "#/components/parameters/ScriptPath"
- name: scheduled_for
description: when to schedule this job (leave empty for immediate run)
in: query
schema:
type: string
format: date-time
- name: scheduled_in_secs
description: schedule the script to execute in the number of seconds starting now
in: query
schema:
type: integer
- $ref: "#/components/parameters/IncludeHeader"
- $ref: "#/components/parameters/QueueLimit"
requestBody:
description: script args
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/ScriptArgs"
responses:
"200":
description: job result
content:
application/json:
schema: {}
/w/{workspace}/jobs/result_by_id/{flow_job_id}/{node_id}:
get:
summary: get job result by id

View File

@@ -53,6 +53,10 @@ pub fn workspaced_service() -> Router {
"/run_wait_result/h/:hash",
post(run_wait_result_job_by_hash),
)
.route(
"/run_wait_result/f/*script_path",
post(run_wait_result_flow_by_path),
)
.route("/run/h/:hash", post(run_job_by_hash))
.route("/run/preview", post(run_preview_job))
.route("/run/preview_flow", post(run_preview_flow_job))
@@ -1388,6 +1392,53 @@ pub async fn run_wait_result_job_by_hash(
.await
}
pub async fn run_wait_result_flow_by_path(
authed: Authed,
Extension(user_db): Extension<UserDB>,
Extension(db): Extension<DB>,
Extension(timeout): Extension<Arc<TimeoutWaitResult>>,
Path((w_id, flow_path)): Path<(String, StripPath)>,
Query(run_query): Query<RunJobQuery>,
headers: HeaderMap,
Json(args): Json<Option<serde_json::Map<String, serde_json::Value>>>,
) -> error::JsonResult<serde_json::Value> {
check_queue_too_long(db, run_query.queue_limit).await?;
let flow_path = flow_path.to_path();
let mut tx = user_db.clone().begin(&authed).await?;
let scheduled_for = run_query.get_scheduled_for(&mut tx).await?;
let args = run_query.add_include_headers(headers, args.unwrap_or_default());
let (uuid, tx) = push(
tx,
&w_id,
JobPayload::Flow(flow_path.to_string()),
args,
&authed.username,
&authed.email,
username_to_permissioned_as(&authed.username),
scheduled_for,
None,
run_query.parent_job,
false,
false,
None,
!run_query.invisible_to_owner.unwrap_or(false),
)
.await?;
tx.commit().await?;
run_wait_result(
authed,
Extension(user_db),
timeout.0,
uuid,
Path((w_id, flow_path)),
)
.await
}
// a similar function exists on the worker
pub async fn script_path_to_payload<'c>(
script_path: &str,

View File

@@ -99,7 +99,8 @@
can_write = canWrite(flow.path, flow.extra_perms!, $userStore)
}
$: url = `${$page.url.hostname}/api/w/${$workspaceStore}/jobs/run/f/${flow?.path}`
$: urlAsync = `${$page.url.hostname}/api/w/${$workspaceStore}/jobs/run/f/${flow?.path}`
$: urlSync = `${$page.url.hostname}/api/w/${$workspaceStore}/jobs/run_wait_result/f/${flow?.path}`
let runForm: RunForm | undefined
let isValid = true
@@ -306,21 +307,39 @@
></h2
>
<div class="box max-w-2xl">
<div class="flex flex-row gap-x-2 w-full">
<div class="flex w-full flex-justify-between mb-1">
<a
on:click={(e) => {
e.preventDefault()
copyToClipboard(url)
copyToClipboard(urlAsync)
}}
href={$page.url.protocol + '//' + url}
class="whitespace-nowrap text-ellipsis overflow-hidden mr-1"
href={$page.url.protocol + '//' + urlAsync}
class="whitespace-nowrap text-ellipsis overflow-hidden mr-1 w-full"
>
{url}
{urlAsync}
<span class="text-gray-700 ml-2">
<Icon data={faClipboard} />
</span>
</a>
<Badge>UUID/Async</Badge>
</div>
<div class="mb-2 w-full flex flex-justify-between">
<a
on:click={(e) => {
e.preventDefault()
copyToClipboard(urlSync)
}}
href={$page.url.protocol + '//' + urlSync}
class="whitespace-nowrap text-ellipsis overflow-hidden mr-1 w-full"
>
{urlSync}
<span class="text-gray-700 ml-2">
<Icon data={faClipboard} />
</span>
</a>
<Badge>Result/Sync</Badge>
</div>
<div class="flex flex-row-reverse">
<Button size="xs" on:click={userSettings.openDrawer}>Create token</Button>
</div>
</div>

View File

@@ -445,8 +445,8 @@
</h3>
<Skeleton {loading} layout={[[8.5]]} />
<Tabs selected="uuid">
<Tab value="uuid">UUID</Tab>
<Tab value="result">Result</Tab>
<Tab value="uuid">UUID/Async</Tab>
<Tab value="result">Result/Sync</Tab>
<svelte:fragment slot="content">
{#each Object.keys(webhooks) as key}
<TabContent value={key}>