verify that arrivaldate > departuredate

This commit is contained in:
2023-09-24 09:48:01 +02:00
parent e849b6f5f9
commit fd4d097d72
3 changed files with 44 additions and 3 deletions

View File

@ -65,6 +65,7 @@ pub enum LogbookUpdateError {
NotYourEntry,
TooManyRowers(usize, usize),
RowerCreateError(i64, String),
ArrivalNotAfterDeparture,
}
#[derive(Debug, PartialEq)]
@ -77,6 +78,7 @@ pub enum LogbookCreateError {
RowerAlreadyOnWater(User),
RowerCreateError(i64, String),
SamePersonShipmasterAndRower,
ArrivalNotAfterDeparture,
}
impl Logbook {
@ -181,6 +183,7 @@ ORDER BY departure DESC
if boat.on_water(db).await {
return Err(LogbookCreateError::BoatAlreadyOnWater);
}
if (User::find_by_id(db, log.shipmaster as i32).await.unwrap())
.on_water(db)
.await
@ -188,6 +191,14 @@ ORDER BY departure DESC
return Err(LogbookCreateError::ShipmasterAlreadyOnWater);
}
if let Some(arrival) = &log.arrival {
let dep = NaiveDateTime::parse_from_str(&log.departure, "%Y-%m-%d %H:%M").unwrap();
let arr = NaiveDateTime::parse_from_str(&arrival, "%Y-%m-%d %H:%M").unwrap();
if arr <= dep {
return Err(LogbookCreateError::ArrivalNotAfterDeparture);
}
}
if log.rowers.len() > boat.amount_seats as usize - 1 {
return Err(LogbookCreateError::TooManyRowers(
boat.amount_seats as usize,
@ -284,6 +295,10 @@ ORDER BY departure DESC
}
let arrival = format!("{}", chrono::offset::Local::now().format("%Y-%m-%d %H:%M"));
let chrono_arrival = NaiveDateTime::parse_from_str(&arrival, "%Y-%m-%d %H:%M").unwrap();
if chrono_arrival <= self.departure {
return Err(LogbookUpdateError::ArrivalNotAfterDeparture);
}
let mut tx = db.begin().await.unwrap();
@ -468,6 +483,30 @@ mod test {
assert_eq!(res, Err(LogbookCreateError::BoatAlreadyOnWater));
}
#[sqlx::test]
fn test_create_boat_on_water_wrong_arrival() {
let pool = testdb!();
let res = Logbook::create(
&pool,
LogToAdd {
boat_id: 3,
shipmaster: 5,
shipmaster_only_steering: false,
departure: "2128-05-20 12:00".into(),
arrival: Some("2128-05-20 11:00".into()),
destination: None,
distance_in_km: None,
comments: None,
logtype: None,
rowers: Vec::new(),
},
)
.await;
assert_eq!(res, Err(LogbookCreateError::ArrivalNotAfterDeparture));
}
#[sqlx::test]
fn test_create_shipmaster_on_water() {
let pool = testdb!();