Implement get_members

This commit is contained in:
Sebastian H. Gabrielli 2023-12-25 13:00:35 +01:00
parent bf84ff6e33
commit 8b704120d2
2 changed files with 42 additions and 1 deletions

View File

@ -32,6 +32,23 @@ struct Member {
rfidCards: Vec<RfidCard>
}
// 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<<entities::members::Entity as sea_orm::EntityTrait>::Model> for Member {
fn from(member: <entities::members::Entity as sea_orm::EntityTrait>::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<Member>,
}
#[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<DatabaseConnection>) -> Result<Json<MultipleMembersStruct>, 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<Member> = 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 = "<minimalMemberWithoutId>")]
async fn add_member(db: &State<DatabaseConnection>, minimalMemberWithoutId: Json<MinimalMemberWithoutId>) -> Result<Json<MinimalMember>, 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
])
}

BIN
test.db

Binary file not shown.