From 3d8487f7712b5f362e4d2ebcfcfda4d9715895d7 Mon Sep 17 00:00:00 2001 From: Sebastian Pravda Date: Sat, 14 Jan 2023 16:43:00 +0100 Subject: [PATCH] feat: link candidates, so both can decrypt their personal id number --- core/src/services/application_service.rs | 53 +++++++++++++++++------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/core/src/services/application_service.rs b/core/src/services/application_service.rs index 969c104..02a550f 100644 --- a/core/src/services/application_service.rs +++ b/core/src/services/application_service.rs @@ -43,19 +43,15 @@ impl ApplicationService { priv_key_plain_text, plain_text_password.to_string() ).await?; - - let recipients = get_recipients(db, &pubkey).await?; - let enc_personal_id_number = EncryptedString::new( - &personal_id_number, - &recipients, - ).await?; - - let candidate = Self::find_or_create_candidate_with_personal_id( + + + let (candidate, enc_personal_id_number) = Self::find_or_create_candidate_with_personal_id( admin_private_key, db, personal_id_number, - &enc_personal_id_number, + &pubkey, ).await?; + let application = Mutation::create_application( db, @@ -74,8 +70,9 @@ impl ApplicationService { admin_private_key: &String, db: &DbConn, personal_id_number: String, - enc_personal_id_number: &EncryptedString, - ) -> Result { + pubkey: &String, + // enc_personal_id_number: &EncryptedString, + ) -> Result<(candidate::Model, String), ServiceError> { let candidates = Query::list_candidates_full(db).await?; let ids_decrypted = futures::future::join_all( candidates.iter().map(|c| async {( @@ -92,16 +89,44 @@ impl ApplicationService { .iter() .filter(|(_, id)| id == &personal_id_number) .collect(); - // TODO: take the candidate id directly from the iterator + + let mut recipients = get_recipients(db, pubkey).await?; + if found_ids.iter().any(|(_, personal_id)| personal_id == &personal_id_number) { let candidate = Query::find_candidate_by_id(db, found_ids[0].0) .await? .ok_or(ServiceError::CandidateNotFound)?; + + let mut linked_applications_pubkeys = Query::find_applications_by_candidate_id(db, candidate.id) + .await? + .iter() + .map(|a| a.public_key.to_owned()) + .collect(); + + recipients.append(&mut linked_applications_pubkeys); + + + let enc_personal_id_number = EncryptedString::new( + &personal_id_number, + &recipients, + ).await?; + let candidate = Mutation::update_personal_id(db, candidate, &enc_personal_id_number.to_owned().to_string()).await?; println!("Candidates linked!"); - Ok(candidate) + Ok( + (candidate, enc_personal_id_number.to_string()) + ) } else { - CandidateService::create(db, enc_personal_id_number.to_owned().to_string()).await + let enc_personal_id_number = EncryptedString::new( + &personal_id_number, + &recipients, + ).await?; + Ok( + ( + CandidateService::create(db, enc_personal_id_number.to_owned().to_string()).await?, + enc_personal_id_number.to_string(), + ) + ) } }