319 lines
5.2 KiB
Markdown
319 lines
5.2 KiB
Markdown
# API Reference
|
|
|
|
## Frontend Environment Variables
|
|
|
|
```bash
|
|
# Directus CMS endpoint
|
|
VITE_API_URL=http://localhost:8055
|
|
|
|
# Control service WebSocket
|
|
VITE_WS_URL=ws://localhost:3001
|
|
|
|
# Welcome message on idle screen
|
|
VITE_WELCOME_NAME=Guest
|
|
|
|
# Auto-return to idle after (minutes)
|
|
VITE_IDLE_TIMEOUT=5
|
|
```
|
|
|
|
## Control Service API
|
|
|
|
### WebSocket Messages
|
|
|
|
The control service listens on `ws://localhost:3001`
|
|
|
|
#### Client → Server
|
|
|
|
```json
|
|
{
|
|
"type": "launch-plex",
|
|
"payload": {}
|
|
}
|
|
```
|
|
|
|
```json
|
|
{
|
|
"type": "return-to-kiosk",
|
|
"payload": {}
|
|
}
|
|
```
|
|
|
|
```json
|
|
{
|
|
"type": "restart-kiosk",
|
|
"payload": {}
|
|
}
|
|
```
|
|
|
|
```json
|
|
{
|
|
"type": "execute",
|
|
"payload": {
|
|
"command": "ls -la /tmp"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Server → Client
|
|
|
|
```json
|
|
{
|
|
"type": "connected",
|
|
"payload": {
|
|
"timestamp": "2024-03-20T12:34:56Z"
|
|
}
|
|
}
|
|
```
|
|
|
|
```json
|
|
{
|
|
"type": "input",
|
|
"payload": {
|
|
"type": "up"
|
|
}
|
|
}
|
|
```
|
|
|
|
Input event types:
|
|
- `up`, `down`, `left`, `right` - Navigation
|
|
- `select` - Confirm selection
|
|
- `back` - Go back
|
|
|
|
### HTTP Endpoints
|
|
|
|
**Health Check**
|
|
```bash
|
|
GET http://localhost:3001/health
|
|
|
|
{
|
|
"status": "healthy",
|
|
"timestamp": "2024-03-20T12:34:56Z",
|
|
"processes": ["plex"]
|
|
}
|
|
```
|
|
|
|
## Directus API
|
|
|
|
### Collections
|
|
|
|
#### Restaurants
|
|
|
|
```bash
|
|
GET http://localhost:8055/items/restaurants?fields=*,image.*
|
|
|
|
[
|
|
{
|
|
"id": "uuid",
|
|
"name": "La Bella Vita",
|
|
"description": "Italian cuisine",
|
|
"cuisine_type": "Italian",
|
|
"website_url": "https://example.com",
|
|
"phone": "+1-555-0123",
|
|
"image": {
|
|
"id": "file-id",
|
|
"filename_disk": "restaurant.jpg"
|
|
},
|
|
"status": "published"
|
|
}
|
|
]
|
|
```
|
|
|
|
#### Attractions
|
|
|
|
```bash
|
|
GET http://localhost:8055/items/attractions?fields=*,image.*
|
|
|
|
[
|
|
{
|
|
"id": "uuid",
|
|
"name": "City Museum",
|
|
"description": "World-class art",
|
|
"category": "Museum",
|
|
"distance_km": 2.5,
|
|
"image": {
|
|
"id": "file-id",
|
|
"filename_disk": "museum.jpg"
|
|
},
|
|
"website_url": "https://example.com",
|
|
"hours": "10 AM - 6 PM",
|
|
"status": "published"
|
|
}
|
|
]
|
|
```
|
|
|
|
### Get Images
|
|
|
|
```bash
|
|
# Direct image URL
|
|
http://localhost:8055/assets/{filename}
|
|
|
|
# Example
|
|
http://localhost:8055/assets/restaurant-12345.jpg
|
|
```
|
|
|
|
## Frontend Store API
|
|
|
|
```javascript
|
|
import {
|
|
currentScreen, // 'idle' | 'home' | 'restaurants' | 'attractions'
|
|
selectedIndex, // Currently selected menu item index
|
|
restaurants, // Array of restaurant items
|
|
attractions, // Array of attraction items
|
|
wsConnected, // Boolean - WebSocket connection status
|
|
pushScreen, // (screen) => void
|
|
popScreen, // () => void
|
|
resetNavigation, // () => void
|
|
} from '$lib/store.js';
|
|
```
|
|
|
|
## CMS Integration
|
|
|
|
### Fetch Data
|
|
|
|
```javascript
|
|
import { fetchRestaurants, fetchAttractions } from '$lib/api.js';
|
|
|
|
const restaurants = await fetchRestaurants();
|
|
const attractions = await fetchAttractions();
|
|
```
|
|
|
|
### Generate QR Codes
|
|
|
|
```javascript
|
|
import { generateQRCode } from '$lib/qrcode.js';
|
|
|
|
const qrDataUrl = await generateQRCode('https://example.com');
|
|
// Returns: data:image/png;base64,...
|
|
```
|
|
|
|
### WebSocket Connection
|
|
|
|
```javascript
|
|
import WebSocketManager from '$lib/websocket.js';
|
|
|
|
const ws = new WebSocketManager('ws://localhost:3001');
|
|
|
|
ws.on('connected', () => console.log('Connected'));
|
|
ws.on('input', (data) => console.log('Input:', data));
|
|
|
|
ws.connect();
|
|
ws.send('launch-plex');
|
|
```
|
|
|
|
## System Commands
|
|
|
|
### Launch Scripts
|
|
|
|
```bash
|
|
# Start kiosk
|
|
./scripts/launch-kiosk.sh
|
|
|
|
# Launch Plex
|
|
./scripts/launch-plex.sh
|
|
|
|
# Return to kiosk
|
|
./scripts/return-to-kiosk.sh
|
|
|
|
# Initialize system (Raspberry Pi)
|
|
./scripts/init-system.sh
|
|
|
|
# Rebuild services
|
|
./scripts/rebuild.sh
|
|
|
|
# Stop services
|
|
./scripts/stop.sh
|
|
|
|
# View logs
|
|
./scripts/logs.sh [service]
|
|
|
|
# Control service CLI
|
|
./scripts/control.sh [command]
|
|
```
|
|
|
|
## Docker Compose Services
|
|
|
|
```bash
|
|
# Start all services
|
|
docker-compose up -d
|
|
|
|
# Stop all services
|
|
docker-compose down
|
|
|
|
# View status
|
|
docker-compose ps
|
|
|
|
# View logs
|
|
docker-compose logs -f [service]
|
|
|
|
# Services:
|
|
# - postgres (Database)
|
|
# - directus (CMS)
|
|
# - frontend (Kiosk UI)
|
|
# - control-service (Remote control)
|
|
```
|
|
|
|
## Environment Configuration
|
|
|
|
### Root .env
|
|
|
|
```bash
|
|
# Frontend
|
|
VITE_API_URL=http://localhost:8055
|
|
VITE_WS_URL=ws://localhost:3001
|
|
WELCOME_NAME=Guest
|
|
IDLE_TIMEOUT_MINUTES=5
|
|
|
|
# Control Service
|
|
PORT=3001
|
|
CEC_DEVICE=/dev/ttyAMA0
|
|
PLEX_LAUNCH_COMMAND=/usr/bin/plex-htpc
|
|
KIOSK_LAUNCH_COMMAND=/home/pi/scripts/launch-kiosk.sh
|
|
|
|
# Directus
|
|
DATABASE_URL=postgresql://directus:directus123@postgres:5432/directus
|
|
SECRET=your-secret-key
|
|
AUTH_SECRET=your-auth-secret
|
|
DB_CLIENT=postgres
|
|
DB_HOST=postgres
|
|
DB_PORT=5432
|
|
DB_DATABASE=directus
|
|
DB_USER=directus
|
|
DB_PASSWORD=directus123
|
|
CORS_ORIGIN=http://localhost:5173
|
|
|
|
# Postgres
|
|
POSTGRES_USER=directus
|
|
POSTGRES_PASSWORD=directus123
|
|
POSTGRES_DB=directus
|
|
```
|
|
|
|
## Error Handling
|
|
|
|
### Common HTTP Status Codes
|
|
|
|
- `200` - Success
|
|
- `404` - Not found (collection doesn't exist)
|
|
- `401` - Unauthorized (authentication required)
|
|
- `500` - Server error
|
|
|
|
### WebSocket Errors
|
|
|
|
```json
|
|
{
|
|
"type": "error",
|
|
"payload": {
|
|
"message": "Command failed"
|
|
}
|
|
}
|
|
```
|
|
|
|
## Rate Limits
|
|
|
|
No rate limits configured by default. Configure in production:
|
|
|
|
**Directus:**
|
|
- Settings → Project Settings → Rate Limiting
|
|
|
|
**Control Service:**
|
|
- Implement in `server.js` middleware
|