lab_resource_manager/application/usecases/
delete_resource_usage.rs1use crate::application::error::ApplicationError;
2use crate::domain::aggregates::resource_usage::value_objects::UsageId;
3use crate::domain::common::EmailAddress;
4use crate::domain::ports::repositories::{RepositoryError, ResourceUsageRepository};
5use crate::domain::services::{AuthorizationPolicy, ResourceUsageAuthorizationPolicy};
6use std::sync::Arc;
7
8pub struct DeleteResourceUsageUseCase<R: ResourceUsageRepository> {
10 repository: Arc<R>,
11 authorization_policy: ResourceUsageAuthorizationPolicy,
12}
13
14impl<R: ResourceUsageRepository> DeleteResourceUsageUseCase<R> {
15 pub fn new(repository: Arc<R>) -> Self {
20 let authorization_policy = ResourceUsageAuthorizationPolicy::new();
21 Self {
22 repository,
23 authorization_policy,
24 }
25 }
26
27 pub async fn execute(
41 &self,
42 id: &UsageId,
43 owner_email: &EmailAddress,
44 ) -> Result<(), ApplicationError> {
45 let usage = self
47 .repository
48 .find_by_id(id)
49 .await?
50 .ok_or(ApplicationError::Repository(RepositoryError::NotFound))?;
51
52 self.authorization_policy
54 .authorize_delete(owner_email, &usage)
55 .map_err(|e| ApplicationError::Unauthorized(e.to_string()))?;
56
57 self.repository.delete(id).await?;
59
60 Ok(())
61 }
62}