diff --git a/src/main.rs b/src/main.rs index 1763efd..f41d22a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -25,6 +25,7 @@ async fn rocket() -> _ { index, get_member_by_id, add_member, - get_members + get_members, + update_member_by_id ]) } diff --git a/src/models/member.rs b/src/models/member.rs index 740f690..538dda4 100644 --- a/src/models/member.rs +++ b/src/models/member.rs @@ -21,7 +21,7 @@ impl From for RfidCard { } } -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Default)] pub struct Member { pub id: i32, #[serde(rename = "ntnuUsername")] @@ -55,6 +55,18 @@ impl From for Member { } } +#[derive(Serialize, Deserialize)] +pub struct MinimalMember { + pub id: i32, + #[serde(rename = "ntnuUsername")] + pub ntnu_username: String, + #[serde(rename = "firstName")] + pub first_name: String, + #[serde(rename = "lastName")] + pub last_name: String, + pub email: String, +} + // Implement DB Member Model -> MinimalMember impl From for MinimalMember { fn from(member: members::Model) -> MinimalMember { @@ -68,6 +80,17 @@ impl From for MinimalMember { } } +#[derive(Serialize, Deserialize)] +pub struct MinimalMemberWithoutId { + #[serde(rename = "ntnuUsername")] + pub ntnu_username: String, + #[serde(rename = "firstName")] + pub first_name: String, + #[serde(rename = "lastName")] + pub last_name: String, + pub email: String, +} + // Create the functionality to create a database model member from the local struct model member impl Into for rocket::serde::json::Json { fn into(self) -> members::ActiveModel { @@ -83,29 +106,6 @@ impl Into for rocket::serde::json::Json, diff --git a/src/webserver_member.rs b/src/webserver_member.rs index 31ac358..c4b5926 100644 --- a/src/webserver_member.rs +++ b/src/webserver_member.rs @@ -139,5 +139,46 @@ pub async fn get_member_by_id(db: &State, member_id: i32) -> let mut member: Member = database_member.into(); member.rfid_cards = rfids; + Ok(Json(member)) +} + +#[put("/member/", data="")] +pub async fn update_member_by_id(db: &State, minimal_member_without_id: Json, member_id: i32) -> Result, ErrorResponder> { + let db = db as &DatabaseConnection; + + // Fetch the current member info from the DB + let current_member_info: members::Model; + match Members::find_by_id(member_id).one(db).await? { + Some(m) => current_member_info = m, + None => return Err (ErrorResponder { message: format!("Could not find member with the spcified ID. ID: {}", member_id) }), + } + + // Put all the received info into a new member thingie + let new_member_info: members::ActiveModel = minimal_member_without_id.into(); + + // Combine the two + let resulting_member: members::ActiveModel = members::ActiveModel { + id: ActiveValue::Set(current_member_info.id), + ntnu_username: new_member_info.ntnu_username, + first_name: new_member_info.first_name, + last_name: new_member_info.last_name, + email: new_member_info.email, + balance: ActiveValue::Set(current_member_info.balance), + image_preference: ActiveValue::Set(current_member_info.image_preference), + }; + + // Update the DB entry for the user + resulting_member.update(db).await?; + + // Fetch the member's info back from the DB + let current_member_info: members::Model; + match Members::find_by_id(member_id).one(db).await? { + Some(m) => current_member_info = m, + None => return Err (ErrorResponder { message: format!("Could not find member with the spcified ID. ID: {}", member_id) }), + } + + // Turn it into the native model + let member: Member = current_member_info.into(); + Ok(Json(member)) } \ No newline at end of file diff --git a/test.db b/test.db index 8397dca..df70eb6 100644 Binary files a/test.db and b/test.db differ