use std::collections::HashSet; use std::sync::Arc; use uuid::Uuid; use crate::dto::{SetDeliveryOrderRequest, SetDeliveryOrderResponse}; use crate::error::ApplicationError; use crate::ports::TourRepository; /// Schreibt die Sortier-Reihenfolge aller Lieferungen einer Tour neu. /// /// Eingabe-Validierung (vor DB-Aufruf): /// * mindestens eine Id /// * keine Duplikate /// /// Die Mengen-Übereinstimmung mit der Tour wird in der Persistence /// geprüft (braucht DB-Kontext). pub struct SetDeliveryOrderUseCase { repository: Arc, } impl SetDeliveryOrderUseCase { pub fn new(repository: Arc) -> Self { Self { repository } } pub async fn execute( &self, tour_id: Uuid, request: SetDeliveryOrderRequest, ) -> Result { if request.delivery_ids.is_empty() { return Err(ApplicationError::Validation( "delivery_ids darf nicht leer sein".into(), )); } let mut seen = HashSet::with_capacity(request.delivery_ids.len()); for id in &request.delivery_ids { if !seen.insert(*id) { return Err(ApplicationError::Validation(format!( "delivery_id {id} kommt mehrfach vor" ))); } } let order = self .repository .set_delivery_order(tour_id, &request.delivery_ids) .await?; Ok(SetDeliveryOrderResponse { tour_id, order }) } }