diff --git a/components/Avatar/Avatar.php b/components/Avatar/Avatar.php index 1df4e87023..423af64ad8 100644 --- a/components/Avatar/Avatar.php +++ b/components/Avatar/Avatar.php @@ -38,8 +38,9 @@ class Avatar extends Component public function onAddRoute($r): bool { - $r->connect('avatar', '/actor/{actor_id<\d+>}/avatar/{size?full}', [Controller\Avatar::class, 'avatar_view']); - $r->connect('settings_avatar', '/settings/avatar', [Controller\Avatar::class, 'settings_avatar']); + $r->connect('avatar_actor', '/actor/{actor_id<\d+>}/avatar/{size?full}', [Controller\Avatar::class, 'avatar_view']); + $r->connect('avatar_default', '/avatar/default/{size?full}', [Controller\Avatar::class, 'default_avatar_view']); + $r->connect('avatar_settings', '/settings/avatar', [Controller\Avatar::class, 'settings_avatar']); return Event::next; } @@ -62,9 +63,13 @@ class Avatar extends Component public function onAvatarUpdate(int $actor_id): bool { - Cache::delete('avatar-' . $actor_id); - Cache::delete('avatar-url-' . $actor_id); - Cache::delete('avatar-file-info-' . $actor_id); + foreach (['full', 'big', 'medium', 'small'] as $size) { + foreach ([Router::ABSOLUTE_PATH, Router::ABSOLUTE_URL] as $type) { + Cache::delete("avatar-{$actor_id}-{$size}-{$type}"); + Cache::delete("avatar-url-{$actor_id}-{$size}-{$type}"); + Cache::delete("avatar-file-info-{$actor_id}-{$size}-{$type}"); + } + } return Event::next; } @@ -89,11 +94,13 @@ class Avatar extends Component /** * Get the cached avatar associated with the given Actor id, or the current user if not given */ - public static function getAvatarUrl(int $actor_id, string $size = 'full'): string + public static function getAvatarUrl(int $actor_id, string $size = 'full', int $type = Router::ABSOLUTE_PATH): string { - return Cache::get("avatar-url-{$actor_id}", function () use ($actor_id, $size) { - return Router::url('avatar', ['actor_id' => $actor_id, 'size' => $size]); - }); + try { + return self::getAvatar($actor_id)->getUrl($size, $type); + } catch (NoAvatarException) { + return Router::url('avatar_default', ['size' => $size], $type); + } } /** diff --git a/components/Avatar/Controller/Avatar.php b/components/Avatar/Controller/Avatar.php index c0b3e56796..c46d08e2c1 100644 --- a/components/Avatar/Controller/Avatar.php +++ b/components/Avatar/Controller/Avatar.php @@ -45,6 +45,11 @@ use Symfony\Component\HttpFoundation\Response; class Avatar extends Controller { + public function default_avatar_view(Request $request, string $size): Response + { + return $this->avatar_view($request, 0, $size); + } + /** * @throws Exception */ diff --git a/components/Avatar/Entity/Avatar.php b/components/Avatar/Entity/Avatar.php index 6bbdd6af9d..2bae0566eb 100644 --- a/components/Avatar/Entity/Avatar.php +++ b/components/Avatar/Entity/Avatar.php @@ -21,6 +21,7 @@ namespace Component\Avatar\Entity; +use App\Core\Cache; use App\Core\DB\DB; use App\Core\Entity; use App\Core\Router\Router; @@ -117,9 +118,12 @@ class Avatar extends Entity private ?Attachment $attachment = null; - public function getUrl(): string + public function getUrl(string $size = 'full', int $type = Router::ABSOLUTE_PATH): string { - return Router::url('avatar', ['actor_id' => $this->actor_id]); + $actor_id = $this->getActorId(); + return Cache::get("avatar-url-{$actor_id}-{$size}-{$type}", function () use ($actor_id, $size, $type) { + return Router::url('avatar_actor', ['actor_id' => $actor_id, 'size' => $size], $type); + }); } public function getAttachment(): Attachment