User Management System について
FastAPI とクリーンアーキテクチャに基づく、CSV 保存のユーザー管理システムです。CRUD、まとめてのインポート、データ検証、年齢集計に対応します。
主な機能
- 01ユーザーの CRUD 操作
- 02CSV ファイルへの保存
- 03ユーザーデータの検証
- 04CSV からの一括インポート
- 05名前の頭文字別の平均年齢集計
活用シーン
- 01REST API によるユーザー管理
- 02CSV から複数ユーザーをインポート
- 03名前の頭文字別の平均年齢を確認
MCP 対応
README では MCP サーバーを使ってアップロードした練習プロジェクトと説明されていますが、MCP 機能の提供については記載されていません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
ユーザー管理システム
これは、FastAPI と Clean Architecture に基づいて設計されたユーザー管理システムです。データストレージとして CSV ファイルを使用し、基本的なユーザー管理機能を実装しています。
📝 このドキュメントは、プロジェクトの実際のアーキテクチャとコードを分析したうえで、Cursor AI の支援により作成されました。
プロジェクトアーキテクチャ
プロジェクトは Clean Architecture に基づいて設計されており、ディレクトリ構成は次のとおりです。
app/
├── api/ # API 層,處理 HTTP 請求
├── core/ # 核心配置和共用元件
├── domain/ # 領域模型和業務規則
├── infrastructure/ # 基礎設施實作(如 CSV 存儲)
├── interfaces/ # 介面定義
└── use_cases/ # 使用案例實作
tests/ # 測試目錄
├── conftest.py # Pytest 共用測試夾具
├── test_csv_parser.py # CSV 解析器測試
├── test_main.py # 主應用程式測試
├── test_user_repository.py# Repository 層測試
├── test_user_router.py # API 層測試
├── test_user_use_case.py # Use Case 層測試
└── __init__.py # Python 包標識檔
機能
- ユーザー管理の CRUD 操作
- CSV ファイルへのデータ保存
- ユーザーデータの検証
- ユーザーの一括インポート
- ユーザーの年齢統計分析
API エンドポイント
POST /create_user- 新しいユーザーを作成DELETE /delete_user- ユーザーを削除GET /get_added_user- 追加済みのユーザー一覧を取得POST /add_multiple_users_from_csv- CSV ファイルからユーザーを一括インポートGET /calc_average_age_of_user_grouped_by_first_char_of_name- 名前の先頭文字ごとにグループ化した平均年齢を計算
インストールとセットアップ
- 仮想環境を作成します。
python -m venv venv
source venv/bin/activate # Linux/Mac
# 或
.\venv\Scripts\activate # Windows
- 依存関係をインストールします。
pip install -r requirements.txt
- アプリケーションを実行します。
uvicorn app.main:app --reload
API ドキュメント
アプリケーションの起動後、以下のアドレスから Swagger UI ドキュメントにアクセスできます。
データ形式
ユーザーモデル
{
"Name": "string", // 使用者名稱(必填)
"Age": int // 使用者年齡(必填,非負數)
}
CSV ファイル形式
CSV ファイルには、以下の列が必要です。
Name:ユーザー名Age:ユーザーの年齢
データ検証ルール
- ユーザー名(Name):
- 空欄にできません
- 必須項目です
- ユーザーの年齢(Age):
- 0 以上の整数である必要があります
- 必須項目です
開発アーキテクチャ
プロジェクトは Clean Architecture の設計原則に基づいています。
-
ドメイン層:
- 中核となるビジネスエンティティとルールを定義します
- ユーザーモデルと検証ロジックを含みます
-
ユースケース層:
- ビジネスロジックを実装します
- ユーザー管理操作を処理します
-
インターフェース層:
- ストレージとデータ読み込みのインターフェースを定義します
- ビジネスロジックを実装の詳細から切り離します
-
インフラストラクチャ層:
- 具体的な実装を提供します
- CSV ファイルの操作ロジックを含みます
-
API 層:
- HTTP リクエストを処理します
- RESTful API エンドポイントを提供します
エラー処理
システムは統一されたエラー処理機構を採用しており、すべての例外は AppBaseException を継承します。エラーレスポンスには標準化された JSON 形式を使用します。
{
"detail": "ErrorType: 錯誤訊息",
"status_code": 422,
"exception_type": "ErrorType"
}
データ検証例外(HTTP 422)
-
Pydantic 検証エラー:
- ステータスコード:422
- 発生条件:リクエストデータがモデル定義に適合しない場合
- 例:
{ "detail": [ { "type": "int_parsing", "loc": ["body", "Age"], "msg": "Input should be a valid integer", "input": "invalid" } ] }
-
カスタム検証エラー:
-
EmptyUserNameError- ステータスコード:422
- メッセージ:"User name cannot be empty."
- 発生条件:ユーザー名が空文字列の場合
-
NegativeUserAgeError- ステータスコード:422
- メッセージ:"User age cannot be negative."
- 発生条件:ユーザーの年齢が負数の場合
-
中核となる例外
AppBaseException- ステータスコード:500
- 基本例外クラス
- 分類されていないシステムエラーの処理に使用します
ビジネスロジック例外(HTTP 404)
UserNotFoundError- ステータスコード:404
- メッセージ:"User not found."
- 発生条件:操作対象のユーザーが存在しない場合
データ処理例外(HTTP 400)
-
DataframeKeyException- ステータスコード:400
- メッセージ:動的に生成されます(例:"Field {field} not found")
- 発生条件:DataFrame の操作時に指定されたフィールドが見つからない場合
-
GroupbyKeyException- ステータスコード:400
- メッセージ:動的に生成されます(例:"Field {field} not found in GroupBy")
- 発生条件:グループ化の操作時に指定されたフィールドが見つからない場合
-
CSVParserException- ステータスコード:400
- メッセージ:動的に生成されます(例:"Missing required columns")
- 発生条件:CSV ファイルの形式または内容が要件を満たさない場合
技術スタック
- FastAPI:モダンで高速な Web フレームワーク
- Pydantic:データ検証とシリアライズ
- Pandas:CSV データ処理
- Cursor AI:ドキュメント生成とコード分析
Docker デプロイ
このプロジェクトは Docker に対応しており、コンテナ環境でアプリケーションを簡単に実行できます。
前提条件
- Docker をインストールします
Docker イメージのビルド
docker build -t user-management .
コンテナの実行
docker run -p 8000:8000 user-management
アプリケーションは http://localhost:8000 で実行されます。以下のアドレスからアクセスできます。
- Swagger UI:http://localhost:8000/docs
- ReDoc:http://localhost:8000/redoc
Docker 設定の説明
プロジェクトでは、以下の Docker 設定を使用しています。
-
ベースイメージ:
- ベースイメージとして
python:3.12-slimを使用します - イメージサイズを小さくするため、slim バージョンを選択します
- ベースイメージとして
-
ファイルの除外: 不要なファイルを
.dockerignoreで除外します。- Python のキャッシュファイル(
__pycache__/,*.pyc) - 環境関連(
venv/,.env) - テスト関連(
.pytest_cache/,.coverage,htmlcov/) - バージョン管理(
.git/,.gitignore) - ドキュメント(
README.md)
- Python のキャッシュファイル(
-
セキュリティ上の考慮事項:
- 公式の Python イメージを使用します
- 不要なパッケージのインストールを避けます
--no-cache-dirを使用してイメージサイズを小さくします
開発ツール
- Cursor IDE:AI 支援開発機能を統合
- Cursor AI:ドキュメントの生成とコード分析を支援
- Git:バージョン管理
- Python 3.12+:プログラミング言語環境
テスト
プロジェクトでは pytest を使用してテストを実施し、pytest-cov を使用してカバレッジレポートを生成します。
現在のテストカバレッジ
最新のカバレッジレポート(2025-04-10 生成)によると、プロジェクトは優れたテストカバレッジを達成しています。
- 全体のカバレッジ:100%
- テスト済みの文数:202
- 未カバーの文数:0
各模組覆蓋率詳情
| 模組 | 語句數 | 覆蓋率 |
|---|---|---|
| api/v1/user_router.py | 33 | 100% |
| core/exceptions.py | 6 | 100% |
| core/settings.py | 6 | 100% |
| domain/user/exceptions.py | 9 | 100% |
| domain/user/fields.py | 5 | 100% |
| domain/user/models/new_user.py | 2 | 100% |
| domain/user/models/user.py | 15 | 100% |
| infrastructure/repositories/exceptions.py | 11 | 100% |
| infrastructure/repositories/user_repository_csv.py | 40 | 100% |
| infrastructure/services/csv_user_parser.py | 19 | 100% |
| infrastructure/services/exceptions.py | 6 | 100% |
| interfaces/user_data_loader.py | 4 | 100% |
| interfaces/user_repository.py | 6 | 100% |
| main.py | 9 | 100% |
| use_cases/user/exceptions.py | 5 | 100% |
| use_cases/user/user_use_case.py | 26 | 100% |
這個完美的測試覆蓋率表明:
- 所有的程式碼路徑都經過測試
- 沒有未測試的功能點
- 測試案例完整且全面
執行測試
# 執行所有測試
pytest
# 執行測試並生成覆蓋率報告
pytest --cov=app --cov-report=html tests/
# 執行特定測試檔案
pytest tests/test_user_repository.py -v
# 執行並顯示詳細測試資訊
pytest -v
測試架構
-
基礎設施層測試:
test_csv_parser.py:測試 CSV 檔案解析邏輯test_user_repository.py:測試數據存取邏輯
-
API 層測試:
test_user_router.py:測試 API 端點test_main.py:測試應用程式配置
-
Use Case 層測試:
test_user_use_case.py:測試業務邏輯
測試最佳實踐
-
分層測試:
- 每個架構層都有對應的測試
- 確保各層級的獨立性和完整性
-
測試隔離:
- 使用 fixtures 確保測試獨立性
- Mock 外部依賴避免副作用
-
錯誤處理測試:
- 驗證各種錯誤情況
- 確保錯誤回應符合規範
-
資料驗證:
- 測試資料格式驗證
- 確保資料完整性和正確性
致謝
特別感謝 Cursor AI 協助生成本文檔,透過對專案結構和程式碼的智能分析,提供了清晰且結構化的文檔內容。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。