横断APIリファレンス¶
目的: 各パッケージの API / Socket / IoT / 権限 / フローを 1 枚で俯瞰するための横断リファレンス。 実装コードは参照のみで、断定できない点は TODO を明記します。
1) Actors と責務の概要¶
- Cloud API (signage-aws-nodejs): 管理 UI / アプリからの HTTP 入口、Socket.IO でデバイス制御
- Device (signage-server + signage-jetson): デバイスローカル API / Socket、クラウド Socket 受信、IoT Pub
- Admin UI (signage-admin-ui): Cloud API への操作クライアント
- Infra (xignage-infra-aws): AWS IoT ルール、イベント/メトリクス処理基盤
- Human Admin(通常): userExternalId を持つ利用者 (顧客スコープ)
- System(master): MASTER_USER_EXTERNAL_IDS で許可された管理者
2) 認証/権限モデル (Human / Device / master/system)¶
| Actor | 認証情報/ID | 主な判定/権限条件 | 備考 | 根拠 |
|---|---|---|---|---|
| Human Admin(通常) | userExternalId | requireHumanUser + customer/device アクセスチェック | userExternalId はクエリ/ボディから取得 | signage-aws-nodejs/middlewares/humanAuth.js |
| System(master) | userExternalId | isMasterUser が true ならアクセスチェックをスキップ | MASTER_USER_EXTERNAL_IDS に依存 | signage-aws-nodejs/services/userDevicesService.js |
| Internal (system) | x-internal-token | INTERNAL_API_TOKEN と一致 | 一部 API で内部トークン必須 | signage-aws-nodejs/middlewares/internalAuth.js |
| Device | deviceId | Socket.IO の registerDevice で紐付け | Socket 接続自体の認証はコード上見当たらず | signage-aws-nodejs/socket/deviceRegistry.js |
| Device (IoT) | IOT_* 環境変数 + IoT Thing cert | MQTT クライアント ID は Thing 名 | iot.env / iot-certs を利用 | signage-jetson/scripts/io/aws_iot_pub.py |
TODO: userExternalId の真正性を担保するトークン/署名検証は repo 内で確認できず。
根拠: signage-aws-nodejs/middlewares/humanAuth.js、signage-admin-ui/src/context/UserContext.tsx
3) API サーフェス別の索引テーブル¶
Cloud HTTP endpoints (主要 route groups)¶
| ルート群 | 代表パス | 主な用途 | 主要パラメータ(必須) | 権限 | 根拠 |
|---|---|---|---|---|---|
| Device registration | /api/ip/register /api/mac/register /api/device-info/register |
端末 IP/MAC/情報の登録 | deviceId, localIp/macAddress/info | Device (未認証) | signage-aws-nodejs/routes/device/*.js |
| Device sync | /api/devices/:deviceId/sync-complete |
同期完了の記録 | deviceId, (playlistId または既存紐付け) | Device (未認証) | signage-aws-nodejs/routes/device/deviceSyncRoutes.js |
| Player playlist | /api/devices/:deviceId/playlist |
再生プレイリスト取得 | deviceId, (customerId/playlistId は任意) | Device (未認証) | signage-aws-nodejs/routes/player/devicePlaylistRoutes.js |
| Player manifest | /api/devices/:deviceId/media-manifest |
取得対象メディア一覧 | deviceId, (customerId/playlistId は任意) | Device (未認証) | signage-aws-nodejs/routes/player/devicePlaylistRoutes.js |
| Admin content | /api/content/media /api/content/playlists |
メディア/プレイリスト管理 | customerId, userExternalId | Human + customer access | signage-aws-nodejs/routes/admin/contentRoutes.js |
| Admin device playlist | /api/devices/:deviceId/playlist-assignment /api/devices/:deviceId/sync-status |
割当/同期状態確認 | deviceId, customerId, userExternalId | Human + customer access | signage-aws-nodejs/routes/admin/devicePlaylistRoutes.js |
| Admin user devices | /api/user/devices |
ユーザーに紐付くデバイス取得 | userExternalId | Human | signage-aws-nodejs/routes/admin/userDevicesRoutes.js |
| Admin commands | /api/commands/* |
再生/更新/回転/同期/音量 | deviceId, userExternalId | Human + device access | signage-aws-nodejs/routes/admin/command/*.js |
| Admin status | /api/status /api/version/versions /api/patchMigState |
端末状態/版本/パッチ状態 | deviceId, userExternalId | Human + device access | signage-aws-nodejs/routes/admin/*.js |
| Admin doorbell | /api/doorbell/start-call /api/doorbell/end-call |
通話開始/終了 | doorbellEventId, userId, deviceId | Human + device access | signage-aws-nodejs/routes/admin/doorbellRoutes.js |
| System master | /api/admin/* |
顧客/デバイス管理 | userExternalId | System(master) | signage-aws-nodejs/routes/admin/adminRoutes.js |
| Call UI | /call/join/mobile/:callId |
通話 UI (Daily) | callId, deviceId, userExternalId | Human + device access | signage-aws-nodejs/routes/admin/callRoutes.js |
Admin UI から実際に叩く API 例:
| 機能 | エンドポイント | 必須パラメータ | 根拠 |
|---|---|---|---|
| デバイス一覧 | /api/user/devices |
userExternalId | signage-admin-ui/src/context/UserContext.tsx |
| 同期ステータス | /api/devices/:deviceId/sync-status |
customerId, userExternalId | signage-admin-ui/src/page/Layout.tsx |
| 同期開始 | /api/commands/sync-content |
deviceId, customerId, userExternalId | signage-admin-ui/src/page/Layout.tsx |
| メディア一覧 | /api/content/media |
customerId, userExternalId | signage-admin-ui/src/page/MediaList.tsx |
| メディアアップロード | /api/content/media/upload-url /api/content/media/complete-upload |
customerId, userExternalId | signage-admin-ui/src/hook/useUpload.ts |
| プレイリスト操作 | /api/content/playlists /api/content/playlists/:id/items |
customerId, userExternalId | signage-admin-ui/src/page/PlaylistsList.tsx |
Device local HTTP endpoints (存在するもののみ)¶
| ルート群 | 代表パス | 主な用途 | 備考 | 根拠 |
|---|---|---|---|---|
| Kiosk | /api/kiosk |
kiosk.html 表示 | Device local | signage-server/routes/kioskRoutes.js |
| Views | /api/views/switch/:view |
ローカル UI 切替 | Socket.IO へ switchView | signage-server/routes/viewRoutes.js |
| AI Assist | /api/ai-assist /api/ai-assist/update /api/ai-assist/latest |
AI assist 画面/更新 | Device local | signage-server/routes/aiAssistRoutes.js |
| Config | /api/config |
ローカル設定取得 | /var/lib/signage_local/localSettings.json | signage-server/routes/configRoutes.js |
| Doorbell (device) | /api/doorbell/test /api/doorbell/start-call |
IoT テスト/通話開始 stub | IoT publish | signage-server/routes/doorbellRoutes.js |
| Local playlist | /localPlaylist |
ローカル playlist.json | 端末内再生 | signage-server/routes/localPlaylistRoutes.js |
| Health | /health /ping |
ヘルスチェック | Device local | signage-server/app.js |
Socket events (方向/ACK/payload/権限)¶
| イベント | 方向 | ACK | payload 要点 | 権限 | 根拠 |
|---|---|---|---|---|---|
| registerDevice | Device → Cloud | なし | deviceId | Device (未認証) | signage-aws-nodejs/socket/deviceRegistry.js |
| startPlaylist / stopPlaylist | Cloud → Device | なし | 任意 payload | Human + device access | signage-aws-nodejs/services/command/emitCommand.js |
| toggleRotation / forceKiosk / startUpdate / networkResetCommand | Cloud → Device | なし | deviceId | Human + device access | signage-aws-nodejs/routes/admin/command/systemRoutes.js |
| setVolume / toggleVolume | Cloud → Device | なし | volume, requestId | Human + device access | signage-aws-nodejs/routes/admin/command/volumeRoutes.js |
| playVideo / showImage / switchView | Cloud → Device | なし | fileName など | Human + device access | signage-aws-nodejs/routes/admin/command/playRoutes.js |
| syncContentFromCloud | Cloud → Device | なし | deviceId | Human + customer access | signage-aws-nodejs/routes/admin/command/systemRoutes.js |
| getVersions / versionsResponse | Cloud ↔ Device | あり | requestId / version info | Human + device access | signage-aws-nodejs/routes/admin/versionRoutes.js |
| getPatchMigState / patchMigStateResponse | Cloud ↔ Device | あり | requestId / state | Human + device access | signage-aws-nodejs/routes/admin/patchMigRoutes.js |
| requestDeviceInfo / deviceInfoResponse | Cloud ↔ Device | あり | requestId / info | Human + device access | signage-aws-nodejs/routes/admin/deviceInfoRoutes.js |
| doorbell:startCall | Cloud → Device | なし | callId, joinUrlDevice, deviceId | Human + device access | signage-aws-nodejs/routes/admin/doorbellRoutes.js |
| volumeStatusChanged | Device → Cloud | なし | requestId, muted | Device | signage-server/public/js/main.js |
| net:report | Cloud → Device | あり | ACK で snap | Human + device access | signage-aws-nodejs/routes/admin/command/networkRoutes.js |
TODO: Socket.IO 接続時の認証/署名方式はコード上確認できず。
根拠: signage-aws-nodejs/socket/index.js、signage-server/sockets/cloudSocket/index.js
IoT / MQTT topics¶
| Topic | Pub/Sub | 用途 | 前提 | 根拠 |
|---|---|---|---|---|
xignage/v1/devices/{DEVICE_ID}/events/{button\|presence} |
Device pub → IoT rule sub | ボタン/ToF イベント通知 | IOT_ENDPOINT, IOT_THING_NAME, 証明書 | signage-jetson/scripts/io/aws_iot_pub.py |
xignage/v1/devices/{DEVICE_ID}/events/button |
Device pub → IoT rule sub | ドアベルテスト通知 | AWS_IOT_ENDPOINT | signage-server/services/iotDoorbellPublisher.js |
xignage/v1/devices/{DEVICE_ID}/metrics/system |
Device pub → IoT rule sub | メトリクス送信 | IOT_* env / mqtts | signage-jetson/scripts/metrics/index.js |
SELECT * FROM 'xignage/v1/devices/+/events/#' |
IoT rule | events → Lambda | IoT ルール | xignage-infra-aws/README.md |
SELECT topic(4) AS deviceId, * FROM 'xignage/v1/devices/+/metrics/+' |
IoT rule | metrics → Lambda | IoT ルール | xignage-infra-aws/lib/metrics/metrics-rule.ts |
権限マトリクス¶
| 対象 | Admin(通常) | System(master) | Device | 未認証 | 根拠 |
|---|---|---|---|---|---|
Cloud HTTP: /api/content/* |
許可 (userExternalId + customerId) | 許可 (master bypass) | 禁止 | 禁止 (userExternalId 必須) | signage-aws-nodejs/routes/admin/contentRoutes.js |
Cloud HTTP: /api/commands/* |
許可 (device access) | 許可 (master bypass) | 禁止 | 禁止 | signage-aws-nodejs/routes/admin/command/*.js |
Cloud HTTP: /api/admin/* |
禁止 | 許可 (requireMasterUser) | 禁止 | 禁止 | signage-aws-nodejs/routes/admin/adminRoutes.js |
Cloud HTTP: /api/user/devices |
許可 (userExternalId) | 許可 | 禁止 | 禁止 | signage-aws-nodejs/routes/admin/userDevicesRoutes.js |
Cloud HTTP: /api/devices/:deviceId/playlist |
禁止 | 禁止 | 許可 (用途は Device) | 許可 (認証なし) | signage-aws-nodejs/routes/player/devicePlaylistRoutes.js |
Cloud HTTP: /api/ip/register /api/mac/register /api/device-info/register |
禁止 | 禁止 | 許可 (用途は Device) | 許可 (認証なし) | signage-aws-nodejs/routes/device/*.js |
| Socket: device control (start/stop, rotate, update, view) | 許可 (HTTP 経由) | 許可 (master bypass) | 受信のみ | 禁止 | signage-aws-nodejs/routes/admin/command/*.js |
| Socket: versions/patch state | 許可 (HTTP 経由) | 許可 | 返信のみ | 禁止 | signage-aws-nodejs/routes/admin/versionRoutes.js |
| IoT: events/metrics publish | 禁止 | 禁止 | 許可 (IoT cert) | 禁止 | xignage-infra-aws/lib/iot-device-policy.ts |
4) 代表フロー (Mermaid)¶
メディア/プレイリスト/同期¶
sequenceDiagram
participant Admin as Admin UI
participant API as Cloud API
participant Socket as Cloud Socket
participant Device as Device (signage-server)
participant Local as Local Player
Admin->>API: POST /api/content/media/upload-url (customerId, userExternalId)
Admin->>API: POST /api/content/media/complete-upload
Admin->>API: POST /api/commands/sync-content (deviceId, customerId, userExternalId)
API->>Socket: emit syncContentFromCloud
Socket->>Device: syncContentFromCloud
Device->>API: GET /api/devices/:deviceId/playlist
Device->>Local: startPlaylist / stopPlaylist
根拠: signage-admin-ui/src/hook/useUpload.ts、signage-aws-nodejs/routes/admin/command/systemRoutes.js、signage-server/sockets/cloudSocket/playlistCommands.js
デバイス登録/プロビジョニング/監視¶
sequenceDiagram
participant Device as Device (signage-jetson)
participant API as Cloud API
participant IoT as AWS IoT Core
participant Lambda as Events/Metrics Lambda
Device->>API: POST /api/ip/register (deviceId, localIp)
Device->>API: POST /api/mac/register (deviceId, macAddress)
Device->>API: POST /api/device-info/register (deviceId, info)
Device->>IoT: Publish events/metrics (xignage/v1/devices/{id}/events/*)
IoT->>Lambda: IoT Rule → Lambda
根拠: signage-aws-nodejs/routes/device/*.js、signage-jetson/scripts/io/aws_iot_pub.py、xignage-infra-aws/README.md
呼び出し/通話 (Doorbell)¶
sequenceDiagram
participant Device as Device (signage-server)
participant IoT as AWS IoT Core
participant Lambda as Events Logger
participant Admin as Human Admin
participant API as Cloud API
participant Socket as Cloud Socket
participant Local as Local UI
Device->>IoT: Publish button event
IoT->>Lambda: xignage_events_to_lambda
Admin->>API: POST /api/doorbell/start-call
API->>Socket: emit doorbell:startCall
Socket->>Local: doorbell:startCall
根拠: signage-server/services/iotDoorbellPublisher.js、xignage-infra-aws/README.md、signage-aws-nodejs/routes/admin/doorbellRoutes.js、signage-server/public/js/main.js
5) 既存詳細ページ(packages/*)へのリンク集¶
- signage-aws-nodejs ルーティング:
../packages/signage-aws-nodejs/routes.md - signage-aws-nodejs ソケット:
../packages/signage-aws-nodejs/socket.md - signage-admin-ui API contract:
../packages/signage-admin-ui/api.md - signage-server API ルーティング:
../packages/signage-server/api/routes.md - signage-server ローカルソケット:
../packages/signage-server/components/local-socket.md - signage-server クラウドソケット:
../packages/signage-server/components/cloud-socket.md - signage-jetson IoT 証明書/環境:
../packages/signage-jetson/infra/aws-iot-certs.md - xignage-infra-aws IoT:
../packages/xignage-infra-aws/iot.md