From 28940e46afdbe10a24fbbff3f0326ae46820ae9f Mon Sep 17 00:00:00 2001 From: Sebastian Pravda Date: Sun, 25 Dec 2022 22:22:13 +0100 Subject: [PATCH 1/5] feat: NewCandidateResponse --- api/src/routes/candidate.rs | 10 +++++++--- core/src/models/candidate.rs | 21 ++++++++++++++++++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/api/src/routes/candidate.rs b/api/src/routes/candidate.rs index 88a63d4..c69dd1a 100644 --- a/api/src/routes/candidate.rs +++ b/api/src/routes/candidate.rs @@ -2,7 +2,7 @@ use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use portfolio_core::Query; use portfolio_core::models::auth::AuthenticableTrait; -use portfolio_core::models::candidate::ApplicationDetails; +use portfolio_core::models::candidate::{ApplicationDetails, BaseCandidateResponse, NewCandidateResponse}; use portfolio_core::sea_orm::prelude::Uuid; use portfolio_core::services::application_service::ApplicationService; use portfolio_core::services::candidate_service::CandidateService; @@ -72,9 +72,13 @@ pub async fn logout( } #[get("/whoami")] -pub async fn whoami(session: CandidateAuth) -> Result> { +pub async fn whoami(session: CandidateAuth) -> Result, Custom> { + let private_key = session.get_private_key(); let candidate: entity::candidate::Model = session.into(); - Ok(candidate.application.to_string()) + let response = NewCandidateResponse::from_encrypted(&private_key, candidate).await + .map_err(to_custom_error)?; + + Ok(Json(response)) } // TODO: use put instead of post??? diff --git a/core/src/models/candidate.rs b/core/src/models/candidate.rs index c875763..d185ee9 100644 --- a/core/src/models/candidate.rs +++ b/core/src/models/candidate.rs @@ -1,4 +1,5 @@ use chrono::NaiveDate; +use entity::candidate; use sea_orm::FromQueryResult; use serde::{Serialize, Deserialize}; @@ -6,6 +7,13 @@ use crate::{error::ServiceError, database::query::candidate::CandidateResult, se use super::candidate_details::decrypt_if_exists; +/// Minimal candidate response containing database only not null fields +#[derive(Debug, Serialize)] +pub struct NewCandidateResponse { + pub application_id: i32, + pub personal_id_number: String, +} + /// Create candidate (admin endpoint) /// Password change (admin endpoint) #[derive(Debug, Serialize, Deserialize)] @@ -90,6 +98,18 @@ pub struct Row { pub second_parent_email: Option, } +impl NewCandidateResponse { + pub async fn from_encrypted(private_key: &String, c: candidate::Model) -> Result { + let id_number = decrypt_if_exists(private_key, Some(c.personal_identification_number)).await?; + Ok( + Self { + application_id: c.application, + personal_id_number: id_number, + } + ) + } +} + impl BaseCandidateResponse { pub async fn from_encrypted( private_key: &String, @@ -113,5 +133,4 @@ impl BaseCandidateResponse { } ) } - } \ No newline at end of file From 7e42d984f43df528dea11ecf5361b258afd195af Mon Sep 17 00:00:00 2001 From: Sebastian Pravda Date: Sun, 25 Dec 2022 22:25:33 +0100 Subject: [PATCH 2/5] refactor: from_ymd_opt --- core/src/database/query/candidate.rs | 2 +- core/src/models/candidate_details.rs | 8 ++++---- core/src/services/parent_service.rs | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/database/query/candidate.rs b/core/src/database/query/candidate.rs index 9ff39ee..38d112c 100644 --- a/core/src/database/query/candidate.rs +++ b/core/src/database/query/candidate.rs @@ -1,6 +1,6 @@ use sea_orm::*; -use ::entity::{candidate, candidate::Entity as Candidate, parent}; +use ::entity::{candidate, candidate::Entity as Candidate}; use crate::Query; diff --git a/core/src/models/candidate_details.rs b/core/src/models/candidate_details.rs index 9d8b4d1..a012599 100644 --- a/core/src/models/candidate_details.rs +++ b/core/src/models/candidate_details.rs @@ -335,12 +335,12 @@ pub async fn decrypt_if_exists( pub mod tests { use std::sync::Mutex; - use chrono::{Local}; + use chrono::Local; use entity::admin; use once_cell::sync::Lazy; use sea_orm::{DbConn, Set, ActiveModelTrait}; - use crate::{crypto, models::candidate::{CandidateDetails, ParentDetails}, utils::db::get_memory_sqlite_connection, Query, services::candidate_service::tests::put_user_data}; + use crate::{crypto, models::candidate::{CandidateDetails, ParentDetails}, utils::db::get_memory_sqlite_connection, services::candidate_service::tests::put_user_data}; use super::{ApplicationDetails, EncryptedApplicationDetails, EncryptedString}; @@ -353,7 +353,7 @@ pub mod tests { name: "name".to_string(), surname: "surname".to_string(), birthplace: "birthplace".to_string(), - birthdate: chrono::NaiveDate::from_ymd(2000, 1, 1), + birthdate: chrono::NaiveDate::from_ymd_opt(2000, 1, 1).unwrap(), address: "address".to_string(), telephone: "telephone".to_string(), citizenship: "citizenship".to_string(), @@ -375,7 +375,7 @@ pub mod tests { assert_eq!(details.candidate.name, "name"); assert_eq!(details.candidate.surname, "surname"); assert_eq!(details.candidate.birthplace, "birthplace"); - assert_eq!(details.candidate.birthdate, chrono::NaiveDate::from_ymd(2000, 1, 1)); + assert_eq!(details.candidate.birthdate, chrono::NaiveDate::from_ymd_opt(2000, 1, 1).unwrap()); assert_eq!(details.candidate.address, "address"); assert_eq!(details.candidate.telephone, "telephone"); assert_eq!(details.candidate.citizenship, "citizenship"); diff --git a/core/src/services/parent_service.rs b/core/src/services/parent_service.rs index cc7305f..c3710f6 100644 --- a/core/src/services/parent_service.rs +++ b/core/src/services/parent_service.rs @@ -58,7 +58,7 @@ mod tests { name: "name".to_string(), surname: "surname".to_string(), birthplace: "birthplace".to_string(), - birthdate: chrono::NaiveDate::from_ymd(2000, 1, 1), + birthdate: chrono::NaiveDate::from_ymd_opt(2000, 1, 1).unwrap(), address: "address".to_string(), telephone: "telephone".to_string(), citizenship: "citizenship".to_string(), From c78a5f5258c4ad7998b5778a4d4a38881801249f Mon Sep 17 00:00:00 2001 From: Sebastian Pravda Date: Mon, 26 Dec 2022 14:18:20 +0100 Subject: [PATCH 3/5] refactor: rename_all camelCase --- core/src/models/candidate.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/models/candidate.rs b/core/src/models/candidate.rs index d185ee9..dc51299 100644 --- a/core/src/models/candidate.rs +++ b/core/src/models/candidate.rs @@ -9,6 +9,7 @@ use super::candidate_details::decrypt_if_exists; /// Minimal candidate response containing database only not null fields #[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] pub struct NewCandidateResponse { pub application_id: i32, pub personal_id_number: String, From 367fc9ffe65bcfb0e3ff4296f4d04db43e9168d0 Mon Sep 17 00:00:00 2001 From: Sebastian Pravda Date: Mon, 26 Dec 2022 15:35:32 +0100 Subject: [PATCH 4/5] fix(api): whoami test --- api/src/routes/candidate.rs | 11 +++++++---- core/src/models/candidate.rs | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/api/src/routes/candidate.rs b/api/src/routes/candidate.rs index c69dd1a..c2b34a9 100644 --- a/api/src/routes/candidate.rs +++ b/api/src/routes/candidate.rs @@ -2,7 +2,7 @@ use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use portfolio_core::Query; use portfolio_core::models::auth::AuthenticableTrait; -use portfolio_core::models::candidate::{ApplicationDetails, BaseCandidateResponse, NewCandidateResponse}; +use portfolio_core::models::candidate::{ApplicationDetails, NewCandidateResponse}; use portfolio_core::sea_orm::prelude::Uuid; use portfolio_core::services::application_service::ApplicationService; use portfolio_core::services::candidate_service::CandidateService; @@ -258,7 +258,7 @@ pub async fn download_portfolio(session: CandidateAuth) -> Result, Custo #[cfg(test)] mod tests { - use portfolio_core::{crypto, models::candidate::ApplicationDetails, sea_orm::prelude::Uuid}; + use portfolio_core::{crypto, models::candidate::{ApplicationDetails, NewCandidateResponse}, sea_orm::prelude::Uuid}; use rocket::{ http::{Cookie, Status}, local::blocking::Client, @@ -266,7 +266,7 @@ mod tests { use crate::{ routes::admin::tests::admin_login, - test::tests::{test_client, APPLICATION_ID, CANDIDATE_PASSWORD}, + test::tests::{test_client, APPLICATION_ID, CANDIDATE_PASSWORD, PERSONAL_ID_NUMBER}, }; fn candidate_login(client: &Client) -> (Cookie, Cookie) { @@ -328,7 +328,10 @@ mod tests { .dispatch(); assert_eq!(response.status(), Status::Ok); - assert_eq!(response.into_string().unwrap(), APPLICATION_ID.to_string()); + + let candidate = response.into_json::().unwrap(); + assert_eq!(candidate.application_id, APPLICATION_ID); + assert_eq!(candidate.personal_id_number, PERSONAL_ID_NUMBER); } #[test] diff --git a/core/src/models/candidate.rs b/core/src/models/candidate.rs index dc51299..60d1022 100644 --- a/core/src/models/candidate.rs +++ b/core/src/models/candidate.rs @@ -8,7 +8,7 @@ use crate::{error::ServiceError, database::query::candidate::CandidateResult, se use super::candidate_details::decrypt_if_exists; /// Minimal candidate response containing database only not null fields -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct NewCandidateResponse { pub application_id: i32, From 8935bce7c2253e88ea319c71f999a963ce786b02 Mon Sep 17 00:00:00 2001 From: Sebastian Pravda Date: Mon, 26 Dec 2022 17:22:27 +0100 Subject: [PATCH 5/5] fix: personal id number --- api/src/routes/candidate.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/routes/candidate.rs b/api/src/routes/candidate.rs index c2b34a9..1328a91 100644 --- a/api/src/routes/candidate.rs +++ b/api/src/routes/candidate.rs @@ -298,7 +298,7 @@ mod tests { \"citizenship\": \"Czech Republic\", \"email\": \"magor@magor.cz\", \"sex\": \"MALE\", - \"personalIdNumber\": \"0000000000\", + \"personalIdNumber\": \"0101010000\", \"study\": \"KB\" }, \"parents\": [