Add Core-owned product roadmap to README

Captures the Core slices of the cross-service product roadmap: per-game
tracking schema (status, rating, notes, completion date), picker
endpoint, HLTB integration, achievement aggregation, goals + digest
data, wishlist + sale alerts, library enrichment, and public profile
data. Cross-links to the umbrella roadmap in ToBePlayed-Deployment.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Andreas DahmandClaude Opus 4.7 committed 2026-05-11 14:51:29 +02:00
1 parent 32339e2ff5
commit b7efe27a54
1 file changed
+58 -1
+58 -1
View File
@@ -109,4 +109,61 @@ Currently active rules cover: cycles, controller→repository direction, reposit
### CI ### CI
- **Wire the ArchUnit + scaffolding into the existing Forgejo Actions quality gate.** `./mvnw verify` already runs them; confirm CI fails (not just warns) on architecture violations so drift is caught before merge. - **Wire the ArchUnit + scaffolding into the existing Forgejo Actions quality gate.** `./mvnw verify` already runs them; confirm CI fails (not just warns) on architecture violations so drift is caught before merge.
## 🎯 Product Roadmap (Core-owned slices)
The full cross-service product roadmap lives in `ToBePlayed-Deployment/README.md`. This section lists only the slices that land in Core, in suggested execution order.
### 1. Per-game tracking — the namesake feature
Today `user_game` mirrors Steam ownership and playtime, nothing else. Closing this gap turns the library from a Steam mirror into an actual backlog tracker.
- Add a `status` column on `user_game` (`BACKLOG / PLAYING / COMPLETED / DROPPED / ON_HOLD / WISHLIST`) with a Flyway migration. Default at import: playtime > 0 → `PLAYING`, otherwise `BACKLOG`.
- Add `rating` (smallint 1–10, nullable), `completed_at` (timestamp, nullable), `notes` (text, markdown, server-side rendered or sanitised on read).
- Endpoint: `PATCH /api/library/games/{appid}` for partial updates of these fields. Stick with query-parameter versioning (`?v=1`).
- Endpoint: filter `GET /api/library/games?status=BACKLOG` (extend the existing pagination contract).
- New module candidate or extend `library` — keep it in `library` until tracking grows its own queries / reports, then split.
### 2. Picker / "what to play next"
- Endpoint: `GET /api/library/picker?budget=<minutes>&mood=<tag>&count=3`. Pure read, uses status + (eventually) HLTB hours + tags as filters. Randomised within filter set.
- No new persistence yet; build it on top of (1).
### 3. HowLongToBeat integration
- New module `core_service.modules.hltb` (or `library/hltb` if kept internal). External adapter pattern mirrors `steam_adapter`.
- Schema: `game_completion_time(appid, main_hours, plus_sides_hours, completionist_hours, fetched_at)`.
- Scheduled job to backfill + refresh (low cadence: monthly).
- Risk: HLTB has no official API; community libs scrape. Cache aggressively, degrade gracefully when missing.
### 4. Achievement aggregation (data already in place)
- `UserGameAchievement` + `GameAchievementSchema` are already synced. Add aggregate endpoints:
- `GET /api/library/games/{appid}/achievements/summary` → `{ unlocked, total, percent }`.
- `GET /api/library/me/achievements/summary` → library-wide unlocked / total / percent.
- `GET /api/library/me/achievements/closest-to-completion?limit=10`.
- Pure SQL views or projection DTOs; no new external calls.
### 5. Goals and digests
- Schema: `user_goal(user_id, year, target_games_completed, ...)`.
- Endpoint: `GET/PUT /api/library/me/goal?v=1`.
- Scheduled weekly digest job: aggregate per-user "played hours, backlog delta, status changes" for last 7 days. Push to Auth (which owns email) or to a notification queue.
### 6. Wishlist + sale alerts
- Extend `steam_adapter` with a wishlist endpoint.
- New module / adapter for IsThereAnyDeal price polling.
- Scheduled job; threshold per-user; trigger an email via Auth.
### 7. Library enrichment
- Genre / tag filters: Steam store tags exist in some Steam API responses — verify which calls return them and add to the cache.
- DLC awareness: Steam's `GetAppDetails` returns DLC; persist a `game_dlc(appid_base, appid_dlc)` table and a `GET .../games/{appid}/dlc` endpoint.
- Series / franchise grouping: needs IGDB integration (separate adapter, requires a free IGDB OAuth token).
- **Multi-platform support**: bigger schema change. Decouple `Game` (platform-agnostic) from `SteamGame` (platform-specific). New `source` enum (`STEAM`, `GOG`, `EPIC`, `MANUAL`, ...). Defer until at least one non-Steam adapter is on the immediate horizon.
### 8. Public profile data
- Endpoint: `GET /api/public/users/{username}/profile` returning currently-playing + recently-completed + total hours, gated by a `profile_public` flag (owned by Auth, mirrored or fetched on demand).