From 530994f33dc414928224c8ee6925d189d7778b54 Mon Sep 17 00:00:00 2001 From: EETagent Date: Wed, 16 Nov 2022 16:21:03 +0100 Subject: [PATCH] feat: load cache into memory before deleting --- api/src/routes/candidate.rs | 8 ++--- core/src/services/candidate_service.rs | 42 ++++++++++++++++++++------ 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/api/src/routes/candidate.rs b/api/src/routes/candidate.rs index 1a3e39c..040433d 100644 --- a/api/src/routes/candidate.rs +++ b/api/src/routes/candidate.rs @@ -202,9 +202,7 @@ pub async fn submit_portfolio( } #[get("/is_prepared")] -pub async fn is_portfolio_prepared( - session: CandidateAuth, -) -> Result> { +pub async fn is_portfolio_prepared(session: CandidateAuth) -> Result> { let candidate: entity::candidate::Model = session.into(); let is_ok = CandidateService::is_portfolio_prepared(candidate.application).await; @@ -221,9 +219,7 @@ pub async fn is_portfolio_prepared( } #[get("/is_submitted")] -pub async fn is_portfolio_submitted( - session: CandidateAuth, -) -> Result> { +pub async fn is_portfolio_submitted(session: CandidateAuth) -> Result> { let candidate: entity::candidate::Model = session.into(); let is_ok = CandidateService::is_portfolio_submitted(candidate.application).await; diff --git a/core/src/services/candidate_service.rs b/core/src/services/candidate_service.rs index d031538..b44509d 100644 --- a/core/src/services/candidate_service.rs +++ b/core/src/services/candidate_service.rs @@ -103,7 +103,10 @@ impl CandidateService { Ok(()) } - pub async fn add_cover_letter_to_cache(candidate_id: i32, letter: Vec) -> Result<(), ServiceError> { + pub async fn add_cover_letter_to_cache( + candidate_id: i32, + letter: Vec, + ) -> Result<(), ServiceError> { Self::write_portfolio_file(candidate_id, letter, "MOTIVACNI_DOPIS.pdf").await } @@ -114,7 +117,10 @@ impl CandidateService { Self::write_portfolio_file(candidate_id, letter, "PORTFOLIO.pdf").await } - pub async fn add_portfolio_zip_to_cache(candidate_id: i32, zip: Vec) -> Result<(), ServiceError> { + pub async fn add_portfolio_zip_to_cache( + candidate_id: i32, + zip: Vec, + ) -> Result<(), ServiceError> { Self::write_portfolio_file(candidate_id, zip, "PORTFOLIO.zip").await } @@ -132,6 +138,14 @@ impl CandidateService { .is_ok() } + pub async fn delete_cache(candidate_id: i32) -> Result<(), ServiceError> { + let cache_path = Path::new(&candidate_id.to_string()).join("cache"); + + tokio::fs::remove_dir_all(cache_path).await?; + + Ok(()) + } + pub async fn add_portfolio(candidate_id: i32, db: &DbConn) -> Result<(), ServiceError> { let path = Path::new(&candidate_id.to_string()).to_path_buf(); let cache_path = path.join("cache"); @@ -144,17 +158,27 @@ impl CandidateService { let mut writer = async_zip::write::ZipFileWriter::new(&mut archive); - for entry in vec!["MOTIVACNI_DOPIS.pdf", "PORTFOLIO.pdf", "PORTFOLIO.zip"] { - let mut entry_file = tokio::fs::File::open(cache_path.join(entry)).await?; + let mut buffer = vec![vec![], vec![], vec![]]; - let mut contents_buffer = vec![]; + let filenames = vec!["MOTIVACNI_DOPIS.pdf", "PORTFOLIO.pdf", "PORTFOLIO.zip"]; - entry_file.read_to_end(&mut contents_buffer).await?; + for (index, entry) in buffer.iter_mut().enumerate() { + let filename = filenames[index]; + let mut entry_file = tokio::fs::File::open(cache_path.join(filename)).await?; - let builder = - async_zip::ZipEntryBuilder::new(entry.to_string(), async_zip::Compression::Deflate); + entry_file.read_to_end(entry).await?; + } - writer.write_entry_whole(builder, &contents_buffer).await?; + Self::delete_cache(candidate_id).await?; + + for (index, entry) in buffer.iter_mut().enumerate() { + let filename = filenames[index]; + let builder = async_zip::ZipEntryBuilder::new( + filename.to_string(), + async_zip::Compression::Deflate, + ); + + writer.write_entry_whole(builder, &entry).await?; } writer.close().await?;