Commit Graph
95 Commits
Author SHA1 Message Date
adrianbonpin 027d3ac8fc feat: auto-pin entries with ≥10 votes and ≥80% approval 2026-05-09 22:32:19 +08:00
adrianbonpin 8ea160bd05 feat: accept tdpWatts and youtubeVideoId in performance submit/edit APIs 2026-05-09 22:29:34 +08:00
adrianbonpin 02bdbe2825 feat: include wattHours, tdpMax, and batteryLife in hardware and game stats APIs 2026-05-09 22:25:34 +08:00
adrianbonpin 32386ce170 fix: resolve all ESLint errors and warnings
- Replace  types with  and proper type casting
- Remove unused imports and variables across multiple files
- Fix React set-state-in-effect by suppressing with eslint-disable
- Wrap handleFile in useCallback to stabilize hook dependencies
- Remove dead MetaItem component from game-page-client
- Add public/sw.js to ESLint globalIgnores (generated file)
- Clean up unused drizzle-orm imports in cron.ts, dashboard-public.ts
- Remove unused _configured flag from r2-client.ts
2026-05-09 16:38:29 +08:00
adrianbonpin 03428bdd0b feat: add admin sitemap regeneration endpoint and cron task 2026-05-09 13:30:38 +08:00
adrianbonpin c6a9b448d3 feat: add advanced filters and saved filter presets to search page 2026-05-09 13:27:59 +08:00
adrianbonpin 2f4f0250df feat: add public dashboard API routes for trending, best new, most tested, most reported 2026-05-09 13:07:52 +08:00
adrianbonpin 20f1d33751 feat: add profile photo upload/delete API routes with R2 storage 2026-05-09 12:54:12 +08:00
adrianbonpin 6009366fb4 feat: add modular daily cron system with storage cleanup and orphan detection 2026-05-09 12:50:16 +08:00
adrianbonpin dcf6066b2b feat: sitemap remediation, PWA activation, search refinements, Steam Deck UX
Sitemap:
- Switch from ISR (revalidate=3600) to force-dynamic for per-request generation
- Flatten into single app/sitemap.ts with inlined static entries and DB queries
- NULL-safe syncStatus filter: ne(games.syncStatus, 'failed') OR isNull(games.syncStatus)
- Structured JSON logging for generated URLs and DB errors
- Delete lib/sitemap/* helpers and app/api/revalidate-sitemap route
- Add basic vitest coverage for sitemap exports

PWA & Offline:
- Add @serwist/next service worker (webpack build) with runtime caching
- Cache strategies: stale-while-revalidate for game pages, network-first for listings/API,
  cache-first for Steam CDN images
- Offline fallback page (public/offline.html)
- Manifest icons: 192px maskable + 512px any
- Viewport meta with viewport-fit=cover, user-scalable=no
- Apple mobile web app meta tags

Search / Filter Refinements:
- Multi-genre OR support in listing API (comma-separated genres)
- Device-scoped FPS filter (min/max FPS constrained to selected device)
- Client-side URL state sync via router.replace for shareable filtered views
- Initialize filter state from URL params on mount
- Auto-collapse filter panel on saved-filter load
- Fix multi-genre saved filter parsing (comma-separated)

Steam Deck / Touch / Gamepad UX:
- WCAG 2.1 AA touch targets (44x44px) on all filter controls
- .gamepad-focus CSS focus ring for controller navigation
- useGamepadNavigation hook: D-pad/left-stick roving tabindex, A/B/X/Y actions
- Integrate gamepad hook into games page (X=search, Y=toggle filters)

Chore:
- Bump version to 2026.0.97
2026-05-05 16:20:28 +08:00
adrianbonpin b627a15a21 refactor: game-stub route now uses ensureSteamGame pipeline 2026-05-05 02:05:36 +08:00
adrianbonpin 863358a8fd fix: resolve Next.js 16 build errors
- Extract Elysia app from route.ts into lib/api/app.ts to avoid
  Next.js 16 invalid export validation ('app' is not a valid route
  export field)
- Remove runtime='nodejs' from opengraph-image.tsx (invalid segment
  config in Next.js 16)
- Replace computed revalidate expression in sitemap.ts with literal
  (Next.js cannot statically evaluate BinaryExpression for segment
  configs)
- Update eden.ts imports to match new app.ts location
2026-05-05 00:36:17 +08:00
adrianbonpin ca08024cb5 feat: updates page and lint fixes 2026-05-01 10:15:13 +08:00
adrianbonpin 824fbbd13f feat: rearrange game benchmark wizard and improve overall 2026-05-01 01:18:13 +08:00
adrianbonpin 293aadbff0 fix: sequential sync with 1.5s delay to avoid Steam rate limiting 2026-04-30 23:13:28 +08:00
adrianbonpin 583486de1a feat: streaming progress for bulk sync - real-time updates 2026-04-30 23:09:35 +08:00
adrianbonpin e38a2fabe7 fix: better error handling for bulk sync, fix NaN% progress display 2026-04-30 23:04:51 +08:00
adrianbonpin 5f037481ec perf: parallel bulk sync with 5 concurrent requests, remove 100-game limit 2026-04-30 22:59:28 +08:00
adrianbonpin 2620023a96 fix: steam reviews pagination - fetch more and slice instead of broken cursor 2026-04-30 22:05:42 +08:00
adrianbonpin fccef57d43 fix: auto-recalculate playability on benchmark submit and sync, fix anti-cheat logic for games without anti-cheat 2026-04-30 21:35:38 +08:00
adrianbonpin a9f78ef74c fix: remove duplicate /api prefix from new routes 2026-04-30 21:27:07 +08:00
adrianbonpin 244a29bd1b feat: create dashboard overview API endpoint
Add /api/dashboard/stats route that provides admin dashboard statistics:
- Total counts (games, benchmarks, users)
- Pending moderation items (reports, suggestions)
- 30-day activity metrics (recent benchmarks, recent games)
- Top 10 contributors by entry count
- Sync health breakdown by status
- Games by source distribution
- Playability distribution

Auth: requireContributorOrAdmin guard
Route registered in lib/api/index.ts
2026-04-30 20:44:27 +08:00
adrianbonpin 5f4d618d85 Task 18: Add playability, anti-cheat, and steam review badges to search results 2026-04-30 20:32:04 +08:00
adrianbonpin 32d52cf3ba Task 17: Revamp Games List with New Filters & Badges
- Add new filter state variables (min/max FPS, FSR, Proton/Native, anti-cheat,
  playability, Steam review score, free-to-play, multiplayer)
- Expand sort options to include performance, popularity, release_date, steam_reviews
- Add Performance, Compatibility, and Other filter UI sections with inputs
- Integrate SavedFilters component for saving/loading filter presets
- Add PlayabilityBadge and AntiCheatBadge to game cards
- Update API listing to return antiCheatRelevant/antiCheatStatus per game
- Update server-side games page to include new fields in initialGames
- Update clear-filters logic across filter panel and empty state
2026-04-30 20:25:57 +08:00
adrianbonpin 32d197113e feat: extend games listing API with new filters and sort options
Add 8 new filter parameters to GET /api/games/listing:
- minFps/maxFps: filter games with benchmarks in FPS range
- fsrSupport: filter games that have FSR entries
- protonNative: filter by proton status (proton/native/both)
- antiCheatStatus: filter by anti-cheat support status
- playabilityStatus: filter by playability (great/playable/needs_tweaks/unplayable)
- steamReviewScore: minimum Steam review score threshold
- isFree: filter free-to-play games
- hasMultiplayer: filter games with multiplayer support

Add 4 new sort options:
- performance: sort by average FPS (subquery)
- popularity: sort by recommendationsTotal
- release_date: sort by releaseDate
- steam_reviews: sort by steamReviewScore

Also returns additional fields in response: isFree, releaseDate,
steamReviewScore, recommendationsTotal, playabilityStatus,
onlineMultiplayerStatus.
2026-04-30 19:50:38 +08:00
adrianbonpin e7cc4d6a2e feat: add Saved Filters CRUD API
- Create lib/api/saved-filters.ts with GET, POST, PATCH, DELETE endpoints
- All endpoints require authentication via requireAuth guard
- Users can only access their own saved filters
- Register savedFilterRoutes in lib/api/index.ts
2026-04-30 19:42:55 +08:00
adrianbonpin 09fde413b9 feat: add community suggestions API with CRUD, moderation, and Discord webhook notifications
- POST /api/community-suggestions - submit suggestion (auth required)
- GET /api/community-suggestions/game/:gameId - list suggestions for a game
- GET /api/community-suggestions/pending - moderation view (contributor/admin)
- PATCH /api/community-suggestions/:suggestionId/review - approve/reject
- Discord webhook notification on new suggestions
- Route registered in API index and app router
2026-04-30 19:38:44 +08:00
adrianbonpin f9617bf586 feat: add Steam Reviews display API with caching
- Create lib/api/steam-reviews.ts with in-memory cache (1hr TTL)
- Proxy endpoint for fetching Steam reviews by game ID
- Supports offset/limit/language query params
- Registers route in API index and app router
2026-04-30 19:32:35 +08:00
adrianbonpin 051c5c22df feat: add playability calculation API
- Auto-calculate playability from benchmark data (FPS, anti-cheat, upscaler dependency)
- Manual override by admins/contributors
- Clear override to revert to auto-calculated
- Three endpoints: /calculate/:gameId, /override/:gameId, /clear-override/:gameId
- Calculation logic: great (≥55 FPS, no upscaler), playable (≥30 FPS), needs_tweaks (≥20 FPS), unplayable (<20 FPS or anti-cheat unsupported)
2026-04-30 19:22:27 +08:00
adrianbonpin d79a2605ed fix: resolve type errors and lint warnings in sync system 2026-04-29 11:46:35 +08:00
adrianbonpin a4cf2636e7 feat: add image validation and SteamGridDB fallback to game stub creation 2026-04-29 11:36:38 +08:00
adrianbonpin 06e811613d fix: add bulk sync limit (100), fix N+1 queries, improve route ordering and responses 2026-04-29 11:19:19 +08:00
adrianbonpin 5d388f6f49 feat: add sync API endpoints (single + bulk) 2026-04-29 10:58:21 +08:00
adrianbonpin 133a4a9cc2 fix: resolve lint warnings - remove unused imports and fix type annotations 2026-04-29 01:47:11 +08:00
adrianbonpin 7903c9fbbd Tasks 12-13: Fix release date input to type=date, add sort direction toggle to games page 2026-04-29 01:45:04 +08:00
adrianbonpin 8a063bfb6c fix: include benchmark games in device filter and exclude soft-deleted entries from search
Task 10: Device filter now combines games with platform support entries
AND games with performance entries for the selected hardware, instead of
only checking gamePlatformSupport. This ensures games that have benchmarks
but no explicit platform support entry still appear in filtered results.

Task 11: The benchmark count query (bCounts) in unified search now filters
out soft-deleted performance entries using isRemoved = false. The pCounts
and perfStats queries already had this filter; only bCounts was missing it.
2026-04-29 01:43:37 +08:00
adrianbonpin b64e55157e fix: add horizontal scroll to benchmarks table, add hard delete functionality
- Wrap table in overflow-x-auto container with min-w-[800px] to prevent overflow on smaller screens
- Add hard delete (purge) button to actions column for each benchmark entry
- Add confirmation dialog for permanent deletion with warning
- Add handleHardDelete handler that calls DELETE /api/admin/performance/:id/hard-delete
- Add DELETE endpoint for hard-deleting performance entries from the database
- Expand confirmAction state type to include 'hardDelete'
2026-04-29 01:38:29 +08:00
adrianbonpin 0f0176ae39 feat: add compare API endpoints for games and presets 2026-04-29 00:36:21 +08:00
adrianbonpin b8173bd8f8 feat: non-Steam game editing API, createdBy tracking, and source badges in search 2026-04-29 00:16:43 +08:00
adrianbonpin c6d4e7b3d1 feat: non-Steam game submission wizard with SteamGridDB integration 2026-04-29 00:00:10 +08:00
adrianbonpin 74fe0447ee feat: add SteamGridDB proxy API for non-Steam game images 2026-04-28 23:36:00 +08:00
adrianbonpin cc34fd17ef feat: add pinned presets with admin pin/unpin and dedicated section 2026-04-28 23:32:32 +08:00
adrianbonpin 799bfbbf31 feat: add system requirements, store stats, and pricing to game schema and steam sync 2026-04-28 23:13:08 +08:00
adrianbonpin 7e2ab978e1 feat: add performance tier and stability scatter charts 2026-04-28 23:08:01 +08:00
adrianbonpin 741c19e840 feat: display 1% low FPS in presets, stats API, and game details 2026-04-28 22:56:43 +08:00
adrianbonpin 4d759160db feat: add 1% low FPS field to benchmark submission wizard 2026-04-28 22:43:46 +08:00
adrianbonpin ab27ba948f fix: add image fallback chain for missing game covers in search 2026-04-28 22:30:19 +08:00
adrianbonpin d6a9601591 fix: refactor wizard edit mode to use lazy state init instead of effect setState 2026-04-28 09:51:26 +08:00
adrianbonpin 37c5d87baa Add admin benchmarks page with search, filter tabs, pagination, verify/remove/restore actions 2026-04-28 08:31:36 +08:00
adrianbonpin 2ab4ac5ebc feat: add admin comments API route
- GET /admin/comments: list all comments with pagination, removed filter, and author search
- PATCH /admin/comments/:id/remove: admin-only soft delete
- PATCH /admin/comments/:id/restore: admin-only restore
2026-04-28 07:55:57 +08:00