Implemented update_member_by_id

This commit is contained in:
Sebastian H. Gabrielli 2023-12-25 16:40:39 +01:00
parent cde27b56d9
commit dddef4e80a
4 changed files with 67 additions and 25 deletions

View File

@ -25,6 +25,7 @@ async fn rocket() -> _ {
index, index,
get_member_by_id, get_member_by_id,
add_member, add_member,
get_members get_members,
update_member_by_id
]) ])
} }

View File

@ -21,7 +21,7 @@ impl From<rfid_cards::Model> for RfidCard {
} }
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Default)]
pub struct Member { pub struct Member {
pub id: i32, pub id: i32,
#[serde(rename = "ntnuUsername")] #[serde(rename = "ntnuUsername")]
@ -55,6 +55,18 @@ impl From<members::Model> 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 // Implement DB Member Model -> MinimalMember
impl From<members::Model> for MinimalMember { impl From<members::Model> for MinimalMember {
fn from(member: members::Model) -> MinimalMember { fn from(member: members::Model) -> MinimalMember {
@ -68,6 +80,17 @@ impl From<members::Model> 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 // Create the functionality to create a database model member from the local struct model member
impl Into<members::ActiveModel> for rocket::serde::json::Json<MinimalMemberWithoutId> { impl Into<members::ActiveModel> for rocket::serde::json::Json<MinimalMemberWithoutId> {
fn into(self) -> members::ActiveModel { fn into(self) -> members::ActiveModel {
@ -83,29 +106,6 @@ impl Into<members::ActiveModel> for rocket::serde::json::Json<MinimalMemberWitho
} }
} }
#[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,
}
#[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,
}
#[derive(Serialize)] #[derive(Serialize)]
pub struct MultipleMembersStruct { pub struct MultipleMembersStruct {
pub members: Vec<Member>, pub members: Vec<Member>,

View File

@ -141,3 +141,44 @@ pub async fn get_member_by_id(db: &State<DatabaseConnection>, member_id: i32) ->
Ok(Json(member)) Ok(Json(member))
} }
#[put("/member/<member_id>", data="<minimal_member_without_id>")]
pub async fn update_member_by_id(db: &State<DatabaseConnection>, minimal_member_without_id: Json<MinimalMemberWithoutId>, member_id: i32) -> Result<Json<Member>, 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))
}

BIN
test.db

Binary file not shown.