togethere.cloud/mds/DISCIPLINE_SETTINGS_DOCUMENTATION.md

480 lines
11 KiB
Markdown

# 📋 Dokumentacja Endpoint'u Ustawień Dyscyplin
## 🎯 Przegląd
Endpoint do zarządzania ustawieniami dyscyplin (Ping-Pong, Papier-Kamień-Nożyce, Piłkarzyki). Obsługuje:
- **GET**: pobranie aktualnych ustawień
- **POST**: aktualizacja ustawień (admin only)
### Kluczowe cechy
✅ Versioning ustawień (snapshot do startu meczu)
✅ Separacja reguł gry od UI customization
✅ Walidacja logiczna (min/max wartości, typy)
✅ Domyślne ustawienia dla każdej dyscypliny
✅ Przygotowanie do rozbudowy na inne dyscypliny
---
## 📍 Endpointy
### 1. **Pobierz aktualne ustawienia (GET)**
```
GET /administration/disciplines/{discipline}/settings
```
**URL parametry:**
- `{discipline}`: `ping-pong`, `rock-paper-scissors`, `table-football`
**Query parametry:**
- `snapshot=true` (opcjonalne): zwróć snapshot do startu meczu
- `version=N` (opcjonalne): pobierz ustawienia z konkretnej wersji
**Authoryzacja:** Admin role
**Przykład:**
```bash
curl -X GET \
"http://localhost/administration/disciplines/ping-pong/settings" \
-H "Cookie: PHPSESSID=abc123..."
```
**Odpowiedź (200 OK):**
```json
{
"success": true,
"data": {
"discipline": "ping-pong",
"settingsVersion": 1,
"rules": {
"pointsToWin": 11,
"setsToWin": 3,
"serveRotation": 2,
"specialRules": "Deuce at 10-10 (play until 2 points ahead)"
},
"customization": {
"tableColor": "#2d5016",
"ballColor": "#ff6600",
"paddleColor": "#000000",
"uiTheme": "dark"
},
"metadata": {
"created_at": "2026-01-28 12:30:45",
"updated_at": "2026-01-28 12:30:45",
"updated_by": 1
},
"status": "custom"
}
}
```
**Snapshot (query: ?snapshot=true):**
```json
{
"success": true,
"snapshot": {
"discipline": "ping-pong",
"settingsVersion": 1,
"rules": {
"pointsToWin": 11,
"setsToWin": 3,
"serveRotation": 2,
"specialRules": "Deuce at 10-10..."
},
"snapshotTimestamp": "2026-01-28 12:30:45"
}
}
```
---
### 2. **Aktualizuj ustawienia (POST)**
```
POST /administration/disciplines/{discipline}/settings
```
**Authoryzacja:** Admin role
**Body (JSON):**
```json
{
"rules": {
"pointsToWin": 11,
"setsToWin": 3,
"serveRotation": 2,
"specialRules": "Deuce at 10-10 (play until 2 points ahead)"
},
"customization": {
"tableColor": "#2d5016",
"ballColor": "#ff6600",
"paddleColor": "#000000",
"uiTheme": "dark"
}
}
```
**Przykład:**
```bash
curl -X POST \
"http://localhost/administration/disciplines/ping-pong/settings" \
-H "Content-Type: application/json" \
-H "Cookie: PHPSESSID=abc123..." \
-d '{
"rules": {
"pointsToWin": 11,
"setsToWin": 3,
"serveRotation": 2,
"specialRules": "Custom rules"
},
"customization": {
"tableColor": "#000000"
}
}'
```
**Odpowiedź (200 OK):**
```json
{
"success": true,
"message": "Settings for ping-pong have been updated successfully",
"data": {
"discipline": "ping-pong",
"settingsVersion": 2,
"rules": { ... },
"customization": { ... },
"metadata": {
"created_at": "2026-01-28 12:30:45",
"updated_at": "2026-01-28 12:35:10",
"updated_by": 1
}
}
}
```
---
### 3. **Reset do domyślnych (POST)**
```
POST /administration/disciplines/{discipline}/settings
```
**Body:**
```json
{
"reset": true
}
```
**Przykład:**
```bash
curl -X POST \
"http://localhost/administration/disciplines/ping-pong/settings" \
-H "Content-Type: application/json" \
-H "Cookie: PHPSESSID=abc123..." \
-d '{"reset": true}'
```
---
## 🔐 API Endpoint dla Gry (bez admin wymogu)
```
GET /api/discipline-settings.php?discipline=ping-pong&snapshot=true
```
**Parametry:**
- `discipline`: nazwa dyscypliny
- `version` (opcjonalne): konkretna wersja
**Nie wymaga logowania** - gra pobiera snapshot do startu meczu
**Przykład:**
```bash
curl -X GET \
"http://localhost/api/discipline-settings.php?discipline=ping-pong&snapshot=true"
```
**Odpowiedź:**
```json
{
"success": true,
"snapshot": {
"discipline": "ping-pong",
"settingsVersion": 1,
"rules": {
"pointsToWin": 11,
"setsToWin": 3,
"serveRotation": 2,
"specialRules": "Deuce at 10-10..."
},
"customization": { ... },
"snapshotTimestamp": "2026-01-28 12:35:10"
}
}
```
---
## ✅ Walidacja Danych
### Reguły gry (Logika)
| Pole | Typ | Min | Max | Default | Opis |
|------|-----|-----|-----|---------|------|
| `pointsToWin` | INT | 1 | 100 | 11 | Punkty do wygrania seta |
| `setsToWin` | INT | 1 | 100 | 3 | Sety do wygrania meczu |
| `serveRotation` | INT | 1 | 50 | 2 | Punkty do zmiany serwisu |
| `specialRules` | TEXT | - | - | null | Dodatkowe reguły (np. brak przerw, tie-break) |
### Logika Biznesowa
`pointsToWin >= 1`
`setsToWin >= 1`
`pointsToWin` i `setsToWin` powinny być **nieparzyste** (aby uniknąć remisów)
Przy remisie wymagany jest override reguł (specjalne logika w grze).
### Personalizacja (UI)
```json
{
"customization": {
"tableColor": "#2d5016",
"ballColor": "#ff6600",
"paddleColor": "#000000",
"uiTheme": "dark"
}
}
```
Customization to JSON, może zawierać dowolne pola - nie wpływa na logiką gry.
---
## 🔄 Versioning Ustawień
Każda aktualizacja automatycznie zwiększa `settingsVersion`:
```
Wersja 1 → 2 → 3 → ...
```
**Przydatne do:**
- Startu meczu ze snapshot'em (ustawienia z momentu startu)
- Auditowania zmian
- Przywracania starych wersji (w przyszłości)
---
## 🚀 Integracja z Grą
### Startup gry (pobierz snapshot)
```javascript
// JavaScript - pobierz ustawienia na start meczu
async function initializeGame(discipline) {
const response = await fetch(
`/api/discipline-settings.php?discipline=${discipline}&snapshot=true`
);
const result = await response.json();
if (result.success) {
const settings = result.snapshot;
// Ustaw reguły gry
const game = new PingPongGame({
pointsToWin: settings.rules.pointsToWin,
setsToWin: settings.rules.setsToWin,
serveRotation: settings.rules.serveRotation,
settingsVersion: settings.settingsVersion // Zapisz wersję dla logów
});
// Ustaw UI
applyCustomization(settings.customization);
return game;
}
}
```
### Wysyłanie wyniku meczu
```php
// PHP - backend zapisuje mecz z snapshot'em ustawień
$snapshot = $service->getMatchSnapshot('ping-pong');
$match = [
'team1_id' => 1,
'team2_id' => 2,
'score' => '3:2',
'status' => 'end',
'settingsSnapshot' => json_encode($snapshot), // Zapisz snapshot
'startTime' => date('Y-m-d H:i:s')
];
```
---
## 🧪 Testowanie
### Test 1: Pobierz domyślne ustawienia
```bash
curl http://localhost/administration/disciplines/ping-pong/settings \
-H "Cookie: PHPSESSID=admin_session"
```
### Test 2: Zaktualizuj ustawienia
```bash
curl -X POST http://localhost/administration/disciplines/ping-pong/settings \
-H "Content-Type: application/json" \
-H "Cookie: PHPSESSID=admin_session" \
-d '{
"rules": {
"pointsToWin": 21,
"setsToWin": 2,
"serveRotation": 3
}
}'
```
### Test 3: Pobierz snapshot
```bash
curl http://localhost/administration/disciplines/ping-pong/settings?snapshot=true \
-H "Cookie: PHPSESSID=admin_session"
```
### Test 4: Pobierz snapshot z API (bez admin)
```bash
curl http://localhost/api/discipline-settings.php?discipline=ping-pong&snapshot=true
```
### Test 5: Reset do defaults
```bash
curl -X POST http://localhost/administration/disciplines/ping-pong/settings \
-H "Content-Type: application/json" \
-H "Cookie: PHPSESSID=admin_session" \
-d '{"reset": true}'
```
---
## 📊 Domyślne Ustawienia
### Ping-Pong (🏓)
```json
{
"pointsToWin": 11,
"setsToWin": 3,
"serveRotation": 2,
"specialRules": "Deuce at 10-10 (play until 2 points ahead)",
"customization": {
"tableColor": "#2d5016",
"ballColor": "#ff6600",
"paddleColor": "#000000",
"uiTheme": "dark"
}
}
```
### Papier-Kamień-Nożyce (✊)
```json
{
"pointsToWin": 5,
"setsToWin": 1,
"serveRotation": 1,
"specialRules": "Best of 1, instant rounds",
"customization": {
"animationSpeed": "fast",
"uiTheme": "light"
}
}
```
### Piłkarzyki (⚽)
```json
{
"pointsToWin": 5,
"setsToWin": 1,
"serveRotation": 3,
"specialRules": "Standard foosball rules, auto-restart after goal",
"customization": {
"tableColor": "#000000",
"figureColor": "#ffffff",
"uiTheme": "dark"
}
}
```
---
## 📁 Struktura Plików
```
private_html/
├── api/
│ ├── DisciplineSettingsModel.php # Model BD
│ ├── DisciplineSettingsService.php # Serwis logiki
│ └── discipline-settings.php # API endpoint (publiczny)
└── administration/
└── disciplines/
├── ping-pong/settings/
│ └── index.php # Kontroler settings
├── rock-paper-scissors/settings/
│ └── index.php # Kontroler settings
└── table-football/settings/
└── index.php # Kontroler settings
```
---
## 🔧 Rozbudowa na Nowe Dyscypliny
1. Dodaj dyscyplinę do `DisciplineSettingsModel::getDefaults()`
2. Utwórz folder `administration/disciplines/{discipline}/settings/`
3. Skopiuj `index.php` z ping-ponga
4. Kod automatycznie rozpozna nową dyscyplinę z URL
---
## ⚠️ Kody Błędów
| Kod | Błąd | Opis |
|-----|------|------|
| 200 | OK | Sukces |
| 400 | Bad Request | Zła walidacja danych lub JSON |
| 401 | Unauthorized | Brak logowania |
| 403 | Forbidden | Brak roli admin |
| 405 | Method Not Allowed | Tylko GET i POST |
| 500 | Server Error | Błąd bazy danych |
---
## 📝 Wdrażanie
1. **Załaduj pliki:**
- `private_html/api/DisciplineSettingsModel.php`
- `private_html/api/DisciplineSettingsService.php`
- `private_html/api/discipline-settings.php`
- `private_html/administration/disciplines/*/settings/index.php`
2. **Tabela BD:**
- Automatycznie tworzy się na pierwszy GET
3. **Testuj:**
```bash
curl http://localhost/administration/disciplines/ping-pong/settings
```
---
## 🎯 Przyszłe Rozszerzenia
- [ ] Historia zmian (tabela `settings_disciplines_history`)
- [ ] Porównanie wersji w panelu admina
- [ ] Export/Import ustawień
- [ ] Scheduled changes (zmiana ustawień w określonym czasie)
- [ ] A/B testing reguł
- [ ] Analytics - jak zmiana ustawień wpłyneła na liczbę meczy