Browse Source

Add avatar cache busting logic

Daniel Supernault 7 years ago
parent
commit
d6970d930f

+ 5 - 3
app/Http/Controllers/Api/BaseApiController.php

@@ -2,7 +2,7 @@
 
 namespace App\Http\Controllers\Api;
 
-use Auth;
+use Auth, Cache;
 use App\{
     Avatar, 
     Like, 
@@ -83,15 +83,16 @@ class BaseApiController extends Controller
         ]);
         try {
           $user = Auth::user();
+          $profile = $user->profile;
           $file = $request->file('upload');
           $path = (new AvatarController())->getPath($user, $file);
           $dir = $path['root'];
           $name = $path['name'];
           $public = $path['storage'];
-          $currentAvatar = storage_path('app/'.$user->profile->avatar->media_path);
+          $currentAvatar = storage_path('app/'.$profile->avatar->media_path);
           $loc = $request->file('upload')->storeAs($public, $name);
 
-          $avatar = Avatar::whereProfileId($user->profile->id)->firstOrFail();
+          $avatar = Avatar::whereProfileId($profile->id)->firstOrFail();
           $opath = $avatar->media_path;
           $avatar->media_path = "$public/$name";
           $avatar->thumb_path = null;
@@ -99,6 +100,7 @@ class BaseApiController extends Controller
           $avatar->last_processed_at = null;
           $avatar->save();
 
+          Cache::forget("avatar:{$profile->id}");
           AvatarOptimize::dispatch($user->profile, $currentAvatar);
         } catch (Exception $e) {
         }

+ 5 - 3
app/Http/Controllers/AvatarController.php

@@ -3,7 +3,7 @@
 namespace App\Http\Controllers;
 
 use Illuminate\Http\Request;
-use Auth, Log, Storage;
+use Auth, Cache, Log, Storage;
 use App\Avatar;
 use App\Jobs\AvatarPipeline\AvatarOptimize;
 
@@ -21,15 +21,16 @@ class AvatarController extends Controller
         ]);
         try {
           $user = Auth::user();
+          $profile = $user->profile;
           $file = $request->file('avatar');
           $path = $this->getPath($user, $file);
           $dir = $path['root'];
           $name = $path['name'];
           $public = $path['storage'];
-          $currentAvatar = storage_path('app/'.$user->profile->avatar->media_path);
+          $currentAvatar = storage_path('app/'.$profile->avatar->media_path);
           $loc = $request->file('avatar')->storeAs($public, $name);
 
-          $avatar = Avatar::whereProfileId($user->profile->id)->firstOrFail();
+          $avatar = Avatar::whereProfileId($profile->id)->firstOrFail();
           $opath = $avatar->media_path;
           $avatar->media_path = "$public/$name";
           $avatar->thumb_path = null;
@@ -37,6 +38,7 @@ class AvatarController extends Controller
           $avatar->last_processed_at = null;
           $avatar->save();
 
+          Cache::forget("avatar:{$profile->id}");
           AvatarOptimize::dispatch($user->profile, $currentAvatar);
         } catch (Exception $e) {
         }

+ 7 - 2
app/Profile.php

@@ -2,7 +2,7 @@
 
 namespace App;
 
-use Auth, Storage;
+use Auth, Cache, Storage;
 use App\Util\Lexer\PrettyNumber;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\SoftDeletes;
@@ -130,7 +130,12 @@ class Profile extends Model
 
     public function avatarUrl()
     {
-        $url = url(Storage::url($this->avatar->media_path ?? 'public/avatars/default.png'));
+        $url = Cache::remember("avatar:{$this->id}", 1440, function() {
+            $path = $this->avatar->media_path ?? 'public/avatars/default.png';
+            $version = hash('sha1', $this->avatar->created_at);
+            $path = "{$path}?v={$version}";
+            return url(Storage::url($path));
+        });
         return $url;
     }