summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Hader <[email protected]>2026-05-12 13:46:39 -0500
committerDaniel Hader <[email protected]>2026-05-12 13:46:39 -0500
commit970638e3c895ba518c7a70f56f385c9dcdce8b5d (patch)
tree301152e34344da3e7fcf0fe9ea8f7dbe642c9802
parent36fad793c3be58b220ae319a45c8cd8afbae09fa (diff)
create and get problem endpoints added
-rw-r--r--src/database/problem.rs3
-rw-r--r--src/database/user.rs3
-rw-r--r--src/main.rs8
-rw-r--r--src/routes/problem.rs34
-rw-r--r--src/routes/user.rs7
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)));
}