From 8b704120d2dd0ffd398ce49729788e120acff0cf Mon Sep 17 00:00:00 2001 From: "Sebastian H. Gabrielli" Date: Mon, 25 Dec 2023 13:00:35 +0100 Subject: [PATCH] Implement get_members --- src/main.rs | 43 ++++++++++++++++++++++++++++++++++++++++++- test.db | Bin 32768 -> 32768 bytes 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index cdf82fe..06458e9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,6 +32,23 @@ struct Member { rfidCards: Vec } +// Create the `.into()` functionality to auto map values from the database model to the local struct +// Don't be scared by the long model name, I typed `Members::Model` and applied the auto fix vscode suggested +impl From<::Model> for Member { + fn from(member: ::Model) -> Member { + Member { + id: member.id, + ntnuUsername: member.ntnu_username, + firstName: member.first_name, + lastName: member.last_name, + email: member.email, + balance: member.balance, + imagePreference: member.image_preference, + rfidCards: Vec::new(), + } + } +} + #[derive(Serialize, Deserialize)] struct MinimalMember { id: i32, @@ -49,6 +66,11 @@ struct MinimalMemberWithoutId { email: String, } +#[derive(Serialize)] +struct MultipleMembersStruct { + members: Vec, +} + #[derive(Responder)] #[response(status = 500, content_type = "text/plain")] struct ErrorResponder { @@ -76,6 +98,24 @@ fn index() -> &'static str { "Hello, world!\nNothing useful is served here." } +#[get("/members")] +async fn get_members(db: &State) -> Result, ErrorResponder> { + let db = db as &DatabaseConnection; + + // Get a list of all members from the database + let members = Members::find().all(db).await?; + + // Convert this vector from the database model to the local struct model + let members: Vec = members.into_iter().map(Member::from).collect(); + // TODO: Add the member's RFID card + + // Put this into the `MultipleMembersStruct` so that the aquired JSON will look as the API demands + let output = MultipleMembersStruct { members }; + + // Return the output + Ok(Json(output)) +} + #[post("/member", data = "")] async fn add_member(db: &State, minimalMemberWithoutId: Json) -> Result, ErrorResponder> { // Grab the database connection @@ -183,6 +223,7 @@ async fn rocket() -> _ { .mount("/", routes![ index, get_member_by_id, - add_member + add_member, + get_members ]) } diff --git a/test.db b/test.db index 37c362bfcc9aedc60be4fab9c464adeb2929acb5..421baaf3263ac69e5cb8eb17c36e47c235821eba 100644 GIT binary patch delta 51 zcmZo@U}|V!njp<6Fj2;tQD9@jGJUoN2L40*4Vwe`OZfR5m^c_z<>k#e#Pjk?bT{|e H7dZd`Y;O(a delta 47 zcmZo@U}|V!njp={HBrWyk!xeZGJUod2L40*Et>=REBLu=m^c_@<>k#e#5ecZ7dZd` DHkk}p