use crate::domain::aggregates::resource_usage::value_objects::{Resource, TimePeriod, UsageId};
use crate::domain::ports::repositories::ResourceUsageRepository;
use crate::domain::services::resource_usage::errors::{ConflictCheckError, ResourceConflictError};
#[derive(Debug, Clone, Default)]
pub struct ResourceConflictChecker;
impl ResourceConflictChecker {
pub fn new() -> Self {
Self
}
pub async fn check_conflicts<R: ResourceUsageRepository>(
&self,
repository: &R,
time_period: &TimePeriod,
resources: &[Resource],
exclude_usage_id: Option<&UsageId>,
) -> Result<(), ConflictCheckError> {
let overlapping = repository.find_overlapping(time_period).await?;
for new_resource in resources {
for existing_usage in &overlapping {
if let Some(exclude_id) = exclude_usage_id
&& existing_usage.id() == exclude_id
{
continue;
}
for existing_resource in existing_usage.resources() {
if new_resource.conflicts_with(existing_resource) {
return Err(ConflictCheckError::Conflict(ResourceConflictError::new(
new_resource.to_string(),
existing_usage.id().clone(),
)));
}
}
}
}
Ok(())
}
}