rust_viewflow/api/
axum.rs1use 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
11pub 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}