worldinterface_daemon/routes/
flows.rs1use 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}