Skip to main content

worldinterface_daemon/routes/
flows.rs

1//! Flow submission endpoints.
2
3use axum::extract::State;
4use axum::http::StatusCode;
5use axum::Json;
6use serde::{Deserialize, Serialize};
7use worldinterface_core::flowspec::FlowSpec;
8use worldinterface_core::id::FlowRunId;
9
10use crate::error::ApiError;
11use crate::state::SharedState;
12
13pub fn register_routes(router: axum::Router<SharedState>) -> axum::Router<SharedState> {
14    router
15        .route("/api/v1/flows", axum::routing::post(submit_flow))
16        .route("/api/v1/flows/ephemeral", axum::routing::post(submit_ephemeral_flow))
17}
18
19#[derive(Serialize, Deserialize)]
20pub struct SubmitFlowRequest {
21    pub spec: FlowSpec,
22}
23
24#[derive(Serialize, Deserialize)]
25pub struct SubmitFlowResponse {
26    pub flow_run_id: FlowRunId,
27}
28
29async fn submit_flow(
30    State(state): State<SharedState>,
31    Json(request): Json<SubmitFlowRequest>,
32) -> Result<(StatusCode, Json<SubmitFlowResponse>), ApiError> {
33    let flow_run_id = state.host.submit_flow(request.spec).await?;
34    Ok((StatusCode::ACCEPTED, Json(SubmitFlowResponse { flow_run_id })))
35}
36
37async fn submit_ephemeral_flow(
38    State(state): State<SharedState>,
39    Json(spec): Json<FlowSpec>,
40) -> Result<(StatusCode, Json<SubmitFlowResponse>), ApiError> {
41    let flow_run_id = state.host.submit_flow(spec).await?;
42    Ok((StatusCode::ACCEPTED, Json(SubmitFlowResponse { flow_run_id })))
43}