要件書: タスク共有 API
テクノロジ系 / L20 assignment-task-api — タスク共有 API 最終課題
要件書: タスク共有 API
1. システム概要
チームメンバーがタスクを共有・管理できる Web API を作る。
- タスクを登録・一覧・取得・更新・削除できる
- タスクには担当者 (assignee) を設定できる
- タスクの状態 (status) を管理できる
- 管理者だけがタスクを削除できる (認証)
2. データ仕様
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
| id | int | 自動 | タスクID (サーバが採番) |
| title | str | 必須 | タスク名 (1文字以上) |
| description | str | 省略可 | 詳細 (デフォルト空文字) |
| assignee | str | 省略可 | 担当者名 (デフォルト "unassigned") |
| status | str | 自動 | 状態。初期値 "todo"。"todo"/"in_progress"/"done" のいずれか |
| created_at | str | 自動 | 作成日時 (ISO形式、サーバが付与) |
3. エンドポイント一覧
| メソッド | パス | 説明 | 認証 |
|---|---|---|---|
| GET | /tasks | タスク一覧 | 不要 |
| POST | /tasks | 新規タスク登録 | 不要 |
| GET | /tasks/{id} | タスク1件取得 | 不要 |
| PATCH | /tasks/{id} | タスク更新 (部分更新) | 不要 |
| DELETE | /tasks/{id} | タスク削除 | 必要 |
4. 詳細仕様
GET /tasks — 一覧取得
クエリパラメータで絞り込み可能:
?status=todo/?status=in_progress/?status=done?assignee=山田太郎
複数同時指定も可: ?status=todo&assignee=山田太郎
レスポンス (200 OK): タスクの配列。
POST /tasks — 新規登録
リクエストボディ:
{
"title": "FastAPI を学ぶ",
"description": "TDD の章まで読む",
"assignee": "山田太郎"
}レスポンス (201 Created):
{
"id": 1,
"title": "FastAPI を学ぶ",
"description": "TDD の章まで読む",
"assignee": "山田太郎",
"status": "todo",
"created_at": "2026-06-10T10:00:00"
}GET /tasks/{id} — 1件取得
レスポンス (200 OK): タスクオブジェクト。
該当なし: 404 {"detail": "task not found"}
PATCH /tasks/{id} — 部分更新
送ったフィールドだけ更新する。送らなかったフィールドは変わらない。
更新できるフィールド: title / description / assignee / status
status に指定できる値: "todo" / "in_progress" / "done"
それ以外の値: 422 を返す。
レスポンス (200 OK): 更新後のタスク。
該当なし: 404。
DELETE /tasks/{id} — 削除 (要認証)
リクエストヘッダ: X-API-Key: admin-key-456
レスポンス (204 No Content): 削除成功。
該当なし: 404。
認証なし/不正: 401。
5. エラー仕様
| 状況 | ステータス | 返すもの |
|---|---|---|
| 必須項目が無い | 422 | バリデーションエラー |
| 存在しないIDを操作 | 404 | {"detail": "task not found"} |
| status に不正な値 | 422 | バリデーションエラー |
| 認証キーが無い/間違い | 401 | {"detail": "invalid api key"} |
6. 実装の手引き
推奨ライブラリ
pip install fastapi uvicorn httpx pytest
データの保存
今回はインメモリ (Python リスト) で構いません。
再起動するとデータは消えますが、それで OK です。
テストの書き方 (任意)
from fastapi.testclient import TestClient
from main import app
client = TestClient(app)
def test_post_task():
res = client.post("/tasks", json={"title": "テスト"})
assert res.status_code == 201起動方法
uvicorn main:app --reload
http://localhost:8000/docs で動作確認できます。
7. 提出物
main.py(実装コード)test_main.py(テストコード、任意だが加点対象)
力試ししたい方は クイズ形式の演習(任意) もあります。読むだけでも十分です。