Commit Graph

313 Commits

Author SHA1 Message Date
nendo
75302ed59a Add play session ingest for game time tracking
Backend API for collecting and querying play sessions, modeled after
the Argosy session data format. Clients submit batches per device,
recording both the session window and screen-on time.
2026-03-22 20:22:55 +09:00
Georges-Antoine Assi
997e2c44aa start pre-4.8 cleanup 2026-03-12 23:02:12 -04:00
Zurdi
4c680f4919 Merge pull request #3121 from Bergbok/playable-filter-fix
fix: add missing platforms to playable game filter
2026-03-11 16:24:00 +01:00
Bergbok
99e41cecc2 refactor: create list for playable platforms that don't use EJS 2026-03-11 17:18:13 +02:00
Bergbok
ed61158aee fix: include DOS, Game Boy Color and Sega 32X games in playable filter 2026-03-11 16:40:39 +02:00
Bergbok
cad510a0b0 refactor: remove duplicate C64 entry from EJS_SUPPORTED_PLATFORMS 2026-03-11 16:37:49 +02:00
Bergbok
8517fb9aca fix: include browser games in playable filter 2026-03-11 16:11:08 +02:00
Georges-Antoine Assi
6f02a4beff Merge pull request #3114 from tmgast/feature/client-api-tokens
Add client API tokens with QR pairing flow
2026-03-10 22:17:05 -04:00
nendo
e0b25fbc6c feat(client-tokens): add client API tokens with QR pairing flow
Long-lived, revocable, scope-restricted tokens for external clients
(mobile apps, retro handhelds, third-party tools). Includes:

- Backend: model, migration, DB handler, auth integration (rmm_ prefix
  routing in HybridAuthBackend), CRUD + pairing + exchange endpoints,
  rate limiting, scope intersection enforcement, admin oversight
- Frontend: settings page with token management table, stepped
  create/deliver dialog (config -> copy/pair), QR code with RomM logo,
  admin token table, standalone /pair page for QR scan landing
- /pair page supports custom-scheme callbacks for app deep linking,
  falls back to displaying code for manual entry
- 33 backend tests across 5 classes (CRUD, auth, isolation, pairing,
  admin)
2026-03-11 10:56:35 +09:00
Georges-Antoine Assi
0c18c2588c run fmt 2026-03-10 21:47:27 -04:00
cc
a4e8d9df49 fix: sort without mutating store, move constants to module scope
- Spread allPlatforms before sorting to avoid mutating Pinia store
- Move _METADATA_SOURCE_COLUMNS to module level
- Add optional chain on sourceInfo v-img src

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 20:09:19 -04:00
cc
52c53505a1 refactor: address review feedback
- Derive metadata source columns from Rom model instead of hardcoded list
- Replace getOrderedCoverage() function calls with a computed map to avoid
  redundant sorting on each render

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 19:27:50 -04:00
cc
778097f4a0 feat: add per-platform metadata coverage and region breakdown to server stats
Enhances the server stats page with two new per-platform statistics:
- Metadata coverage: shows which sources matched ROMs (ordered by user's scan priority config)
- Region breakdown: shows ROM counts per region with flag emojis

Backend adds two new efficient queries (single GROUP BY for metadata, Python-side aggregation for regions).
Frontend redesigns platform cards with a tabular detail layout, size bar visualization, and expandable region chips.

> This PR was developed with AI assistance (Claude Code) per CONTRIBUTING.md disclosure requirements.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 22:15:08 -04:00
Georges-Antoine Assi
e3d9bfe9fa fix migration 2026-03-08 20:14:14 -04:00
copilot-swe-agent[bot]
ae73da7c27 Fix 500 error from empty fs_name_no_tags causing mass sibling matching and incorrect ROM grouping
- Add migration 0071 to fix sibling_roms view: add guard against empty string matching for fs_name_no_tags
- Fix group_by_meta_id in filter_roms: use func.nullif to treat empty fs_name_no_tags as NULL in grouping key
- Add group_by_meta_id support to get_roms_scalar
- Add tests for sibling matching behavior with empty/non-empty fs_name_no_tags

Co-authored-by: gantoine <3247106+gantoine@users.noreply.github.com>
2026-03-08 23:17:51 +00:00
Georges-Antoine Assi
2905328c9e update comments 2026-03-08 11:39:41 -04:00
Georges-Antoine Assi
29a5b8edf2 fix on mariadb 2026-03-08 10:15:08 -04:00
Georges-Antoine Assi
72d04b1ec7 fixes 2026-03-08 10:08:50 -04:00
Georges-Antoine Assi
708105aabd Hack for natural sorting of roms 2026-03-08 09:51:51 -04:00
Georges-Antoine Assi
2706927cbc fix bug with exclusion criteria 2026-02-19 10:32:55 -05:00
Georges-Antoine Assi
d3aa1b7c44 prefer exact stem matches first 2026-02-19 10:27:17 -05:00
Georges-Antoine Assi
6461078721 loosen rules around fetch matching screenshots 2026-02-19 10:18:56 -05:00
Georges-Antoine Assi
fe5b831afc Add Rom.ra_hash and RomFile.ra_hash fields to API 2026-02-13 11:11:02 -05:00
Georges-Antoine Assi
66ee72431e fix bot comment 2026-02-08 21:23:42 -05:00
Georges-Antoine Assi
16cac7cf64 [ROMM-2972] Fix /props returning stale data 2026-02-08 21:10:12 -05:00
Georges-Antoine Assi
5596999a3b one last regression 2026-02-07 22:46:09 -05:00
Georges-Antoine Assi
cb85d70b83 extract filter into own block 2026-02-07 22:27:44 -05:00
Georges-Antoine Assi
3e86e55994 changes from bot review 2026-02-07 22:02:15 -05:00
Georges-Antoine Assi
2d678ef19f [ROMM-2976] Fix no games displayed for status filter 2026-02-07 21:27:24 -05:00
Georges-Antoine Assi
4733a86302 [ROMM-2983] Fix negative filter by verified 2026-02-07 15:44:03 -05:00
Georges-Antoine Assi
37436fddb7 changes from self review 2026-02-06 10:31:08 -05:00
Georges-Antoine Assi
e36d7650e7 [ROMM-2989] Split search term by | 2026-02-06 10:20:14 -05:00
Georges-Antoine Assi
0da88e4727 Merge pull request #2984 from zeroSteiner/fix/issue/2451
Fix #2451: Group games with same name but different tags as versionsr
2026-02-03 23:27:41 -05:00
Spencer McIntyre
624f4ce14d Update the romm view to group by fs no tag 2026-02-03 20:22:59 -05:00
nendo
220d7531e7 refactor(saves): replace order_by_updated_at_desc with flexible order_by
Add order_by and order_dir parameters to get_saves() for flexible
sorting. Supports "updated_at" and "created_at" fields with "asc" or
"desc" direction (default: desc). Enables ascending order for pruning
scenarios.
2026-02-03 20:06:09 +09:00
nendo
a6ecfb738c feat(devices): add duplicate device registration handling
Add fingerprint-based detection for duplicate device registration with
configurable behavior via new body params:
- allow_existing: return existing device if fingerprint matches
- allow_duplicate: skip fingerprint check, always create new device
- reset_syncs: clear tracked saves when reclaiming existing device

Fingerprint matching uses mac_address (primary) or hostname+platform
(fallback). Returns 409 Conflict with device_id when duplicate detected
without flags, 200 OK for existing device, 201 Created for new.
2026-02-03 20:03:50 +09:00
nendo
a236123e4f feat(saves): add slot-based save sync with content hash deduplication
- Add device registration and save synchronization
- Implement slot-based save organization with datetime tagging
- Add conflict detection for multi-device sync scenarios
- Add content hash computation for save deduplication
- Support ZIP inner-file hashing for consistent deduplication
- Add confirm_download endpoint for sync state management
- Add overwrite parameter to bypass conflict checks
2026-01-31 21:57:22 +09:00
Georges-Antoine Assi
24fef1139b Merge branch 'master' into feature/device-registration-save-sync 2026-01-28 19:42:57 -05:00
Georges-Antoine Assi
67efe62935 Merge branch 'master' into only-ids-param 2026-01-28 14:47:10 -05:00
Georges-Antoine Assi
b49522e3e8 changes from bot review 2026-01-22 15:27:18 -05:00
Georges-Antoine Assi
7f5130c9b8 Add NONE support for filter logic operators 2026-01-22 13:47:55 -05:00
Georges-Antoine Assi
e9b6fa202b tweak some db code 2026-01-19 09:47:55 -05:00
Georges-Antoine Assi
6eb888416f final manual clenaup 2026-01-18 22:51:43 -05:00
Georges-Antoine Assi
bddb7bd9f5 manual cleanup 2026-01-18 22:27:46 -05:00
Georges-Antoine Assi
3ccc14d4a2 add endpoints for identifiers 2026-01-18 22:17:37 -05:00
Georges-Antoine Assi
54bfb3fec5 DB functions accept list of params 2026-01-18 21:26:48 -05:00
nendo
36eec298d1 Add device-based save synchronization
Implement device registration and save sync tracking to enable
multi-device save management with conflict detection.

- Device CRUD endpoints (POST/GET/PUT/DELETE /api/devices)
- Save sync state tracking per device
- Conflict detection on upload (409 when device has stale sync)
- Download sync tracking (optimistic and confirmed modes)
- Track/untrack saves per device
- DEVICES_READ/WRITE scopes for authorization
2026-01-18 16:50:44 +09:00
Brandon T. Kowalski
5cb71c920f Added updated_after query parameter for normal and smart collections and migration to add corresponding indexes to each table. 2026-01-17 23:25:02 -05:00
Georges-Antoine Assi
b34117591a Merge pull request #2904 from rommapp/roms-filter-endpoint
ROMs filter endpoint + refactor
2026-01-16 19:14:37 -05:00
Georges-Antoine Assi
bc564fd1c1 Merge pull request #2898 from BrandonKowalski/feature/updated-after-query-param
[ROMM-2874] Feature/updated-after-query-param
2026-01-16 17:24:11 -05:00