lab_resource_manager/application/usecases/
mod.rs

1//! # Use Cases(ユースケース)
2//!
3//! ## Use Caseとは
4//!
5//! Use Caseは、**1つのユーザーゴールを達成するためのビジネスフロー**を表現します。
6//! エンティティやドメインサービスを組み合わせ(オーケストレート)、アプリケーション固有の処理を実現します。
7//!
8//! ## Use Caseの責務
9//!
10//! ### ✅ Use Caseが行うこと
11//! - ポート(トレイト)を経由した外部システムとの通信
12//! - ドメインエンティティ・サービスの呼び出しと調整
13//! - トランザクション境界の定義
14//! - アプリケーション固有のビジネスフローの実装
15//!
16//! ### ❌ Use Caseが行わないこと
17//! - ドメインロジック(ビジネスルール)の実装
18//!   → Domain層のエンティティ・値オブジェクト・ドメインサービスが担当
19//! - 技術的詳細の実装
20//!   → Infrastructure層のアダプターが担当
21//!
22//! ## 設計原則
23//!
24//! ### 1. Single Responsibility Principle (SRP)
25//! 各Use Caseは**1つの変更理由**のみを持つ。
26//! - `WatchCalendarChangesUseCase`: カレンダー監視のビジネスフローが変わる
27//! - `CreateUsageUseCase`: 使用予定作成のビジネスフローが変わる
28//!
29//! ### 2. Dependency Inversion Principle (DIP)
30//! Use Caseは抽象(ポート)に依存し、具象には依存しない。
31//! ```rust,ignore
32//! pub struct SomeUseCase<R, N>
33//! where
34//!     R: ResourceUsageRepository,  // trait(抽象)に依存
35//!     N: Notifier,                 // trait(抽象)に依存
36//! ```
37//!
38//! ### 3. Interface Segregation Principle (ISP)
39//! Use Caseは必要最小限のポートにのみ依存する。
40//!
41//! ### 4. Thin Application Layer
42//! Application層は薄く保ち、ドメインロジックをDomain層に配置する。
43pub mod grant_user_resource_access;
44pub mod notify_resource_usage_changes;
45
46pub use grant_user_resource_access::GrantUserResourceAccessUseCase;
47pub use notify_resource_usage_changes::NotifyResourceUsageChangesUseCase;