Commit Graph
12 Commits
Author SHA1 Message Date
Darkraise 9c85284798 fix(settings): show the real web app version
The card always displayed 1.0.0. VITE_APP_VERSION was never set: CI
passes the release tag as a VERSION build arg, but the Dockerfile never
declared it or forwarded it to the frontend build, so the hardcoded
fallback always won.

Declare the build arg and export it as VITE_APP_VERSION, and resolve the
version in vite.config.ts for every other build: the env var, then the
release tag via git describe, then package.json. The image version label
was pinned at 1.0.0 for the same reason and now follows the arg too.
2026-08-12 21:32:49 +07:00
Darkraise 74aa0cf067 feat(startup): serve the app while the server warms up
On a network share the database copy and cache pre-warm run for minutes,
and the listener only opened after all of it, so anyone who loaded the
page during that window got a connection error.

Open the port immediately after registering the static frontend, and
hold every route that needs the database behind a gate that answers 503
with a machine-readable marker and the current startup phase. The SPA
shell needs nothing the gate blocks, so the frontend renders a "server
is starting" screen on the login page's own background, polls /health,
and reloads once the server reports ready.

Move the database copy out of the entrypoint: it does the same freshness
check the application does, and doing it before node starts kept the port
closed for the longest part of startup. Distinguish a dead server from a
slow one by requiring the backend's own marker, since a proxy in front of
a stopped backend still answers.
2026-08-12 14:05:14 +07:00
Darkraise 79cc256214 fix: harden downloads, settings, and UI edge cases
- Integrate DownloadRegistry into concurrent download limit
  and clean up timers on removal/clear
- Wrap MetadataSyncService batch deletes in single transaction
- Always re-throw checksum errors in RuffleService to prevent
  verification bypass
- Fix system-settings early return skipping second job update
  when first cron expression is invalid
- Increase DatabaseService hot-reload grace period to 30s
- Add permission guard to metadata sync status endpoint
- Use encodeURIComponent for game launch content URLs
- Clamp limit params to minimum of 1 in jobs routes
- Use non-null assertion for authenticated user permissions
- Fix ConfirmDialog not calling onCancel on overlay dismiss
- Guard FormattedDate against invalid date strings
- Add breadcrumbContext to GameListItem memo comparison
- Fix MetadataUpdateCard stale closure in interval callback
- Move Dockerfile healthcheck to docker-compose for flexibility
- Fix build:analyze script to set VITE_ANALYZE env var
2026-02-11 20:37:06 +07:00
Darkraise 7d3d64903f fix: harden security, data integrity, and resource management
- Eliminate `new Promise(async ...)` anti-pattern in GameDataDownloader
- Add TOCTOU-safe transactions in DomainService, FavoritesService,
  DownloadManager, and UserService (cascading delete)
- Add path traversal protection in PlaylistService (UUID validation)
- Add Zip Slip protection and backup restore in RuffleService
- Escape LIKE wildcards in GameService search queries
- Cache ZIP entry metadata to avoid re-reading entries on every lookup
- Fix login lockout query to check username/IP independently
- Cache null values in CachedSystemSettingsService to avoid repeated
  DB queries for missing keys
- Chunk MetadataSyncService upserts to stay under SQLite variable limit
- Add GitHub stars endpoint caching (15min TTL) to respect rate limits
- Deduplicate concurrent proxy cache writes via pending-write tracking
- Prevent infinite retry loop in DatabaseService syncAndReload
- Fix `useEffect` dependency issues with callback refs in
  MaintenanceGuard, useLazyLoad, useSwipeGesture, GameDetailView
- Handle async errors in MaintenancePage polling and MetadataUpdateCard
- Add null-safe guards for dashboard statistics rendering
- Validate settings category, timeRange, and batch size limits
- Sanitize error messages to avoid leaking internals to clients
- Stream error log file reads instead of loading entire file into memory
- Narrow `SELECT u.*` to explicit columns in AuthService
- Remove `themeColor`/`surfaceColor` from auth response payload
- Fix "playlistGames" typo in UserPlaylistDetailView
- Tighten `isApiError` type guard to require status/code/response
- Add `maxContentLength` to external HTTP requests
- Add null-byte rejection in proxy path validation
- Use URL constructor for safe logo URL derivation
- Add shared playlist validation middleware to game validate endpoint
- Add `res.destroyed` checks in GameZipServer before/after async lookup
- Proper listener cleanup in proxy `collectRequestBody`
- Add `.unref()` to PermissionCache cleanup interval
- Add `SharedPlaylistView` auth gate for query enablement
2026-02-08 08:25:33 +07:00
Darkraise 96cf4a5b00 feat: revamp the game serving feature 2026-02-07 23:36:45 +07:00
Darkraise 12792db185 chore: apply consistent code formatting across codebase 2026-02-04 06:03:39 +07:00
Darkraise 5b574a910a ci: update frontend build 2026-02-03 18:17:36 +07:00
Darkraise e1a691e497 feat: share playlist feature 2026-01-31 17:29:07 +07:00
Darkraise 80a506bf3e feat: polish some features 2026-01-28 19:21:02 +07:00
Darkraise 896a1771aa feat: refactor FilterPanel with reusable FilterDropdown component
- Consolidate duplicate filter UI code by migrating all filters
(platform, series, developer, publisher, play mode, language, tags)
to use the FilterDropdown component across desktop and mobile layouts.
- Add compact mode to FilterDropdown for space-efficient mobile display.
- Implement accessibility improvements with skip navigation links in
AppShell for keyboard users.
- Optimize build configuration with manual code-splitting strategy for vendor libraries, charts, icons, forms,
and UI primitives to improve initial load performance.
2026-01-25 15:51:42 +07:00
Darkraise 0a3272d613 feat: polish the features and enhance UI/UX 2026-01-23 00:49:12 +07:00
Darkraise c7b617cf08 feat: initial features 2026-01-16 23:58:21 +07:00