628 lines
13 KiB
Markdown
628 lines
13 KiB
Markdown
|
|
# Games Endpoints
|
|||
|
|
|
|||
|
|
Manage the Jackbox game catalog. Games belong to packs (e.g., "Jackbox Party Pack 7"). Each game has player limits, type, audience support, family-friendliness, and favor bias for weighted selection. Packs can also have favor/disfavor bias to influence the picker.
|
|||
|
|
|
|||
|
|
## Endpoint Summary
|
|||
|
|
|
|||
|
|
| Method | Path | Auth | Description |
|
|||
|
|
|--------|------|------|-------------|
|
|||
|
|
| GET | `/api/games` | No | List games with optional filters |
|
|||
|
|
| GET | `/api/games/packs` | No | List all packs |
|
|||
|
|
| GET | `/api/games/meta/packs` | No | Pack metadata (counts, plays) |
|
|||
|
|
| GET | `/api/games/export/csv` | Bearer | Export games as CSV |
|
|||
|
|
| PATCH | `/api/games/packs/{name}/favor` | Bearer | Set pack favor bias |
|
|||
|
|
| GET | `/api/games/{id}` | No | Get single game |
|
|||
|
|
| POST | `/api/games` | Bearer | Create game |
|
|||
|
|
| PUT | `/api/games/{id}` | Bearer | Update game |
|
|||
|
|
| DELETE | `/api/games/{id}` | Bearer | Delete game |
|
|||
|
|
| PATCH | `/api/games/{id}/toggle` | Bearer | Toggle game enabled status |
|
|||
|
|
| PATCH | `/api/games/packs/{name}/toggle` | Bearer | Enable/disable all games in pack |
|
|||
|
|
| POST | `/api/games/import/csv` | Bearer | Import games from CSV |
|
|||
|
|
| PATCH | `/api/games/{id}/favor` | Bearer | Set game favor bias |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## GET /api/games
|
|||
|
|
|
|||
|
|
List all games with optional query filters. Results are ordered by `pack_name`, then `title`.
|
|||
|
|
|
|||
|
|
### Authentication
|
|||
|
|
|
|||
|
|
None.
|
|||
|
|
|
|||
|
|
### Parameters
|
|||
|
|
|
|||
|
|
| Name | In | Type | Required | Description |
|
|||
|
|
|------|-----|------|----------|-------------|
|
|||
|
|
| enabled | query | string | No | `"true"` or `"false"` to filter by enabled status |
|
|||
|
|
| playerCount | query | integer | No | Filter games where `min_players ≤ count ≤ max_players` |
|
|||
|
|
| drawing | query | string | No | `"only"` = `game_type='Drawing'`, `"exclude"` = exclude Drawing |
|
|||
|
|
| length | query | string | No | `"short"` (≤15 min or NULL), `"medium"` (16–25 min), `"long"` (>25 min) |
|
|||
|
|
| familyFriendly | query | string | No | `"true"` or `"false"` |
|
|||
|
|
| pack | query | string | No | Exact `pack_name` match |
|
|||
|
|
|
|||
|
|
### Response
|
|||
|
|
|
|||
|
|
**200 OK**
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
[
|
|||
|
|
{
|
|||
|
|
"id": 1,
|
|||
|
|
"pack_name": "Jackbox Party Pack 7",
|
|||
|
|
"title": "Quiplash 3",
|
|||
|
|
"min_players": 3,
|
|||
|
|
"max_players": 8,
|
|||
|
|
"length_minutes": 15,
|
|||
|
|
"has_audience": 1,
|
|||
|
|
"family_friendly": 0,
|
|||
|
|
"game_type": "Writing",
|
|||
|
|
"secondary_type": null,
|
|||
|
|
"play_count": 0,
|
|||
|
|
"popularity_score": 0,
|
|||
|
|
"enabled": 1,
|
|||
|
|
"favor_bias": 0,
|
|||
|
|
"created_at": "2024-01-15T12:00:00.000Z"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Error Responses
|
|||
|
|
|
|||
|
|
| Status | Body | When |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| 500 | `{ "error": "..." }` | Server error |
|
|||
|
|
|
|||
|
|
### Example
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl "http://localhost:5000/api/games?playerCount=6&pack=Jackbox%20Party%20Pack%207"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## GET /api/games/packs
|
|||
|
|
|
|||
|
|
List all packs with their favor bias.
|
|||
|
|
|
|||
|
|
### Authentication
|
|||
|
|
|
|||
|
|
None.
|
|||
|
|
|
|||
|
|
### Response
|
|||
|
|
|
|||
|
|
**200 OK**
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
[
|
|||
|
|
{
|
|||
|
|
"id": 1,
|
|||
|
|
"name": "Jackbox Party Pack 7",
|
|||
|
|
"favor_bias": 0,
|
|||
|
|
"created_at": "2024-01-15T12:00:00.000Z"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## GET /api/games/meta/packs
|
|||
|
|
|
|||
|
|
Return pack metadata: total game count, enabled count, and total plays per pack.
|
|||
|
|
|
|||
|
|
### Authentication
|
|||
|
|
|
|||
|
|
None.
|
|||
|
|
|
|||
|
|
### Response
|
|||
|
|
|
|||
|
|
**200 OK**
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
[
|
|||
|
|
{
|
|||
|
|
"name": "Jackbox Party Pack 7",
|
|||
|
|
"total_count": 5,
|
|||
|
|
"enabled_count": 5,
|
|||
|
|
"total_plays": 42
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## GET /api/games/export/csv
|
|||
|
|
|
|||
|
|
Export the full game catalog as a CSV file download.
|
|||
|
|
|
|||
|
|
### Authentication
|
|||
|
|
|
|||
|
|
Bearer token required.
|
|||
|
|
|
|||
|
|
### Response
|
|||
|
|
|
|||
|
|
**200 OK**
|
|||
|
|
|
|||
|
|
- Content-Type: `text/csv`
|
|||
|
|
- Content-Disposition: `attachment; filename="jackbox-games.csv"`
|
|||
|
|
- Columns: Pack Name, Title, Min Players, Max Players, Length (minutes), Audience, Family Friendly, Game Type, Secondary Type
|
|||
|
|
|
|||
|
|
### Example
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -o jackbox-games.csv "http://localhost:5000/api/games/export/csv" \
|
|||
|
|
-H "Authorization: Bearer $TOKEN"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## PATCH /api/games/packs/{name}/favor
|
|||
|
|
|
|||
|
|
Set favor bias for a pack. Affects weighted random selection in the picker.
|
|||
|
|
|
|||
|
|
### Authentication
|
|||
|
|
|
|||
|
|
Bearer token required.
|
|||
|
|
|
|||
|
|
### Path Parameters
|
|||
|
|
|
|||
|
|
| Name | Type | Description |
|
|||
|
|
|------|------|-------------|
|
|||
|
|
| name | string | Pack name (exact match, URL-encode if spaces) |
|
|||
|
|
|
|||
|
|
### Request Body
|
|||
|
|
|
|||
|
|
| Field | Type | Required | Description |
|
|||
|
|
|-------|------|----------|-------------|
|
|||
|
|
| favor_bias | integer | Yes | `1` = favor, `-1` = disfavor, `0` = neutral |
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"favor_bias": 1
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Response
|
|||
|
|
|
|||
|
|
**200 OK**
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"message": "Pack favor bias updated successfully",
|
|||
|
|
"favor_bias": 1
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Error Responses
|
|||
|
|
|
|||
|
|
| Status | Body | When |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| 400 | `{ "error": "favor_bias must be 1 (favor), -1 (disfavor), or 0 (neutral)" }` | Invalid value |
|
|||
|
|
|
|||
|
|
### Example
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X PATCH "http://localhost:5000/api/games/packs/Jackbox%20Party%20Pack%207/favor" \
|
|||
|
|
-H "Authorization: Bearer $TOKEN" \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{"favor_bias": 1}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## GET /api/games/{id}
|
|||
|
|
|
|||
|
|
Get a single game by ID.
|
|||
|
|
|
|||
|
|
### Authentication
|
|||
|
|
|
|||
|
|
None.
|
|||
|
|
|
|||
|
|
### Path Parameters
|
|||
|
|
|
|||
|
|
| Name | Type | Description |
|
|||
|
|
|------|------|-------------|
|
|||
|
|
| id | integer | Game ID |
|
|||
|
|
|
|||
|
|
### Response
|
|||
|
|
|
|||
|
|
**200 OK**
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"id": 1,
|
|||
|
|
"pack_name": "Jackbox Party Pack 7",
|
|||
|
|
"title": "Quiplash 3",
|
|||
|
|
"min_players": 3,
|
|||
|
|
"max_players": 8,
|
|||
|
|
"length_minutes": 15,
|
|||
|
|
"has_audience": 1,
|
|||
|
|
"family_friendly": 0,
|
|||
|
|
"game_type": "Writing",
|
|||
|
|
"secondary_type": null,
|
|||
|
|
"play_count": 0,
|
|||
|
|
"popularity_score": 0,
|
|||
|
|
"enabled": 1,
|
|||
|
|
"favor_bias": 0,
|
|||
|
|
"created_at": "2024-01-15T12:00:00.000Z"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Error Responses
|
|||
|
|
|
|||
|
|
| Status | Body | When |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| 404 | `{ "error": "Game not found" }` | Invalid ID |
|
|||
|
|
|
|||
|
|
### Example
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl "http://localhost:5000/api/games/1"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## POST /api/games
|
|||
|
|
|
|||
|
|
Create a new game. Pack is created automatically if it does not exist.
|
|||
|
|
|
|||
|
|
### Authentication
|
|||
|
|
|
|||
|
|
Bearer token required.
|
|||
|
|
|
|||
|
|
### Request Body
|
|||
|
|
|
|||
|
|
| Field | Type | Required | Description |
|
|||
|
|
|-------|------|----------|-------------|
|
|||
|
|
| pack_name | string | Yes | Pack name (e.g., "Jackbox Party Pack 7") |
|
|||
|
|
| title | string | Yes | Game title |
|
|||
|
|
| min_players | integer | Yes | Minimum players |
|
|||
|
|
| max_players | integer | Yes | Maximum players |
|
|||
|
|
| length_minutes | integer | No | Approx. play length |
|
|||
|
|
| has_audience | boolean | No | Audience mode supported |
|
|||
|
|
| family_friendly | boolean | No | Family-friendly rating |
|
|||
|
|
| game_type | string | No | Primary type (e.g., "Writing", "Drawing") |
|
|||
|
|
| secondary_type | string | No | Secondary type |
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"pack_name": "Jackbox Party Pack 7",
|
|||
|
|
"title": "Quiplash 3",
|
|||
|
|
"min_players": 3,
|
|||
|
|
"max_players": 8,
|
|||
|
|
"length_minutes": 15,
|
|||
|
|
"has_audience": true,
|
|||
|
|
"family_friendly": false,
|
|||
|
|
"game_type": "Writing",
|
|||
|
|
"secondary_type": null
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Response
|
|||
|
|
|
|||
|
|
**201 Created**
|
|||
|
|
|
|||
|
|
Returns the created game object.
|
|||
|
|
|
|||
|
|
### Error Responses
|
|||
|
|
|
|||
|
|
| Status | Body | When |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| 400 | `{ "error": "Missing required fields" }` | Missing pack_name, title, min_players, or max_players |
|
|||
|
|
|
|||
|
|
### Example
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X POST "http://localhost:5000/api/games" \
|
|||
|
|
-H "Authorization: Bearer $TOKEN" \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{
|
|||
|
|
"pack_name": "Jackbox Party Pack 7",
|
|||
|
|
"title": "Quiplash 3",
|
|||
|
|
"min_players": 3,
|
|||
|
|
"max_players": 8,
|
|||
|
|
"length_minutes": 15,
|
|||
|
|
"has_audience": true,
|
|||
|
|
"family_friendly": false,
|
|||
|
|
"game_type": "Writing",
|
|||
|
|
"secondary_type": null
|
|||
|
|
}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## PUT /api/games/{id}
|
|||
|
|
|
|||
|
|
Update a game. All fields are optional; uses COALESCE (only provided fields are updated).
|
|||
|
|
|
|||
|
|
### Authentication
|
|||
|
|
|
|||
|
|
Bearer token required.
|
|||
|
|
|
|||
|
|
### Path Parameters
|
|||
|
|
|
|||
|
|
| Name | Type | Description |
|
|||
|
|
|------|------|-------------|
|
|||
|
|
| id | integer | Game ID |
|
|||
|
|
|
|||
|
|
### Request Body
|
|||
|
|
|
|||
|
|
All fields optional. Include only the fields to update.
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"pack_name": "Jackbox Party Pack 7",
|
|||
|
|
"title": "Quiplash 3",
|
|||
|
|
"min_players": 3,
|
|||
|
|
"max_players": 8,
|
|||
|
|
"length_minutes": 20,
|
|||
|
|
"has_audience": true,
|
|||
|
|
"family_friendly": false,
|
|||
|
|
"game_type": "Writing",
|
|||
|
|
"secondary_type": null,
|
|||
|
|
"enabled": true
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Response
|
|||
|
|
|
|||
|
|
**200 OK**
|
|||
|
|
|
|||
|
|
Returns the updated game object.
|
|||
|
|
|
|||
|
|
### Error Responses
|
|||
|
|
|
|||
|
|
| Status | Body | When |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| 404 | `{ "error": "Game not found" }` | Invalid ID |
|
|||
|
|
|
|||
|
|
### Example
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X PUT "http://localhost:5000/api/games/1" \
|
|||
|
|
-H "Authorization: Bearer $TOKEN" \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{"length_minutes": 20, "enabled": true}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## DELETE /api/games/{id}
|
|||
|
|
|
|||
|
|
Delete a game permanently.
|
|||
|
|
|
|||
|
|
### Authentication
|
|||
|
|
|
|||
|
|
Bearer token required.
|
|||
|
|
|
|||
|
|
### Path Parameters
|
|||
|
|
|
|||
|
|
| Name | Type | Description |
|
|||
|
|
|------|------|-------------|
|
|||
|
|
| id | integer | Game ID |
|
|||
|
|
|
|||
|
|
### Response
|
|||
|
|
|
|||
|
|
**200 OK**
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"message": "Game deleted successfully"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Error Responses
|
|||
|
|
|
|||
|
|
| Status | Body | When |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| 404 | `{ "error": "Game not found" }` | Invalid ID |
|
|||
|
|
|
|||
|
|
### Example
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X DELETE "http://localhost:5000/api/games/1" \
|
|||
|
|
-H "Authorization: Bearer $TOKEN"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## PATCH /api/games/{id}/toggle
|
|||
|
|
|
|||
|
|
Toggle the game's `enabled` field (0↔1). Use to quickly enable/disable a game without a full PUT.
|
|||
|
|
|
|||
|
|
### Authentication
|
|||
|
|
|
|||
|
|
Bearer token required.
|
|||
|
|
|
|||
|
|
### Path Parameters
|
|||
|
|
|
|||
|
|
| Name | Type | Description |
|
|||
|
|
|------|------|-------------|
|
|||
|
|
| id | integer | Game ID |
|
|||
|
|
|
|||
|
|
### Response
|
|||
|
|
|
|||
|
|
**200 OK**
|
|||
|
|
|
|||
|
|
Returns the updated game object with the flipped `enabled` value.
|
|||
|
|
|
|||
|
|
### Error Responses
|
|||
|
|
|
|||
|
|
| Status | Body | When |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| 404 | `{ "error": "Game not found" }` | Invalid ID |
|
|||
|
|
|
|||
|
|
### Example
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X PATCH "http://localhost:5000/api/games/1/toggle" \
|
|||
|
|
-H "Authorization: Bearer $TOKEN"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## PATCH /api/games/packs/{name}/toggle
|
|||
|
|
|
|||
|
|
Enable or disable all games in a pack at once.
|
|||
|
|
|
|||
|
|
### Authentication
|
|||
|
|
|
|||
|
|
Bearer token required.
|
|||
|
|
|
|||
|
|
### Path Parameters
|
|||
|
|
|
|||
|
|
| Name | Type | Description |
|
|||
|
|
|------|------|-------------|
|
|||
|
|
| name | string | Pack name (URL-encode if spaces) |
|
|||
|
|
|
|||
|
|
### Request Body
|
|||
|
|
|
|||
|
|
| Field | Type | Required | Description |
|
|||
|
|
|-------|------|----------|-------------|
|
|||
|
|
| enabled | boolean | Yes | `true` to enable, `false` to disable |
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"enabled": true
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Response
|
|||
|
|
|
|||
|
|
**200 OK**
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"message": "Pack enabled successfully",
|
|||
|
|
"gamesAffected": 12
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Message varies: "Pack enabled successfully" or "Pack disabled successfully" based on the `enabled` value.
|
|||
|
|
|
|||
|
|
### Error Responses
|
|||
|
|
|
|||
|
|
| Status | Body | When |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| 400 | `{ "error": "enabled status required" }` | Missing `enabled` field |
|
|||
|
|
|
|||
|
|
### Example
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X PATCH "http://localhost:5000/api/games/packs/Jackbox%20Party%20Pack%207/toggle" \
|
|||
|
|
-H "Authorization: Bearer $TOKEN" \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{"enabled": true}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## POST /api/games/import/csv
|
|||
|
|
|
|||
|
|
Import games from CSV data. Default mode is `append`. Use `"replace"` to delete all existing games before importing.
|
|||
|
|
|
|||
|
|
### Authentication
|
|||
|
|
|
|||
|
|
Bearer token required.
|
|||
|
|
|
|||
|
|
### Request Body
|
|||
|
|
|
|||
|
|
| Field | Type | Required | Description |
|
|||
|
|
|-------|------|----------|-------------|
|
|||
|
|
| csvData | string | Yes | Raw CSV content (header + rows) |
|
|||
|
|
| mode | string | No | `"append"` (default) or `"replace"` |
|
|||
|
|
|
|||
|
|
**CSV columns:** Game Pack, Game Title, Min. Players, Max. Players, Length, Audience, Family Friendly?, Game Type, Secondary Type
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"csvData": "Game Pack,Game Title,Min. Players,Max. Players,Length,Audience,Family Friendly?,Game Type,Secondary Type\nJackbox Party Pack 7,Quiplash 3,3,8,15,Yes,No,Writing,\nJackbox Party Pack 7,The Devils and the Details,3,7,25,Yes,No,Strategy,",
|
|||
|
|
"mode": "append"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Response
|
|||
|
|
|
|||
|
|
**200 OK**
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"message": "Successfully imported 5 games",
|
|||
|
|
"count": 5,
|
|||
|
|
"mode": "append"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Error Responses
|
|||
|
|
|
|||
|
|
| Status | Body | When |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| 400 | `{ "error": "CSV data required" }` | Missing `csvData` |
|
|||
|
|
|
|||
|
|
### Example
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X POST "http://localhost:5000/api/games/import/csv" \
|
|||
|
|
-H "Authorization: Bearer $TOKEN" \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{
|
|||
|
|
"csvData": "Game Pack,Game Title,Min. Players,Max. Players,Length,Audience,Family Friendly?,Game Type,Secondary Type\nJackbox Party Pack 7,Quiplash 3,3,8,15,Yes,No,Writing,\nJackbox Party Pack 7,The Devils and the Details,3,7,25,Yes,No,Strategy,",
|
|||
|
|
"mode": "append"
|
|||
|
|
}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## PATCH /api/games/{id}/favor
|
|||
|
|
|
|||
|
|
Set favor bias for a single game. Affects weighted random selection in the picker.
|
|||
|
|
|
|||
|
|
### Authentication
|
|||
|
|
|
|||
|
|
Bearer token required.
|
|||
|
|
|
|||
|
|
### Path Parameters
|
|||
|
|
|
|||
|
|
| Name | Type | Description |
|
|||
|
|
|------|------|-------------|
|
|||
|
|
| id | integer | Game ID |
|
|||
|
|
|
|||
|
|
### Request Body
|
|||
|
|
|
|||
|
|
| Field | Type | Required | Description |
|
|||
|
|
|-------|------|----------|-------------|
|
|||
|
|
| favor_bias | integer | Yes | `1` = favor, `-1` = disfavor, `0` = neutral |
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"favor_bias": -1
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Response
|
|||
|
|
|
|||
|
|
**200 OK**
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"message": "Favor bias updated successfully",
|
|||
|
|
"favor_bias": -1
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Error Responses
|
|||
|
|
|
|||
|
|
| Status | Body | When |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| 400 | `{ "error": "favor_bias must be 1 (favor), -1 (disfavor), or 0 (neutral)" }` | Invalid value |
|
|||
|
|
| 404 | `{ "error": "Game not found" }` | Invalid ID |
|
|||
|
|
|
|||
|
|
### Example
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X PATCH "http://localhost:5000/api/games/1/favor" \
|
|||
|
|
-H "Authorization: Bearer $TOKEN" \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{"favor_bias": -1}'
|
|||
|
|
```
|