シンプルなタスク管理サービスの API です。ドメイン駆動設計とヘキサゴナルアーキテクチャをベースにしています。
- ユーザーの登録、参照、更新、削除
- ユーザーのタスクの登録、参照、更新、削除
- Java 21
- Gradle 8.x
# プロジェクトのビルド
./gradlew build
# テストの実行
./gradlew test
# カバレッジレポートの生成
./gradlew jacocoTestReport
# コードスタイルチェック
./gradlew ktlintCheck
# コード自動フォーマット
./gradlew ktlintFormat
# テスト + カバレッジ検証 + コード品質チェック
./gradlew check
# プロジェクトのクリーン
./gradlew cleanアプリケーション起動後(./gradlew bootRun)、以下のURLでアクセスできます:
- Swagger UI: http://localhost:8080/swagger-ui.html
- OpenAPI JSON: http://localhost:8080/api-docs
- H2 Console: http://localhost:8080/h2-console
- JDBC URL:
jdbc:h2:mem:taskdb - User Name:
sa - Password: (空白)
- JDBC URL:
GET /api/users- 全ユーザー取得GET /api/users/{id}- ユーザー詳細取得POST /api/users- ユーザー作成PUT /api/users/{id}- ユーザー更新DELETE /api/users/{id}- ユーザー削除
GET /api/tasks- 全タスク取得GET /api/tasks/{id}- タスク詳細取得POST /api/tasks- タスク作成PUT /api/tasks/{id}- タスク更新DELETE /api/tasks/{id}- タスク削除POST /api/tasks/{id}/complete- タスク完了POST /api/tasks/{id}/start- タスク開始POST /api/tasks/{id}/cancel- タスクキャンセルGET /api/tasks/user/{userId}- ユーザーのタスク取得(オプション:?status=NOT_STARTED|IN_PROGRESS|COMPLETED|CANCELLED)
- テストレポート:
build/reports/tests/test/index.html - カバレッジレポート:
build/reports/jacoco/test/html/index.html - Ktlintレポート:
build/reports/ktlint/
src/
└── main/
└── kotlin/
└── com/
└── example/
└── springdddexample/
├── domain/ # ドメイン層
│ ├── model/
│ │ ├── user/ # User集約
│ │ │ ├── User.kt # 集約ルート
│ │ │ ├── UserId.kt # 値オブジェクト(ULID)
│ │ │ ├── UserName.kt # 値オブジェクト
│ │ │ ├── Email.kt # 値オブジェクト
│ │ │ └── UserRepository.kt # リポジトリIF(ポート)
│ │ └── task/ # Task集約
│ │ ├── Task.kt # 集約ルート
│ │ ├── TaskId.kt # 値オブジェクト(ULID)
│ │ ├── TaskName.kt # 値オブジェクト
│ │ ├── TaskStatus.kt # 値オブジェクト(Enum)
│ │ └── TaskRepository.kt # リポジトリIF(ポート)
│ └── shared/ # 共有カーネル
│ └── DomainException.kt # ドメイン例外の基底クラス
├── application/ # アプリケーション層(ユースケース)
│ ├── service/
│ │ ├── user/
│ │ │ └── UserApplicationService.kt
│ │ └── task/
│ │ └── TaskApplicationService.kt
│ └── dto/
│ ├── user/
│ │ ├── CreateUserInput.kt
│ │ ├── UpdateUserInput.kt
│ │ └── UserOutput.kt
│ └── task/
│ ├── CreateTaskInput.kt
│ ├── UpdateTaskInput.kt
│ ├── CompleteTaskInput.kt
│ └── TaskOutput.kt
├── infrastructure/ # インフラストラクチャ層
│ └── persistence/
│ └── jpa/
│ ├── entity/ # JPAエンティティ
│ │ ├── user/
│ │ │ └── UserJpaEntity.kt
│ │ └── task/
│ │ └── TaskJpaEntity.kt
│ ├── repository/ # Spring Data JPA
│ │ ├── user/
│ │ │ └── UserJpaRepository.kt
│ │ └── task/
│ │ └── TaskJpaRepository.kt
│ ├── adapter/ # リポジトリアダプター
│ │ ├── user/
│ │ │ └── UserRepositoryAdapter.kt
│ │ └── task/
│ │ └── TaskRepositoryAdapter.kt
│ ├── mapper/ # ドメイン⇔JPA変換
│ │ ├── user/
│ │ │ └── UserMapper.kt
│ │ └── task/
│ │ └── TaskMapper.kt
│ └── config/
│ └── JpaConfig.kt
└── presentation/ # プレゼンテーション層
├── rest/
│ ├── user/
│ │ └── UserController.kt
│ └── task/
│ └── TaskController.kt
├── dto/
│ ├── user/
│ │ ├── CreateUserRequest.kt # toInput()拡張関数を含む
│ │ ├── UpdateUserRequest.kt # toInput()拡張関数を含む
│ │ └── UserResponse.kt # from()ファクトリ関数を含む
│ └── task/
│ ├── CreateTaskRequest.kt # toInput()拡張関数を含む
│ ├── UpdateTaskRequest.kt # toInput()拡張関数を含む
│ ├── TaskResponse.kt # from()ファクトリ関数を含む
│ └── TaskListResponse.kt # from()ファクトリ関数を含む
├── exception/
│ ├── GlobalExceptionHandler.kt
│ └── ErrorResponse.kt
└── config/
├── WebConfig.kt
└── OpenApiConfig.kt