lab_resource_manager/application/usecases/
delete_resource_usage.rs

1use 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
8/// リソース使用予定を削除するユースケース
9pub struct DeleteResourceUsageUseCase<R: ResourceUsageRepository> {
10    repository: Arc<R>,
11    authorization_policy: ResourceUsageAuthorizationPolicy,
12}
13
14impl<R: ResourceUsageRepository> DeleteResourceUsageUseCase<R> {
15    /// 新しいDeleteResourceUsageUseCaseインスタンスを作成
16    ///
17    /// # Arguments
18    /// * `repository` - ResourceUsageリポジトリ
19    pub fn new(repository: Arc<R>) -> Self {
20        let authorization_policy = ResourceUsageAuthorizationPolicy::new();
21        Self {
22            repository,
23            authorization_policy,
24        }
25    }
26
27    /// リソース使用予定を削除
28    ///
29    /// # Arguments
30    /// * `id` - 使用予定ID
31    /// * `owner_email` - 所有者のメールアドレス(権限チェック用)
32    ///
33    /// # Returns
34    /// 削除成功
35    ///
36    /// # Errors
37    /// - 指定されたIDの予約が見つからない場合
38    /// - 所有者が一致しない場合
39    /// - リポジトリエラー
40    pub async fn execute(
41        &self,
42        id: &UsageId,
43        owner_email: &EmailAddress,
44    ) -> Result<(), ApplicationError> {
45        // 既存の予約を取得
46        let usage = self
47            .repository
48            .find_by_id(id)
49            .await?
50            .ok_or(ApplicationError::Repository(RepositoryError::NotFound))?;
51
52        // 認可チェック
53        self.authorization_policy
54            .authorize_delete(owner_email, &usage)
55            .map_err(|e| ApplicationError::Unauthorized(e.to_string()))?;
56
57        // 削除
58        self.repository.delete(id).await?;
59
60        Ok(())
61    }
62}