feat: limit application count to 2 per candidate

This commit is contained in:
Sebastian Pravda 2023-01-14 22:37:07 +01:00
parent eaddeaedd4
commit b0dd796dfe
No known key found for this signature in database
GPG key ID: F3BC84F08EFA3F57
3 changed files with 16 additions and 15 deletions

View file

@ -20,6 +20,8 @@ pub enum ServiceError {
CandidateNotFound, CandidateNotFound,
#[error("Resource is locked")] #[error("Resource is locked")]
Locked, Locked,
#[error("Too many applications")]
TooManyApplications,
#[error("Parrent not found")] #[error("Parrent not found")]
ParentNotFound, ParentNotFound,
#[error("Database error")] #[error("Database error")]
@ -82,6 +84,7 @@ impl ServiceError {
ServiceError::IncompletePortfolio => 406, ServiceError::IncompletePortfolio => 406,
ServiceError::UserAlreadyExists => 409, ServiceError::UserAlreadyExists => 409,
ServiceError::Locked => 423, ServiceError::Locked => 423,
ServiceError::TooManyApplications => 409,
// 500 // 500
ServiceError::ParentNotFound => 500, ServiceError::ParentNotFound => 500,
ServiceError::DbError(_) => 500, ServiceError::DbError(_) => 500,

View file

@ -97,12 +97,16 @@ impl ApplicationService {
.await? .await?
.ok_or(ServiceError::CandidateNotFound)?; .ok_or(ServiceError::CandidateNotFound)?;
let mut linked_applications_pubkeys = Query::find_applications_by_candidate_id(db, candidate.id) let mut linked_applications_pubkeys: Vec<String> = Query::find_applications_by_candidate_id(db, candidate.id)
.await? .await?
.iter() .iter()
.map(|a| a.public_key.to_owned()) .map(|a| a.public_key.to_owned())
.collect(); .collect();
if linked_applications_pubkeys.len() > 1 {
return Err(ServiceError::TooManyApplications);
}
recipients.append(&mut linked_applications_pubkeys); recipients.append(&mut linked_applications_pubkeys);

View file

@ -8,7 +8,7 @@ use tokio::io::{AsyncReadExt, AsyncWriteExt};
use crate::{error::ServiceError, Query, crypto}; use crate::{error::ServiceError, Query, crypto};
#[derive(Debug)] #[derive(Debug, PartialEq)]
pub enum SubmissionProgress { pub enum SubmissionProgress {
NoneInCache, NoneInCache,
SomeInCache(Vec<FileType>), SomeInCache(Vec<FileType>),
@ -50,7 +50,7 @@ impl Serialize for SubmissionProgress {
} }
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, PartialEq, Clone)]
pub enum FileType { pub enum FileType {
CoverLetterPdf = 1, CoverLetterPdf = 1,
PortfolioLetterPdf = 2, PortfolioLetterPdf = 2,
@ -216,17 +216,7 @@ impl PortfolioService {
/// Returns true if portfolio is ready to be moved to the final directory /// Returns true if portfolio is ready to be moved to the final directory
async fn is_portfolio_prepared(candidate_id: i32) -> bool { async fn is_portfolio_prepared(candidate_id: i32) -> bool {
let cache_path = Self::get_file_store_path().join(&candidate_id.to_string()).join("cache"); Self::get_submission_progress(candidate_id).await.ok() == Some(SubmissionProgress::AllInCache)
let filenames = vec![FileType::CoverLetterPdf, FileType::PortfolioLetterPdf, FileType::PortfolioZip];
for filename in filenames {
if !tokio::fs::metadata(
cache_path.join(filename.as_str())
).await.is_ok() {
return false;
}
}
true
} }
// Delete single item from cache // Delete single item from cache
@ -306,10 +296,14 @@ impl PortfolioService {
writer.close().await?; writer.close().await?;
archive.shutdown().await?; archive.shutdown().await?;
let applications_pubkeys: Vec<String> = Query::find_applications_by_candidate_id(db, candidate_id)
.await?.iter().map(|a| a.public_key.to_owned()).collect();
let admin_public_keys = Query::get_all_admin_public_keys(db).await?; let admin_public_keys = Query::get_all_admin_public_keys(db).await?;
let mut admin_public_keys_refrence: Vec<&str> = admin_public_keys.iter().map(|s| &**s).collect(); let mut admin_public_keys_refrence: Vec<&str> = admin_public_keys.iter().map(|s| &**s).collect();
let mut recipients = vec![&**public_key];
let mut recipients = vec![];
recipients.append(&mut admin_public_keys_refrence); recipients.append(&mut admin_public_keys_refrence);
recipients.append(&mut applications_pubkeys.iter().map(|s| &**s).collect());
let final_path = path.join(FileType::PortfolioZip.as_str()); let final_path = path.join(FileType::PortfolioZip.as_str());