diff options
| author | Daniel Hader <[email protected]> | 2026-05-12 13:46:39 -0500 |
|---|---|---|
| committer | Daniel Hader <[email protected]> | 2026-05-12 13:46:39 -0500 |
| commit | 970638e3c895ba518c7a70f56f385c9dcdce8b5d (patch) | |
| tree | 301152e34344da3e7fcf0fe9ea8f7dbe642c9802 /src | |
| parent | 36fad793c3be58b220ae319a45c8cd8afbae09fa (diff) | |
create and get problem endpoints added
Diffstat (limited to 'src')
| -rw-r--r-- | src/database/problem.rs | 3 | ||||
| -rw-r--r-- | src/database/user.rs | 3 | ||||
| -rw-r--r-- | src/main.rs | 8 | ||||
| -rw-r--r-- | src/routes/problem.rs | 34 | ||||
| -rw-r--r-- | src/routes/user.rs | 7 |
5 files changed, 37 insertions, 18 deletions
diff --git a/src/database/problem.rs b/src/database/problem.rs index c3e04c2..c759b02 100644 --- a/src/database/problem.rs +++ b/src/database/problem.rs @@ -1,3 +1,6 @@ +use serde::Serialize; + +#[derive(Serialize)] pub struct Problem { id: i64, title: String, diff --git a/src/database/user.rs b/src/database/user.rs index c9aaf51..c580226 100644 --- a/src/database/user.rs +++ b/src/database/user.rs @@ -1,3 +1,6 @@ +use serde::Serialize; + +#[derive(Serialize)] pub struct User { id: i64, email: String, diff --git a/src/main.rs b/src/main.rs index ef762f7..399a385 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,7 +7,7 @@ use axum::{ Router, }; -use routes::problem::get_problems; +use routes::problem::{get_problems, create_problem}; use routes::user::create_user; use crate::database::Database; @@ -29,8 +29,10 @@ async fn main() { let app = Router::new() .route("/", get(|| async {"Hello World!"})) - .route("/problems", get(get_problems)) - .route("/user", post(create_user).with_state(state)); + .route("/problem", get(get_problems)) + .route("/problem", post(create_problem)) + .route("/user", post(create_user)) + .with_state(state); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); axum::serve(listener, app).await.unwrap(); diff --git a/src/routes/problem.rs b/src/routes/problem.rs index caeb808..9b2eba3 100644 --- a/src/routes/problem.rs +++ b/src/routes/problem.rs @@ -1,17 +1,33 @@ -use axum::response::Json; -use serde::Serialize; +use axum::{extract::State, http::StatusCode, response::{IntoResponse, Json}}; +use serde::Deserialize; -#[derive(Serialize)] -pub struct Problem { +use crate::{AppState, routes::errors::RouteError}; + +#[derive(Deserialize)] +pub struct CreateProblemRequest { title: String, description: String, } -pub async fn get_problems() -> Json<Vec<Problem>> { - let problem = Problem { - title: "test problem".into(), - description: "the description of a test problem".into(), +pub async fn create_problem( + State(state): State<AppState>, + Json(request): Json<CreateProblemRequest> +) -> Result<impl IntoResponse, RouteError> { + + let Ok(problem) = state.database.insert_problem(&request.title, &request.description) else { + return Err(RouteError::Internal("database action failed".into())); }; - Json(vec![problem]) + + Ok((StatusCode::CREATED, Json(problem))) } +pub async fn get_problems( + State(state): State<AppState>, +) -> Result<impl IntoResponse, RouteError> { + + let Ok(problems) = state.database.fetch_problems() else { + return Err(RouteError::Internal("database action failed".into())); + }; + + Ok((StatusCode::CREATED, Json(problems))) +} diff --git a/src/routes/user.rs b/src/routes/user.rs index 42db46f..f64cb39 100644 --- a/src/routes/user.rs +++ b/src/routes/user.rs @@ -2,7 +2,6 @@ use axum::extract::{Json, State}; use axum::http::StatusCode; use axum::response::IntoResponse; use serde::Deserialize; -use serde_json::json; use crate::AppState; use crate::auth::hash_password; @@ -40,10 +39,6 @@ pub async fn create_user( return Err(RouteError::Internal("failed to create user".into())); }; - return Ok((StatusCode::CREATED, Json(json!({ - "id": user.id(), - "email": user.email(), - "username": user.username(), - })))); + return Ok((StatusCode::CREATED, Json(user))); } |
