480 lines
11 KiB
Markdown
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
|
|
|