From 8ea63a6720311d1b9722db681c96c5c36b6c1de4 Mon Sep 17 00:00:00 2001 From: ghassan Date: Wed, 29 Jul 2026 00:39:47 +0300 Subject: [PATCH] Bust avatar/banner cache so new image shows on all pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After my previous fix the upload succeeds, but the avatar path is always .../profile/avatar., so its media URL never changes. Pages other than the channel (which cache-busts with ?t=) kept serving the browser-cached OLD image — the user "still saw the old avatar" on /videos. - avatar_url / banner_url accessors append ?v=. - updateAvatar / updateBanner now bump updated_at explicitly (the path is unchanged, so Eloquent wouldn't otherwise touch it), changing ?v so every page fetches the new image. Co-Authored-By: Claude Opus 4.8 --- app/Http/Controllers/UserController.php | 12 ++++++++++-- app/Models/User.php | 7 +++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index cc6f68d..756fe70 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -565,7 +565,11 @@ class UserController extends Controller rename($tempPath, $destPath); } - $user->update(['avatar' => $relPath]); + // Bump updated_at even when $relPath is unchanged (avatar.png -> avatar.png) + // so avatar_url's ?v cache-buster changes and every page shows the new image. + $user->avatar = $relPath; + $user->updated_at = now(); + $user->save(); if ($nas->isEnabled() && file_exists($destPath)) { $nas->syncAvatar($user, $destPath); @@ -602,7 +606,11 @@ class UserController extends Controller rename($tempPath, $destPath); } - $user->update(['banner' => $relPath]); + // Bump updated_at even when $relPath is unchanged so banner_url's ?v buster + // changes and the new banner shows everywhere (see updateAvatar). + $user->banner = $relPath; + $user->updated_at = now(); + $user->save(); if ($nas->isEnabled() && file_exists($destPath)) { $nas->syncCover($user, $destPath); diff --git a/app/Models/User.php b/app/Models/User.php index 3853e44..176e5fc 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -162,7 +162,10 @@ class User extends Authenticatable implements MustVerifyEmail public function getAvatarUrlAttribute(): string { if ($this->avatar) { - return route('media.avatar', $this->avatar); + // ?v busts the browser cache when the avatar is replaced. The path is + // always .../profile/avatar., so without a version every page would + // keep showing the previously cached image after an upload. + return route('media.avatar', $this->avatar).'?v='.($this->updated_at?->timestamp ?? '0'); } return 'https://i.pravatar.cc/150?u='.$this->id; @@ -171,7 +174,7 @@ class User extends Authenticatable implements MustVerifyEmail public function getBannerUrlAttribute(): ?string { if ($this->banner) { - return route('media.banner', $this->banner); + return route('media.banner', $this->banner).'?v='.($this->updated_at?->timestamp ?? '0'); } return null; }