59 lines
1.5 KiB
Markdown
59 lines
1.5 KiB
Markdown
# Most Downloaded
|
|
|
|
## Route
|
|
|
|
- URL: `GET /discover/most-downloaded`
|
|
- Controller: `App\Http\Controllers\Web\DiscoverController::mostDownloaded()`
|
|
- Service: `App\Services\ArtworkSearchService::discoverMostDownloaded()`
|
|
|
|
## What the page reads
|
|
|
|
This page is Meilisearch-ranked and then hydrated from MySQL.
|
|
|
|
## Search query
|
|
|
|
`discoverMostDownloaded()` uses:
|
|
|
|
- filter: `is_public = true AND is_approved = true`
|
|
- sort:
|
|
- `downloads:desc`
|
|
- `views:desc`
|
|
|
|
In the indexed document:
|
|
|
|
- `downloads` is sourced from `artwork_stats.downloads`
|
|
- `views` is sourced from `artwork_stats.views`
|
|
|
|
This is therefore an all-time leaderboard, not a rolling-window leaderboard.
|
|
|
|
## Where the download counts come from
|
|
|
|
Downloads are recorded in two places:
|
|
|
|
1. `artwork_downloads`
|
|
- full event log of each tracked download
|
|
2. `artwork_stats.downloads`
|
|
- all-time aggregate counter used by this page
|
|
|
|
The page sorts on the aggregate counter, not by counting the event log live.
|
|
|
|
## Background jobs and schedules
|
|
|
|
No dedicated page-specific cron exists.
|
|
|
|
Relevant active maintenance:
|
|
|
|
- `skinbase:flush-redis-stats` every 5 minutes
|
|
- pushes deferred Redis counters into MySQL
|
|
|
|
Window reset commands exist too, but they maintain `downloads_24h` and `downloads_7d` rather than the all-time `downloads` column used by this page.
|
|
|
|
## Cache behavior
|
|
|
|
- Cache key: `discover.most-downloaded.{page}`
|
|
- TTL: 300 seconds
|
|
|
|
## Notes
|
|
|
|
- This page is separate from `Today Downloads`.
|
|
- If you need "what is hot today by download activity," use the dedicated `/downloads/today` page instead. |