Compare commits

..

No commits in common. "cde27b56d939fbbcd17a21b904c5a8eecd53c65e" and "59707600553f60fe605a5831e0e38d5464585949" have entirely different histories.

3 changed files with 41 additions and 54 deletions

View File

@ -7,11 +7,6 @@ use database::set_up_db;
mod webserver_member; mod webserver_member;
use webserver_member::*; use webserver_member::*;
#[get("/")]
fn index() -> &'static str {
"Hello, world!\nNothing useful is served here."
}
#[launch] #[launch]
async fn rocket() -> _ { async fn rocket() -> _ {
let db = match set_up_db().await { let db = match set_up_db().await {

View File

@ -1,22 +1,20 @@
use rocket::serde::{Serialize, Deserialize}; use rocket::serde::{Serialize, Deserialize};
use sea_orm::*; use sea_orm::*;
use super::entities::{*}; use super::entities::{prelude::*, *};
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct RfidCard { pub struct RfidCard {
#[serde(rename = "cardId")] pub cardId: String,
pub card_id: String, pub cardComment: String
#[serde(rename = "cardComment")]
pub card_comment: String
} }
// Implement `.into()` to auto map values from the database model to the local struct // Implement `.into()` to auto map values from the database model to the local struct
impl From<rfid_cards::Model> for RfidCard { impl From<rfid_cards::Model> for RfidCard {
fn from(rfid_card: rfid_cards::Model) -> RfidCard { fn from(rfid_card: rfid_cards::Model) -> RfidCard {
RfidCard { RfidCard {
card_id: rfid_card.card_id, cardId: rfid_card.card_id,
card_comment: rfid_card.card_comment, cardComment: rfid_card.card_comment,
} }
} }
} }
@ -24,18 +22,13 @@ impl From<rfid_cards::Model> for RfidCard {
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct Member { pub struct Member {
pub id: i32, pub id: i32,
#[serde(rename = "ntnuUsername")] pub ntnuUsername: String,
pub ntnu_username: String, pub firstName: String,
#[serde(rename = "firstName")] pub lastName: String,
pub first_name: String,
#[serde(rename = "lastName")]
pub last_name: String,
pub email: String, pub email: String,
pub balance: i32, pub balance: i32,
#[serde(rename = "imagePreference")] pub imagePreference: String,
pub image_preference: String, pub rfidCards: Vec<RfidCard>
#[serde(rename = "lastName")]
pub rfid_cards: Vec<RfidCard>
} }
// Create the `.into()` functionality to auto map values from the database model to the local struct // Create the `.into()` functionality to auto map values from the database model to the local struct
@ -44,13 +37,13 @@ impl From<members::Model> for Member {
fn from(member: members::Model) -> Member { fn from(member: members::Model) -> Member {
Member { Member {
id: member.id, id: member.id,
ntnu_username: member.ntnu_username, ntnuUsername: member.ntnu_username,
first_name: member.first_name, firstName: member.first_name,
last_name: member.last_name, lastName: member.last_name,
email: member.email, email: member.email,
balance: member.balance, balance: member.balance,
image_preference: member.image_preference, imagePreference: member.image_preference,
rfid_cards: Vec::new(), rfidCards: Vec::new(),
} }
} }
} }
@ -60,9 +53,9 @@ impl From<members::Model> for MinimalMember {
fn from(member: members::Model) -> MinimalMember { fn from(member: members::Model) -> MinimalMember {
MinimalMember { MinimalMember {
id: member.id, id: member.id,
ntnu_username: member.ntnu_username, ntnuUsername: member.ntnu_username,
first_name: member.first_name, firstName: member.first_name,
last_name: member.last_name, lastName: member.last_name,
email: member.email, email: member.email,
} }
} }
@ -72,9 +65,9 @@ impl From<members::Model> for MinimalMember {
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 {
members::ActiveModel { members::ActiveModel {
ntnu_username: ActiveValue::Set(self.ntnu_username.to_owned()), ntnu_username: ActiveValue::Set(self.ntnuUsername.to_owned()),
first_name: ActiveValue::Set(self.first_name.to_owned()), first_name: ActiveValue::Set(self.firstName.to_owned()),
last_name: ActiveValue::Set(self.last_name.to_owned()), last_name: ActiveValue::Set(self.lastName.to_owned()),
email: ActiveValue::Set(self.email.to_owned()), email: ActiveValue::Set(self.email.to_owned()),
balance: ActiveValue::Set(0), balance: ActiveValue::Set(0),
image_preference: ActiveValue::Set("".to_string()), image_preference: ActiveValue::Set("".to_string()),
@ -86,23 +79,17 @@ impl Into<members::ActiveModel> for rocket::serde::json::Json<MinimalMemberWitho
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct MinimalMember { pub struct MinimalMember {
pub id: i32, pub id: i32,
#[serde(rename = "ntnuUsername")] pub ntnuUsername: String,
pub ntnu_username: String, pub firstName: String,
#[serde(rename = "firstName")] pub lastName: String,
pub first_name: String,
#[serde(rename = "lastName")]
pub last_name: String,
pub email: String, pub email: String,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct MinimalMemberWithoutId { pub struct MinimalMemberWithoutId {
#[serde(rename = "ntnuUsername")] pub ntnuUsername: String,
pub ntnu_username: String, pub firstName: String,
#[serde(rename = "firstName")] pub lastName: String,
pub first_name: String,
#[serde(rename = "lastName")]
pub last_name: String,
pub email: String, pub email: String,
} }

View File

@ -15,8 +15,8 @@ use sea_orm::*;
#[derive(Responder)] #[derive(Responder)]
#[response(status = 500, content_type = "text/plain")] #[response(status = 500, content_type = "text/plain")]
pub struct ErrorResponder { struct ErrorResponder {
pub message: String message: String
} }
impl From<DbErr> for ErrorResponder { impl From<DbErr> for ErrorResponder {
@ -35,6 +35,11 @@ impl From<&str> for ErrorResponder {
} }
} }
#[get("/")]
pub fn index() -> &'static str {
"Hello, world!\nNothing useful is served here."
}
#[get("/members")] #[get("/members")]
pub async fn get_members(db: &State<DatabaseConnection>) -> Result<Json<MultipleMembersStruct>, ErrorResponder> { pub async fn get_members(db: &State<DatabaseConnection>) -> Result<Json<MultipleMembersStruct>, ErrorResponder> {
let db = db as &DatabaseConnection; let db = db as &DatabaseConnection;
@ -57,7 +62,7 @@ pub async fn get_members(db: &State<DatabaseConnection>) -> Result<Json<Multiple
let rfid_cards: Vec<RfidCard> = rfid_cards.into_iter().map(RfidCard::from).collect(); let rfid_cards: Vec<RfidCard> = rfid_cards.into_iter().map(RfidCard::from).collect();
// Add these cards to the member's rfidCards field // Add these cards to the member's rfidCards field
member.rfid_cards = rfid_cards; member.rfidCards = rfid_cards;
} }
@ -75,7 +80,7 @@ pub async fn add_member(db: &State<DatabaseConnection>, minimal_member_without_i
// Check if a member with the same NTNU username already exists // Check if a member with the same NTNU username already exists
let matching_member: Option<members::Model> = Members::find() // Find a member in the "Members" table let matching_member: Option<members::Model> = Members::find() // Find a member in the "Members" table
.filter(members::Column::NtnuUsername.eq(minimal_member_without_id.ntnu_username.to_owned())) // Filter by the provided username in the NtnuUsername column .filter(members::Column::NtnuUsername.eq(minimal_member_without_id.ntnuUsername.to_owned())) // Filter by the provided username in the NtnuUsername column
.one(db) // We only care about one result .one(db) // We only care about one result
.await?; // Wait for the result .await?; // Wait for the result
@ -113,19 +118,19 @@ pub async fn add_member(db: &State<DatabaseConnection>, minimal_member_without_i
Ok(Json(member)) Ok(Json(member))
} }
#[get("/member/<member_id>")] #[get("/member/<memberId>")]
pub async fn get_member_by_id(db: &State<DatabaseConnection>, member_id: i32) -> Result<Json<Member>, ErrorResponder> { pub async fn get_member_by_id(db: &State<DatabaseConnection>, memberId: i32) -> Result<Json<Member>, ErrorResponder> {
let db = db as &DatabaseConnection; let db = db as &DatabaseConnection;
// Create an empty variable to store the resulting member info // Create an empty variable to store the resulting member info
let database_member; let database_member;
// Search the database for the member based on the ID // Search the database for the member based on the ID
match Members::find_by_id(member_id).one(db).await? { match Members::find_by_id(memberId).one(db).await? {
Some(model) => database_member = model, // If the member is found, add the info to the previously created variable Some(model) => database_member = model, // If the member is found, add the info to the previously created variable
None => { None => {
return Err( return Err(
ErrorResponder { ErrorResponder {
message: format!("Failed to fetch member by ID. memberId: {}", member_id) // If it is not found return with this error message: format!("Failed to fetch member by ID. memberId: {}", memberId) // If it is not found return with this error
} }
); );
}, },
@ -137,7 +142,7 @@ pub async fn get_member_by_id(db: &State<DatabaseConnection>, member_id: i32) ->
// Create a member from the database model and append the RFID cards // Create a member from the database model and append the RFID cards
let mut member: Member = database_member.into(); let mut member: Member = database_member.into();
member.rfid_cards = rfids; member.rfidCards = rfids;
Ok(Json(member)) Ok(Json(member))
} }