diff --git a/moneymgr_backend/src/services/movements_service.rs b/moneymgr_backend/src/services/movements_service.rs index f24d940..f7c678d 100644 --- a/moneymgr_backend/src/services/movements_service.rs +++ b/moneymgr_backend/src/services/movements_service.rs @@ -44,7 +44,15 @@ impl UpdateMovementQuery { } } - // TODO : check for conflict + // Check for conflict with other movements + if let Ok(_) = + get_by_account_label_amount_time(self.account_id, &self.label, self.amount, self.time) + .await + { + return Ok(Some( + "A movement taken at the same time with the same label and the same amount already exists!", + )); + } Ok(None) } @@ -87,3 +95,28 @@ pub async fn update(id: MovementID, q: &UpdateMovementQuery) -> anyhow::Result<( Ok(()) } + +/// Get a single movement by its id +pub async fn get_by_id(movement_id: MovementID) -> anyhow::Result { + Ok(movements::table + .filter(movements::dsl::id.eq(movement_id.0)) + .get_result(&mut db()?)?) +} + +/// Get a single movement by account_id, label, amount and time +pub async fn get_by_account_label_amount_time( + account_id: AccountID, + label: &str, + amount: f32, + time: u64, +) -> anyhow::Result { + Ok(movements::table + .filter( + movements::dsl::account_id + .eq(account_id.0) + .and(movements::dsl::label.eq(label)) + .and(movements::dsl::amount.eq(amount)) + .and(movements::dsl::time.eq(time as i64)), + ) + .get_result(&mut db()?)?) +}