From 48bb2ab839ea0bee9980ebb9694d5afff0b20fcb Mon Sep 17 00:00:00 2001 From: "Sebastian H. Gabrielli" Date: Sun, 24 Dec 2023 00:18:33 +0100 Subject: [PATCH] Create and implement add_member function --- src/main.rs | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++- test.db | Bin 32768 -> 32768 bytes 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 356493c..8a5c6d2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ // Webserver #[macro_use] extern crate rocket; + use rocket::{State, Error}; use rocket::response::status; use rocket::serde::{Serialize, Deserialize, json::Json}; @@ -31,6 +32,23 @@ struct Member { rfidCards: Vec } +#[derive(Serialize, Deserialize)] +struct MinimalMember { + id: i32, + ntnuUsername: String, + firstName: String, + lastName: String, + email: String, +} + +#[derive(Serialize, Deserialize)] +struct MinimalMemberWithoutId { + ntnuUsername: String, + firstName: String, + lastName: String, + email: String, +} + #[derive(Responder)] #[response(status = 500, content_type = "json")] struct ErrorResponder { @@ -58,6 +76,49 @@ fn index() -> &'static str { "Hello, world!\nNothing useful is served here." } +#[post("/member", data = "")] +async fn add_member(db: &State, minimalMemberWithoutId: Json) -> Result, ErrorResponder> { + // Grab the database connection + let db = db as &DatabaseConnection; + + // Create the new member info from the provided JSON + let new_member = members::ActiveModel { + ntnu_username: ActiveValue::Set(minimalMemberWithoutId.ntnuUsername.to_owned()), + first_name: ActiveValue::Set(minimalMemberWithoutId.firstName.to_owned()), + last_name: ActiveValue::Set(minimalMemberWithoutId.lastName.to_owned()), + email: ActiveValue::Set(minimalMemberWithoutId.email.to_owned()), + balance: ActiveValue::Set(0), + image_preference: ActiveValue::Set("Money".to_string()), + ..Default::default() + }; + + // Add the new member to the database + let res = Members::insert(new_member).exec(db).await?; + + // Fetch the member's info back from the DB to verify + let new_member; + match Members::find_by_id(res.last_insert_id).one(db).await? { + Some(model) => new_member = model, + None => { + return Err( + ErrorResponder { + message: format!("Failed to fetch member for verification of creating new member with ID. memberId: {}", res.last_insert_id) + } + ); + }, + } + + let member = MinimalMember { + id: new_member.id, + ntnuUsername: new_member.ntnu_username, + firstName: new_member.first_name, + lastName: new_member.last_name, + email: new_member.email, + }; + + Ok(Json(member)) +} + #[get("/member/")] async fn get_member_by_id(db: &State, memberId: i32) -> Result, ErrorResponder> { let db = db as &DatabaseConnection; @@ -105,6 +166,7 @@ async fn rocket() -> _ { .manage(db) .mount("/", routes![ index, - get_member_by_id + get_member_by_id, + add_member ]) } diff --git a/test.db b/test.db index cdda941c3e5671bdb48b5050047fd95ccf3cddb8..37c362bfcc9aedc60be4fab9c464adeb2929acb5 100644 GIT binary patch delta 170 zcmZo@U}|V!njp={HBrWym5V{IXu-ym1^OIJ{4EUphxl7I2l7|&*V{00Fv!Zwn{$X4 zrzRy9mt>>|gXzq~Jom(;qRiBsoJ@!eP{bh(s3JEpGe65YHE44au9 H{@Mco>D)Nn delta 32 ocmZo@U}|V!njp={F;T{um4iVq+-qaX0{z7-3Idy19RAn?0F#>uasU7T