diff --git a/readme.md b/readme.md index 4e4416f..b271861 100644 --- a/readme.md +++ b/readme.md @@ -109,4 +109,61 @@ Currently active rules cover: cycles, controller→repository direction, reposit ### 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. \ No newline at end of file +- **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=&mood=&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). \ No newline at end of file