verify that arrivaldate > departuredate
This commit is contained in:
@ -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!();
|
||||
|
Reference in New Issue
Block a user