use crate::application::error::ApplicationError;
use crate::domain::aggregates::resource_usage::value_objects::UsageId;
use crate::domain::common::EmailAddress;
use crate::domain::ports::repositories::{RepositoryError, ResourceUsageRepository};
use crate::domain::services::{AuthorizationPolicy, ResourceUsageAuthorizationPolicy};
use std::sync::Arc;
pub struct DeleteResourceUsageUseCase<R: ResourceUsageRepository> {
repository: Arc<R>,
authorization_policy: ResourceUsageAuthorizationPolicy,
}
impl<R: ResourceUsageRepository> DeleteResourceUsageUseCase<R> {
pub fn new(repository: Arc<R>) -> Self {
let authorization_policy = ResourceUsageAuthorizationPolicy::new();
Self {
repository,
authorization_policy,
}
}
pub async fn execute(
&self,
id: &UsageId,
owner_email: &EmailAddress,
) -> Result<(), ApplicationError> {
let usage = self
.repository
.find_by_id(id)
.await?
.ok_or(ApplicationError::Repository(RepositoryError::NotFound))?;
self.authorization_policy
.authorize_delete(owner_email, &usage)
.map_err(|e| ApplicationError::Unauthorized(e.to_string()))?;
self.repository.delete(id).await?;
Ok(())
}
}