Skip to content

feat(game): add screenshot upload moderation back-end infra and demo page#4770

Open
wescopeland wants to merge 1 commit intoRetroAchievements:masterfrom
wescopeland:screenshot-moderation-backend-actions
Open

feat(game): add screenshot upload moderation back-end infra and demo page#4770
wescopeland wants to merge 1 commit intoRetroAchievements:masterfrom
wescopeland:screenshot-moderation-backend-actions

Conversation

@wescopeland
Copy link
Copy Markdown
Member

Builds on #4739.

This PR adds the foundational back-end actions required for approving or rejecting player-uploaded screenshots, as well as a barebones demo page to test drive these actions. There is no Filament UI yet, that will be the next PR.

How to test this PR
In your .env:

AWS_URL=http://localhost:${FORWARD_MINIO_PORT}/local
sail artisan horizon # restart

# two fields are added to support structured rejection reasons / optional notes
sail artisan migrate

Navigate to http://localhost:64000/demo/game-screenshot-moderation. This page is only accessible to users with Role::ROOT.

Assuming you have pending uploads from testing #4739, you'll see something that looks like this:
Screenshot 2026-04-12 at 1 05 23 PM

From here, you can approve or reject any of the pending screenshots. This page will be deleted in the next PR, it's just here for demo purposes to test the meat of the PR: ApproveGameScreenshotAction and RejectGameScreenshotAction.

On approve, you should observe:

  • In game_screenshots, the screenshot marked approved and review metadata is recorded on its row.
  • Media is moved from the pending collection to the live screenshots collection, which triggers transforms in Horizon (PerformConversionsJob).
  • If it is a title or completion screenshot, it becomes the new primary screenshot for the game of that type.
  • If a previous approved title/completion screenshot for the game existed, it is marked replaced and no longer shown on the game page.
  • If it is an in-game screenshot, it is added to the game's approved screenshot gallery.
  • If the current primary in-game screenshot has an invalid resolution and the new screenshot has a valid one, the new screenshot becomes primary and the old one is marked as replaced.

On reject, you should observe:

  • The screenshot is marked rejected and review metadata is recorded on its row.
  • The selected rejection reason and optional notes are stored.
  • The screenshot disappears from the pending moderation queue and remains non-public on the game page.

This is a sample of what I see in game_screenshots after initiating some actions on the page:
Screenshot 2026-04-12 at 1 08 33 PM

@wescopeland wescopeland requested a review from a team April 12, 2026 17:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant