diff --git a/.sqlx/query-120b948148309b9e3eeb964f89f098163ceceaf8b1f2c76d81fab2811c362a63.json b/.sqlx/query-120b948148309b9e3eeb964f89f098163ceceaf8b1f2c76d81fab2811c362a63.json deleted file mode 100644 index cfba118..0000000 --- a/.sqlx/query-120b948148309b9e3eeb964f89f098163ceceaf8b1f2c76d81fab2811c362a63.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n INSERT INTO users (id, username, email, display_name, created_at)\n VALUES (?1, ?2, ?3, ?4, ?5)\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 5 - }, - "nullable": [] - }, - "hash": "120b948148309b9e3eeb964f89f098163ceceaf8b1f2c76d81fab2811c362a63" -} diff --git a/.sqlx/query-3577e56d051f360866f893491584cccae7d2e985742ca78be06011e6c6640fc2.json b/.sqlx/query-3577e56d051f360866f893491584cccae7d2e985742ca78be06011e6c6640fc2.json new file mode 100644 index 0000000..62766da --- /dev/null +++ b/.sqlx/query-3577e56d051f360866f893491584cccae7d2e985742ca78be06011e6c6640fc2.json @@ -0,0 +1,44 @@ +{ + "db_name": "SQLite", + "query": "\n SELECT \n id as \"id: Uuid\",\n username,\n email,\n display_name,\n created_at as \"created_at: chrono::DateTime\"\n FROM users\n ", + "describe": { + "columns": [ + { + "name": "id: Uuid", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "username", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "email", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "display_name", + "ordinal": 3, + "type_info": "Text" + }, + { + "name": "created_at: chrono::DateTime", + "ordinal": 4, + "type_info": "Text" + } + ], + "parameters": { + "Right": 0 + }, + "nullable": [ + false, + false, + true, + true, + false + ] + }, + "hash": "3577e56d051f360866f893491584cccae7d2e985742ca78be06011e6c6640fc2" +} diff --git a/src/main.rs b/src/main.rs index 0038ad2..f3928de 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,12 @@ -#[macro_use] extern crate rocket; +#[macro_use] +extern crate rocket; -use rocket::serde::{Serialize, json::Json, Deserialize}; -use rocket_dyn_templates::{Template, context}; use rocket::fs::FileServer; -use rocket_db_pools::{sqlx, Database, Connection}; -use uuid::Uuid; use rocket::http::Status; - +use rocket::serde::{json::Json, Deserialize, Serialize}; +use rocket_db_pools::{sqlx, Connection, Database}; +use rocket_dyn_templates::{context, Template}; +use uuid::Uuid; #[derive(Database)] #[database("rss_data")] @@ -53,7 +53,7 @@ struct NewUser { fn message() -> Json { Json(Message { a: -4, - b: "Hallo".to_string() + b: "Hallo".to_string(), }) } @@ -63,13 +63,12 @@ fn index() -> Template { } #[post("/users", data = "")] -async fn create_user(mut db: Connection, new_user: Json) -> Result, Status> { +async fn create_user( + mut db: Connection, + new_user: Json, +) -> Result, Status> { let new_user = new_user.into_inner(); - let user = User::new( - new_user.username, - new_user.email, - new_user.display_name, - ); + let user = User::new(new_user.username, new_user.email, new_user.display_name); let query = sqlx::query("INSERT INTO users (id, username, email, display_name, created_at) VALUES (?1, ?2, ?3, ?4, ?5)") .bind(user.id.to_string()) @@ -81,6 +80,37 @@ async fn create_user(mut db: Connection, new_user: Json) -> Result< match query { Ok(_) => Ok(Json(user)), + Err(e) => { + eprintln!("Database error: {}", e); + match e { + sqlx::Error::Database(db_err) if db_err.is_unique_violation() => { + Err(Status::Conflict) + } + _ => Err(Status::InternalServerError), + } + } + } +} + +#[get("/users")] +async fn get_users(mut db: Connection) -> Result>, Status> { + let query = sqlx::query_as!( + User, + r#" + SELECT + id as "id: Uuid", + username, + email, + display_name, + created_at as "created_at: chrono::DateTime" + FROM users + "# + ) + .fetch_all(&mut **db) + .await; + + match query { + Ok(users) => Ok(Json(users)), Err(e) => { eprintln!("Database error: {}", e); Err(Status::InternalServerError) @@ -88,10 +118,41 @@ async fn create_user(mut db: Connection, new_user: Json) -> Result< } } +#[delete("/users/")] +async fn delete_user(mut db: Connection, user_id: &str) -> Status { + // Validate UUID format + let uuid = match Uuid::parse_str(user_id) { + Ok(uuid) => uuid, + Err(_) => return Status::BadRequest, + }; + + let query = sqlx::query("DELETE FROM users WHERE id = ?") + .bind(uuid.to_string()) + .execute(&mut **db) + .await; + + match query { + Ok(result) => { + if result.rows_affected() > 0 { + Status::NoContent + } else { + Status::NotFound + } + } + Err(e) => { + eprintln!("Database error: {}", e); + Status::InternalServerError + } + } +} + #[launch] fn rocket() -> _ { rocket::build() - .mount("/", routes![index, message, create_user]) + .mount( + "/", + routes![index, message, create_user, get_users, delete_user], + ) .mount("/static", FileServer::from("static")) .attach(Template::fairing()) .attach(Db::init())