# Phase 1 Auth API (PHP)

## Base
- Web root: `backend/public`

## Endpoints

### Health Check
- `GET /health`

### Debug Ping (DB疎通確認)
- `GET /api/debug/ping`
- レスポンスで `db: 1` が返れば DB まで疎通できています。

### Admin Login
- `POST /api/auth/admin/login`
- Body:
```json
{
  "schoolId": 1,
  "password": "plain-password"
}
```

### Admin Register
- `POST /api/auth/admin/register`
- Body:
```json
{
  "schoolName": "○○小学校PTA",
  "password": "new-password-at-least-16-chars",
  "passwordConfirm": "new-password-at-least-16-chars"
}
```

### Admin Me
- `GET /api/auth/admin/me`
- Header: `Authorization: Bearer <token>`

### Admin Password Change
- `POST /api/auth/admin/change-password`
- Header: `Authorization: Bearer <token>`
- Body:
```json
{
  "currentPassword": "old-password",
  "newPassword": "new-password-at-least-16-chars",
  "newPasswordConfirm": "new-password-at-least-16-chars"
}
```

### LINE Login
- `POST /api/auth/line/login`
- Body:
```json
{
  "code": "line-oauth-code"
}
```

### LINE Login Config
- `GET /api/auth/line/config`
- フロント側でLINE OAuth URLを組み立てるために `channelId` と `redirectUri` を返します。

### Member Me
- `GET /api/auth/member/me`
- Header: `Authorization: Bearer <token>`

### Events Create (Admin)
- `POST /api/events`
- Header: `Authorization: Bearer <token>`
- Body:
```json
{
  "title": "1学期 旗振り当番",
  "eventDateType": "single",
  "eventDate": "2026-06-01",
  "backupDate1": "2026-06-02",
  "backupDate2": "2026-06-03",
  "location": "正門前"
}
```

- 期間開催の例:
```json
{
  "title": "運動会見守り",
  "eventDateType": "range",
  "eventStartDate": "2026-10-10",
  "eventEndDate": "2026-10-12",
  "backupDate1": "2026-10-13",
  "backupDate2": "2026-10-14",
  "location": "校庭"
}
```

### Events List (Admin)
- `GET /api/events`
- Header: `Authorization: Bearer <token>`

### Events Update (Admin)
- `PUT /api/events/{eventId}`
- Header: `Authorization: Bearer <token>`
- Body:
```json
{
  "title": "1学期 旗振り当番（更新）",
  "eventDateType": "single",
  "eventDate": "2026-06-05",
  "backupDate1": "2026-06-06",
  "backupDate2": "2026-06-07",
  "location": "西門前"
}
```

### Slots Create (Admin)
- `POST /api/slots`
- Header: `Authorization: Bearer <token>`
- Body:
```json
{
  "eventId": 1,
  "roleName": "A交差点",
  "slotDateType": "single",
  "slotDate": "2026-06-01",
  "startTime": "07:30",
  "endTime": "08:15",
  "capacity": 2,
  "bringItemsOptions": "ほうき, 軍手"
}
```

- 期間募集枠の例:
```json
{
  "eventId": 1,
  "roleName": "校庭見守り",
  "slotDateType": "range",
  "slotStartDate": "2026-10-10",
  "slotEndDate": "2026-10-12",
  "startTime": "08:00",
  "endTime": "12:00",
  "capacity": 4,
  "bringItemsOptions": "帽子, 水筒"
}
```

### Slots List (Admin)
- `GET /api/slots?eventId=1`
- Header: `Authorization: Bearer <token>`

### Slots Update (Admin)
- `PUT /api/slots/{eventId}/{eventSlotId}`
- Header: `Authorization: Bearer <token>`
- Body:
```json
{
  "roleName": "A交差点（更新）",
  "slotDateType": "single",
  "slotDate": "2026-06-02",
  "startTime": "07:45",
  "endTime": "08:20",
  "capacity": 3,
  "bringItemsOptions": "ほうき"
}
```

### Public Events Browse
- `GET /api/public/events?schoolId=1`

### Public Schools Browse
- `GET /api/public/schools`

### Public Slots Browse
- `GET /api/public/slots?schoolId=1&eventId=1`

### Member Reservations Create
- `POST /api/member/reservations`
- Header: `Authorization: Bearer <member-token>`
- Body:
```json
{
  "slotIds": ["1-1", "1-2"],
  "parentName": "山田 花子",
  "children": [
    {
      "name": "山田 太郎",
      "gradeClass": "3年1組"
    }
  ],
  "broughtItems": "ほうき",
  "message": "当日は5分前に到着します",
  "remindEnabled": true
}
```

### Member Reservations List
- `GET /api/member/reservations`
- Header: `Authorization: Bearer <member-token>`

### Member Children List
- `GET /api/member/children`
- Header: `Authorization: Bearer <member-token>`

### Member Child Delete
- `DELETE /api/member/children/{childId}`
- Header: `Authorization: Bearer <member-token>`
- 予約が残っている児童は削除できません（409）。

### Member Reservation Cancel
- `DELETE /api/member/reservations/{assignmentId}`
- Header: `Authorization: Bearer <member-token>`

## Browser確認ページ
- `frontend/public/check.html` をブラウザで開くと、以下を順番に確認できます。
- `GET /health`
- `GET /api/debug/ping`
- `POST /api/auth/admin/login` と `GET /api/auth/admin/me`

## 学校管理画面（シンプル版）
- `frontend/public/admin.html`
- 実装内容:
  - 学校アカウント新規登録
  - 管理者ログイン
  - ログイン情報確認
  - パスワード変更
  - イベント作成（最小版）
  - イベント一覧（自校のみ）
  - 募集枠作成（イベント単位）
  - 募集枠一覧（イベント単位）

## 応募者向け公開画面
- `frontend/public/public.html`
- 実装内容:
  - 学校を選択してイベント一覧を表示
  - イベントを選んで募集枠を表示

## 応募者向け予約画面（最小版）
- `frontend/public/member.html`
- 実装内容:
  - 学校/イベント/募集枠の選択
  - 予約作成
  - 自分の予約一覧
  - キャンセル

## DB追加手順（イベント・募集枠機能）
- `backend/database/002_events_phase1.sql` を実行してください。
- `backend/database/003_slots_phase1.sql` を実行してください。
- `backend/database/004_member_reservations_phase1.sql` を実行してください。
- `backend/database/005_children_member_refactor.sql` を実行してください。
- `backend/database/006_events_date_range_and_backup_days.sql` を実行してください。
- `backend/database/007_slots_date_range_and_split_time.sql` を実行してください。
- `backend/database/008_slots_event_local_id.sql` を実行してください。
- `backend/database/009_slots_composite_primary_key.sql` を実行してください。
