feat: artwork page carousels, recommendations, avatars & fixes

- Infinite loop carousels for Similar Artworks & Trending rails
- Mouse wheel horizontal scrolling on both carousels
- Author avatar shown on hover in RailCard (similar + trending)
- Removed "View" badge from RailCard hover overlay
- Added `id` to Meilisearch filterable attributes
- Auto-prepend Scout prefix in meilisearch:configure-index command
- Added author name + avatar to Similar Artworks API response
- Added avatar_url to ArtworkListResource author object
- Added direct /art/{id}/{slug} URL to ArtworkListResource
- Fixed race condition: Similar Artworks no longer briefly shows trending items
- Fixed user_profiles eager load (user_id primary key, not id)
- Bumped /api/art/{id}/similar rate limit to 300/min
- Removed decorative heart icons from tag pills
- Moved ReactionBar under artwork description
This commit is contained in:
2026-02-28 14:05:39 +01:00
parent 80100c7651
commit eee7df1f8c
46 changed files with 2536 additions and 498 deletions

View File

@@ -0,0 +1,33 @@
<?php
require __DIR__ . '/../vendor/autoload.php';
$app = require __DIR__ . '/../bootstrap/app.php';
$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
$rows = App\Models\ArtworkComment::where('artwork_id', 10)
->whereNotNull('parent_id')
->select('id', 'parent_id', 'content')
->orderByDesc('id')
->limit(15)
->get();
foreach ($rows as $r) {
echo "id={$r->id} parent_id={$r->parent_id} content=" . mb_substr($r->content, 0, 40) . PHP_EOL;
}
echo "\n--- Tree test (recursive eager-load) ---\n";
$top = App\Models\ArtworkComment::with(['approvedReplies'])
->where('id', 175742)
->get();
function printTree($comments, $indent = 0) {
foreach ($comments as $c) {
$prefix = str_repeat(' ', $indent);
$replies = $c->relationLoaded('approvedReplies') ? $c->approvedReplies : collect();
echo "{$prefix}[{$c->id}] " . mb_substr($c->content, 0, 40) . " ({$replies->count()} replies)\n";
if ($replies->count()) {
printTree($replies, $indent + 1);
}
}
}
printTree($top);