Skip to main content

rust_viewflow/api/
axum.rs

1use crate::api::{ApiResponse, CompleteTaskRequest, CreateWorkflowRequest, WorkflowApi};
2use crate::core::{TaskState, WorkflowState};
3use axum::{
4    extract::{Json, Path},
5    http::StatusCode,
6    routing::{get, post},
7    Router,
8};
9use std::sync::Arc;
10
11/// Axum router for workflow API
12pub fn create_router(api: Arc<dyn WorkflowApi>) -> Router {
13    let api_state = api;
14
15    Router::new()
16        .route(
17            "/workflows",
18            post({
19                let api = api_state.clone();
20                move |Json(req): Json<CreateWorkflowRequest>| {
21                    let api = api.clone();
22                    async move {
23                        match api.create_workflow(req).await {
24                            Ok(workflow) => {
25                                (StatusCode::CREATED, Json(ApiResponse::success(workflow)))
26                            }
27                            Err(e) => (
28                                StatusCode::BAD_REQUEST,
29                                Json(ApiResponse::<WorkflowState>::error(e.to_string())),
30                            ),
31                        }
32                    }
33                }
34            }),
35        )
36        .route(
37            "/workflows/:id",
38            get({
39                let api = api_state.clone();
40                move |Path(id): Path<String>| {
41                    let api = api.clone();
42                    async move {
43                        match api.get_workflow(&id).await {
44                            Ok(workflow) => (StatusCode::OK, Json(ApiResponse::success(workflow))),
45                            Err(e) => (
46                                StatusCode::NOT_FOUND,
47                                Json(ApiResponse::<WorkflowState>::error(e.to_string())),
48                            ),
49                        }
50                    }
51                }
52            }),
53        )
54        .route(
55            "/workflows/:id/tasks",
56            get({
57                let api = api_state.clone();
58                move |Path(id): Path<String>| {
59                    let api = api.clone();
60                    async move {
61                        match api.get_tasks(&id).await {
62                            Ok(tasks) => (StatusCode::OK, Json(ApiResponse::success(tasks))),
63                            Err(e) => (
64                                StatusCode::NOT_FOUND,
65                                Json(ApiResponse::<Vec<TaskState>>::error(e.to_string())),
66                            ),
67                        }
68                    }
69                }
70            }),
71        )
72        .route(
73            "/tasks/:id/complete",
74            post({
75                let api = api_state.clone();
76                move |Path(id): Path<String>, Json(req): Json<CompleteTaskRequest>| {
77                    let api = api.clone();
78                    async move {
79                        match api.complete_task(&id, req).await {
80                            Ok(task) => (StatusCode::OK, Json(ApiResponse::success(task))),
81                            Err(e) => (
82                                StatusCode::BAD_REQUEST,
83                                Json(ApiResponse::<TaskState>::error(e.to_string())),
84                            ),
85                        }
86                    }
87                }
88            }),
89        )
90}