188 lines
5.3 KiB
Markdown
188 lines
5.3 KiB
Markdown
|
|
# Game Status by Session
|
||
|
|
|
||
|
|
How to build a complete view of all enabled games—with popularity data and whether each game has been played in the current session. No single endpoint returns all three pieces today; this guide shows how to combine two public endpoints and join the results client-side.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 1. Fetch Enabled Games
|
||
|
|
|
||
|
|
`GET /api/games?enabled=true` returns every enabled game in the catalog. Each row includes `popularity_score`, `upvotes`, `downvotes`, `play_count`, and `favor_bias`.
|
||
|
|
|
||
|
|
**Why:** This gives you the full list of games that are available for play, along with their cumulative popularity data across all sessions.
|
||
|
|
|
||
|
|
See [Games endpoints](../endpoints/games.md) for all available filters (`playerCount`, `drawing`, `length`, `familyFriendly`, `pack`).
|
||
|
|
|
||
|
|
```bash
|
||
|
|
curl "http://localhost:5000/api/games?enabled=true"
|
||
|
|
```
|
||
|
|
|
||
|
|
**Sample 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": 4,
|
||
|
|
"popularity_score": 7,
|
||
|
|
"upvotes": 10,
|
||
|
|
"downvotes": 3,
|
||
|
|
"enabled": 1,
|
||
|
|
"favor_bias": 0,
|
||
|
|
"created_at": "2024-01-15T12:00:00.000Z"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"id": 5,
|
||
|
|
"pack_name": "Jackbox Party Pack 9",
|
||
|
|
"title": "Fibbage 4",
|
||
|
|
"min_players": 2,
|
||
|
|
"max_players": 8,
|
||
|
|
"length_minutes": 15,
|
||
|
|
"has_audience": 1,
|
||
|
|
"family_friendly": 1,
|
||
|
|
"game_type": "Trivia",
|
||
|
|
"secondary_type": null,
|
||
|
|
"play_count": 2,
|
||
|
|
"popularity_score": 3,
|
||
|
|
"upvotes": 5,
|
||
|
|
"downvotes": 2,
|
||
|
|
"enabled": 1,
|
||
|
|
"favor_bias": 1,
|
||
|
|
"created_at": "2024-01-15T12:00:00.000Z"
|
||
|
|
}
|
||
|
|
]
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2. Fetch Session Games
|
||
|
|
|
||
|
|
`GET /api/sessions/{id}/games` returns games that have been added to a specific session. Each row includes `status` (`playing`, `played`, or `skipped`), `played_at`, and joined popularity fields from the game catalog.
|
||
|
|
|
||
|
|
**Why:** This tells you which games have already been played (or are currently playing) in the session, so you can mark them in the catalog.
|
||
|
|
|
||
|
|
See [Sessions endpoints](../endpoints/sessions.md) for full details on session game fields.
|
||
|
|
|
||
|
|
```bash
|
||
|
|
curl "http://localhost:5000/api/sessions/5/games"
|
||
|
|
```
|
||
|
|
|
||
|
|
**Sample response (200 OK):**
|
||
|
|
|
||
|
|
```json
|
||
|
|
[
|
||
|
|
{
|
||
|
|
"id": 14,
|
||
|
|
"session_id": 5,
|
||
|
|
"game_id": 1,
|
||
|
|
"played_at": "2026-03-15T20:30:00.000Z",
|
||
|
|
"manually_added": 0,
|
||
|
|
"status": "played",
|
||
|
|
"room_code": "LSBN",
|
||
|
|
"player_count": 6,
|
||
|
|
"player_count_check_status": "completed",
|
||
|
|
"pack_name": "Jackbox Party Pack 7",
|
||
|
|
"title": "Quiplash 3",
|
||
|
|
"game_type": "Writing",
|
||
|
|
"min_players": 3,
|
||
|
|
"max_players": 8,
|
||
|
|
"popularity_score": 7,
|
||
|
|
"upvotes": 10,
|
||
|
|
"downvotes": 3
|
||
|
|
}
|
||
|
|
]
|
||
|
|
```
|
||
|
|
|
||
|
|
Key fields for the join:
|
||
|
|
|
||
|
|
| Field | Purpose |
|
||
|
|
|-------|---------|
|
||
|
|
| `game_id` | Matches `id` in the games catalog |
|
||
|
|
| `status` | `playing`, `played`, or `skipped` |
|
||
|
|
| `played_at` | When the game was added to the session |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3. Combine Client-Side
|
||
|
|
|
||
|
|
Join the two responses by matching `game_id` (from session games) to `id` (from the catalog). This produces a single list of enabled games annotated with their session play status.
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
const gamesRes = await fetch('/api/games?enabled=true');
|
||
|
|
const games = await gamesRes.json();
|
||
|
|
|
||
|
|
const sessionGamesRes = await fetch('/api/sessions/5/games');
|
||
|
|
const sessionGames = await sessionGamesRes.json();
|
||
|
|
|
||
|
|
const sessionGameMap = new Map(
|
||
|
|
sessionGames.map(sg => [sg.game_id, sg])
|
||
|
|
);
|
||
|
|
|
||
|
|
const combined = games.map(game => {
|
||
|
|
const sessionEntry = sessionGameMap.get(game.id);
|
||
|
|
return {
|
||
|
|
...game,
|
||
|
|
playedInSession: !!sessionEntry,
|
||
|
|
sessionStatus: sessionEntry?.status ?? null,
|
||
|
|
sessionPlayedAt: sessionEntry?.played_at ?? null,
|
||
|
|
};
|
||
|
|
});
|
||
|
|
```
|
||
|
|
|
||
|
|
**Sample merged output (one entry):**
|
||
|
|
|
||
|
|
```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",
|
||
|
|
"play_count": 4,
|
||
|
|
"popularity_score": 7,
|
||
|
|
"upvotes": 10,
|
||
|
|
"downvotes": 3,
|
||
|
|
"enabled": 1,
|
||
|
|
"favor_bias": 0,
|
||
|
|
"playedInSession": true,
|
||
|
|
"sessionStatus": "played",
|
||
|
|
"sessionPlayedAt": "2026-03-15T20:30:00.000Z"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
Games that have not been played in the session will have `playedInSession: false`, `sessionStatus: null`, and `sessionPlayedAt: null`.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Quick Reference
|
||
|
|
|
||
|
|
| Data point | `GET /api/games` | `GET /api/sessions/{id}/games` |
|
||
|
|
|------------|------------------|-------------------------------|
|
||
|
|
| Enabled status | `enabled` field + `?enabled=true` filter | Not included |
|
||
|
|
| Popularity score | `popularity_score`, `upvotes`, `downvotes` | `popularity_score`, `upvotes`, `downvotes` (joined) |
|
||
|
|
| All-time play count | `play_count` | Not included |
|
||
|
|
| Played in session | Not included | `status` field (`playing`/`played`/`skipped`) |
|
||
|
|
| Auth required | No | No |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Related Documentation
|
||
|
|
|
||
|
|
- [Games endpoints](../endpoints/games.md) — full catalog CRUD, filters, favor bias
|
||
|
|
- [Sessions endpoints](../endpoints/sessions.md) — session games, status updates, room codes
|
||
|
|
- [Picker endpoint](../endpoints/picker.md) — weighted random selection with session exclusion
|
||
|
|
- [Stats endpoint](../endpoints/stats.md) — `mostPlayedGames`, `topRatedGames`
|
||
|
|
- [Voting & Popularity guide](voting-and-popularity.md) — how votes and popularity scores work
|