list and delete users
This commit is contained in:
parent
880ff11bb4
commit
745c7f0a63
@ -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"
|
||||
}
|
44
.sqlx/query-3577e56d051f360866f893491584cccae7d2e985742ca78be06011e6c6640fc2.json
generated
Normal file
44
.sqlx/query-3577e56d051f360866f893491584cccae7d2e985742ca78be06011e6c6640fc2.json
generated
Normal file
@ -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<chrono::Utc>\"\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<chrono::Utc>",
|
||||
"ordinal": 4,
|
||||
"type_info": "Text"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 0
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
true,
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "3577e56d051f360866f893491584cccae7d2e985742ca78be06011e6c6640fc2"
|
||||
}
|
89
src/main.rs
89
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<Message> {
|
||||
Json(Message {
|
||||
a: -4,
|
||||
b: "Hallo".to_string()
|
||||
b: "Hallo".to_string(),
|
||||
})
|
||||
}
|
||||
|
||||
@ -63,13 +63,12 @@ fn index() -> Template {
|
||||
}
|
||||
|
||||
#[post("/users", data = "<new_user>")]
|
||||
async fn create_user(mut db: Connection<Db>, new_user: Json<NewUser>) -> Result<Json<User>, Status> {
|
||||
async fn create_user(
|
||||
mut db: Connection<Db>,
|
||||
new_user: Json<NewUser>,
|
||||
) -> Result<Json<User>, 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<Db>, new_user: Json<NewUser>) -> 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<Db>) -> Result<Json<Vec<User>>, Status> {
|
||||
let query = sqlx::query_as!(
|
||||
User,
|
||||
r#"
|
||||
SELECT
|
||||
id as "id: Uuid",
|
||||
username,
|
||||
email,
|
||||
display_name,
|
||||
created_at as "created_at: chrono::DateTime<chrono::Utc>"
|
||||
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<Db>, new_user: Json<NewUser>) -> Result<
|
||||
}
|
||||
}
|
||||
|
||||
#[delete("/users/<user_id>")]
|
||||
async fn delete_user(mut db: Connection<Db>, 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())
|
||||
|
Loading…
Reference in New Issue
Block a user