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> 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)] #[derive(Serialize, Deserialize)]
struct MinimalMember { struct MinimalMember {
id: i32, id: i32,
@ -49,6 +66,11 @@ struct MinimalMemberWithoutId {
email: String, email: String,
} }
#[derive(Serialize)]
struct MultipleMembersStruct {
members: Vec<Member>,
}
#[derive(Responder)] #[derive(Responder)]
#[response(status = 500, content_type = "text/plain")] #[response(status = 500, content_type = "text/plain")]
struct ErrorResponder { struct ErrorResponder {
@ -76,6 +98,24 @@ fn index() -> &'static str {
"Hello, world!\nNothing useful is served here." "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>")] #[post("/member", data = "<minimalMemberWithoutId>")]
async fn add_member(db: &State<DatabaseConnection>, minimalMemberWithoutId: Json<MinimalMemberWithoutId>) -> Result<Json<MinimalMember>, ErrorResponder> { async fn add_member(db: &State<DatabaseConnection>, minimalMemberWithoutId: Json<MinimalMemberWithoutId>) -> Result<Json<MinimalMember>, ErrorResponder> {
// Grab the database connection // Grab the database connection
@ -183,6 +223,7 @@ async fn rocket() -> _ {
.mount("/", routes![ .mount("/", routes![
index, index,
get_member_by_id, get_member_by_id,
add_member add_member,
get_members
]) ])
} }

BIN
test.db

Binary file not shown.