diff --git a/src/main.rs b/src/main.rs index 8fac2d9..99ca347 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,6 +7,7 @@ use axum::{ routing::{get, get_service}, Router, }; +use model::ModelController; use tower_cookies::{CookieManager, CookieManagerLayer}; pub use self::error::{Error, Result}; @@ -22,7 +23,10 @@ mod model; mod web; #[tokio::main] -async fn main() { +async fn main() -> Result<()> { + // Initialize Model controller + let mc = ModelController::new().await?; + let cors = CorsLayer::new() .allow_methods([Method::GET, Method::POST]) .allow_headers(vec![HeaderName::from_static("content-type")]) @@ -30,6 +34,7 @@ async fn main() { let routes_all = Router::new() .merge(web::routes_login::routes()) + .nest("/api", web::routes_tickets::routes(mc.clone())) .layer(cors) .layer(middleware::map_response(main_response_mapper)) .layer(CookieManagerLayer::new()) @@ -39,6 +44,8 @@ async fn main() { axum::serve(listener, routes_all.into_make_service()) .await .unwrap(); + + Ok(()) } async fn main_response_mapper(res: Response) -> Response { diff --git a/src/web/mod.rs b/src/web/mod.rs index 8c933c3..312baf4 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -1,3 +1,4 @@ pub mod routes_login; +pub mod routes_tickets; pub const AUTH_TOKEN: &str = "auth-token"; diff --git a/src/web/routes_tickets.rs b/src/web/routes_tickets.rs new file mode 100644 index 0000000..3ccbfcd --- /dev/null +++ b/src/web/routes_tickets.rs @@ -0,0 +1,41 @@ +use axum::{ + extract::{Path, State}, + routing::{delete, post}, + Json, Router, +}; + +use crate::{ + model::{ModelController, Ticket, TicketForCreate}, + Result, +}; + +async fn create_ticket( + State(mc): State, + Json(ticket_fc): Json, +) -> Result> { + let ticket = mc.create_ticket(ticket_fc).await?; + + Ok(Json(ticket)) +} + +async fn list_tickets(State(mc): State) -> Result>> { + let tickets = mc.list_tickets().await?; + + Ok(Json(tickets)) +} + +async fn delete_ticket( + State(mc): State, + Path(id): Path, +) -> Result> { + let ticket = mc.delete_ticket(id).await?; + + Ok(Json(ticket)) +} + +pub fn routes(mc: ModelController) -> Router { + Router::new() + .route("/tickets", post(create_ticket).get(list_tickets)) + .route("/tickets/:id", delete(delete_ticket)) + .with_state(mc) +} diff --git a/tests/quick_dev.rs b/tests/quick_dev.rs index e3c090b..56ee425 100644 --- a/tests/quick_dev.rs +++ b/tests/quick_dev.rs @@ -18,5 +18,16 @@ async fn quick_dev() -> Result<()> { req_login.await?.print().await?; + let req_create_ticket = hc.do_post( + "/api/tickets", + json!({ + "title": "Ticket AAA", + }), + ); + + req_create_ticket.await?.print().await?; + + hc.do_get("/api/tickets").await?.print().await?; + Ok(()) }