Files
Super-HomeworkManager/docs/API.md
2026-01-05 11:27:37 +09:00

509 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Super Homework Manager API ドキュメント
## 概要
Super Homework Manager REST APIは、課題管理機能をプログラムから利用するためのAPIです。
- **ベースURL**: `/api/v1`
- **認証方式**: APIキー認証
- **レスポンス形式**: JSON
---
## 認証
すべてのAPIエンドポイントはAPIキー認証が必要です。
### APIキーの取得
1. 管理者アカウントでログイン
2. 管理画面 → APIキー管理へ移動
3. 新規APIキーを発行
### 認証ヘッダー
```
X-API-Key: hm_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```
### 認証エラー
| ステータスコード | レスポンス |
|------------------|------------|
| 401 Unauthorized | `{"error": "API key required"}` |
| 401 Unauthorized | `{"error": "Invalid API key"}` |
---
## エンドポイント一覧
| メソッド | パス | 説明 |
|----------|------|------|
| GET | `/api/v1/assignments` | 課題一覧取得 |
| GET | `/api/v1/assignments/:id` | 課題詳細取得 |
| POST | `/api/v1/assignments` | 課題作成 |
| PUT | `/api/v1/assignments/:id` | 課題更新 |
| DELETE | `/api/v1/assignments/:id` | 課題削除 |
| PATCH | `/api/v1/assignments/:id/toggle` | 完了状態トグル |
| GET | `/api/v1/statistics` | 統計情報取得 |
---
## 課題一覧取得
```
GET /api/v1/assignments
```
### クエリパラメータ
| パラメータ | 型 | 説明 |
|------------|------|------|
| `filter` | string | フィルタ: `pending`, `completed`, `overdue` (省略時: 全件) |
### レスポンス
**200 OK**
```json
{
"assignments": [
{
"id": 1,
"user_id": 1,
"title": "数学レポート",
"description": "第5章の練習問題",
"subject": "数学",
"due_date": "2025-01-15T23:59:00+09:00",
"is_completed": false,
"created_at": "2025-01-10T10:00:00+09:00",
"updated_at": "2025-01-10T10:00:00+09:00"
}
],
"count": 1
}
```
### 例
```bash
# 全件取得
curl -H "X-API-Key: hm_xxx" http://localhost:8080/api/v1/assignments
# 未完了のみ取得
curl -H "X-API-Key: hm_xxx" http://localhost:8080/api/v1/assignments?filter=pending
# 期限切れのみ取得
curl -H "X-API-Key: hm_xxx" http://localhost:8080/api/v1/assignments?filter=overdue
```
---
## 課題詳細取得
```
GET /api/v1/assignments/:id
```
### パスパラメータ
| パラメータ | 型 | 説明 |
|------------|------|------|
| `id` | integer | 課題ID |
### レスポンス
**200 OK**
```json
{
"id": 1,
"user_id": 1,
"title": "数学レポート",
"description": "第5章の練習問題",
"subject": "数学",
"due_date": "2025-01-15T23:59:00+09:00",
"is_completed": false,
"created_at": "2025-01-10T10:00:00+09:00",
"updated_at": "2025-01-10T10:00:00+09:00"
}
```
**404 Not Found**
```json
{
"error": "Assignment not found"
}
```
### 例
```bash
curl -H "X-API-Key: hm_xxx" http://localhost:8080/api/v1/assignments/1
```
---
## 課題作成
```
POST /api/v1/assignments
```
### リクエストボディ
| フィールド | 型 | 必須 | 説明 |
|------------|------|------|------|
| `title` | string | ✅ | 課題タイトル |
| `description` | string | | 説明 |
| `subject` | string | | 教科・科目 |
| `due_date` | string | ✅ | 提出期限RFC3339 または `YYYY-MM-DDTHH:MM` または `YYYY-MM-DD` |
### リクエスト例
```json
{
"title": "英語エッセイ",
"description": "テーマ自由、1000語以上",
"subject": "英語",
"due_date": "2025-01-20T17:00"
}
```
### レスポンス
**201 Created**
```json
{
"id": 2,
"user_id": 1,
"title": "英語エッセイ",
"description": "テーマ自由、1000語以上",
"subject": "英語",
"due_date": "2025-01-20T17:00:00+09:00",
"is_completed": false,
"created_at": "2025-01-10T11:00:00+09:00",
"updated_at": "2025-01-10T11:00:00+09:00"
}
```
**400 Bad Request**
```json
{
"error": "Invalid input: title and due_date are required"
}
```
### 例
```bash
curl -X POST \
-H "X-API-Key: hm_xxx" \
-H "Content-Type: application/json" \
-d '{"title":"英語エッセイ","due_date":"2025-01-20"}' \
http://localhost:8080/api/v1/assignments
```
---
## 課題更新
```
PUT /api/v1/assignments/:id
```
### パスパラメータ
| パラメータ | 型 | 説明 |
|------------|------|------|
| `id` | integer | 課題ID |
### リクエストボディ
すべてのフィールドはオプションです。省略されたフィールドは既存の値を維持します。
| フィールド | 型 | 説明 |
|------------|------|------|
| `title` | string | 課題タイトル |
| `description` | string | 説明 |
| `subject` | string | 教科・科目 |
| `due_date` | string | 提出期限 |
### リクエスト例
```json
{
"title": "英語エッセイ(修正版)",
"due_date": "2025-01-25T17:00"
}
```
### レスポンス
**200 OK**
```json
{
"id": 2,
"user_id": 1,
"title": "英語エッセイ(修正版)",
"description": "テーマ自由、1000語以上",
"subject": "英語",
"due_date": "2025-01-25T17:00:00+09:00",
"is_completed": false,
"created_at": "2025-01-10T11:00:00+09:00",
"updated_at": "2025-01-10T12:00:00+09:00"
}
```
**404 Not Found**
```json
{
"error": "Assignment not found"
}
```
### 例
```bash
curl -X PUT \
-H "X-API-Key: hm_xxx" \
-H "Content-Type: application/json" \
-d '{"title":"更新されたタイトル"}' \
http://localhost:8080/api/v1/assignments/2
```
---
## 課題削除
```
DELETE /api/v1/assignments/:id
```
### パスパラメータ
| パラメータ | 型 | 説明 |
|------------|------|------|
| `id` | integer | 課題ID |
### レスポンス
**200 OK**
```json
{
"message": "Assignment deleted"
}
```
**404 Not Found**
```json
{
"error": "Assignment not found"
}
```
### 例
```bash
curl -X DELETE \
-H "X-API-Key: hm_xxx" \
http://localhost:8080/api/v1/assignments/2
```
---
## 完了状態トグル
課題の完了状態を切り替えます(未完了 ↔ 完了)。
```
PATCH /api/v1/assignments/:id/toggle
```
### パスパラメータ
| パラメータ | 型 | 説明 |
|------------|------|------|
| `id` | integer | 課題ID |
### レスポンス
**200 OK**
```json
{
"id": 1,
"user_id": 1,
"title": "数学レポート",
"description": "第5章の練習問題",
"subject": "数学",
"due_date": "2025-01-15T23:59:00+09:00",
"is_completed": true,
"completed_at": "2025-01-12T14:30:00+09:00",
"created_at": "2025-01-10T10:00:00+09:00",
"updated_at": "2025-01-12T14:30:00+09:00"
}
```
**404 Not Found**
```json
{
"error": "Assignment not found"
}
```
### 例
```bash
curl -X PATCH \
-H "X-API-Key: hm_xxx" \
http://localhost:8080/api/v1/assignments/1/toggle
```
---
## 統計情報取得
ユーザーの課題統計を取得します。科目、日付範囲でフィルタリング可能です。
```
GET /api/v1/statistics
```
### クエリパラメータ
| パラメータ | 型 | 説明 |
|------------|------|------|
| `subject` | string | 科目で絞り込み(省略時: 全科目) |
| `from` | string | 課題登録日の開始日YYYY-MM-DD形式 |
| `to` | string | 課題登録日の終了日YYYY-MM-DD形式 |
### レスポンス
**200 OK**
```json
{
"total_assignments": 45,
"completed_assignments": 30,
"pending_assignments": 12,
"overdue_assignments": 3,
"on_time_completion_rate": 86.7,
"filter": {
"subject": null,
"from": "2025-01-01",
"to": "2025-12-31"
},
"subjects": [
{
"subject": "数学",
"total": 15,
"completed": 12,
"pending": 2,
"overdue": 1,
"on_time_completion_rate": 91.7
},
{
"subject": "英語",
"total": 10,
"completed": 8,
"pending": 2,
"overdue": 0,
"on_time_completion_rate": 87.5
}
]
}
```
### 科目別統計 (特定科目のみ)
```json
{
"total_assignments": 15,
"completed_assignments": 12,
"pending_assignments": 2,
"overdue_assignments": 1,
"on_time_completion_rate": 91.7,
"filter": {
"subject": "数学",
"from": null,
"to": null
}
}
```
### 例
```bash
# 全体統計
curl -H "X-API-Key: hm_xxx" http://localhost:8080/api/v1/statistics
# 科目で絞り込み
curl -H "X-API-Key: hm_xxx" "http://localhost:8080/api/v1/statistics?subject=数学"
# 日付範囲で絞り込み
curl -H "X-API-Key: hm_xxx" "http://localhost:8080/api/v1/statistics?from=2025-01-01&to=2025-03-31"
# 科目と日付範囲の組み合わせ
curl -H "X-API-Key: hm_xxx" "http://localhost:8080/api/v1/statistics?subject=数学&from=2025-01-01&to=2025-03-31"
```
---
## エラーレスポンス
すべてのエラーレスポンスは以下の形式で返されます:
```json
{
"error": "エラーメッセージ"
}
```
### 共通エラーコード
| ステータスコード | 説明 |
|------------------|------|
| 400 Bad Request | リクエストの形式が不正 |
| 401 Unauthorized | 認証エラー |
| 404 Not Found | リソースが見つからない |
| 500 Internal Server Error | サーバー内部エラー |
---
## 日付形式
APIは以下の日付形式を受け付けます優先度順
1. **RFC3339**: `2025-01-15T23:59:00+09:00`
2. **日時形式**: `2025-01-15T23:59`
3. **日付のみ**: `2025-01-15`時刻は23:59に設定
レスポンスの日付はすべてRFC3339形式で返されます。
---
## Rate Limiting
アプリケーションレベルでのRate Limitingが実装されています。
- **制限単位**: IPアドレスごと
- **デフォルト制限**: 100リクエスト / 60秒
- **超過時レスポンス**: `429 Too Many Requests`
```json
{
"error": "リクエスト数が制限を超えました。しばらくしてからお試しください。"
}
```
設定ファイル (`config.ini`) または環境変数で制限値を変更可能です。