diff --git a/app/Helpers/Upload.php b/app/Helpers/Upload.php index 0dc2c58d..944fd853 100644 --- a/app/Helpers/Upload.php +++ b/app/Helpers/Upload.php @@ -48,7 +48,16 @@ function uploadFromUrl(?string $url, string $directory = 'social-accounts'): ?st $extension ); - Storage::put($filename, $response->body(), 'public'); + $stored = Storage::put($filename, $response->body(), 'public'); + + if (! $stored) { + Log::warning('uploadFromUrl: Storage::put failed', [ + 'url' => $url, + 'filename' => $filename, + ]); + + return null; + } return $filename; } catch (Exception $e) { diff --git a/app/Models/PostPlatform.php b/app/Models/PostPlatform.php index a7316211..fbbe11a3 100644 --- a/app/Models/PostPlatform.php +++ b/app/Models/PostPlatform.php @@ -9,6 +9,7 @@ use App\Enums\SocialAccount\Platform as SocialPlatform; use Database\Factories\PostPlatformFactory; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Concerns\HasUuids; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -20,6 +21,10 @@ class PostPlatform extends Model /** @use HasFactory */ use HasFactory, HasUuids; + protected $appends = [ + 'display_avatar', + ]; + protected $fillable = [ 'post_id', 'social_account_id', @@ -117,7 +122,40 @@ public function getDisplayAvatarAttribute(): ?string return $this->socialAccount->avatar_url; } - return $this->platform_avatar ? Storage::url($this->platform_avatar) : null; + if (! $this->platform_avatar) { + return null; + } + + if (str_starts_with($this->platform_avatar, 'http://') || str_starts_with($this->platform_avatar, 'https://')) { + return $this->platform_avatar; + } + + if (Storage::disk('public')->exists($this->platform_avatar)) { + return Storage::disk('public')->url($this->platform_avatar); + } + + return Storage::url($this->platform_avatar); + } + + protected function platformAvatar(): Attribute + { + return Attribute::make( + get: function (?string $value): ?string { + if (! $value) { + return null; + } + + if (str_starts_with($value, 'http://') || str_starts_with($value, 'https://')) { + return $value; + } + + if (Storage::disk('public')->exists($value)) { + return Storage::disk('public')->url($value); + } + + return Storage::url($value); + }, + ); } public function markAsPublishing(): void diff --git a/app/Models/SocialAccount.php b/app/Models/SocialAccount.php index 6059bb3e..1a1fddc2 100644 --- a/app/Models/SocialAccount.php +++ b/app/Models/SocialAccount.php @@ -253,7 +253,21 @@ public function needsProactiveTokenRefresh(): bool protected function avatarUrl(): Attribute { return Attribute::make( - get: fn (?string $value) => $value ? Storage::url($value) : null, + get: function (?string $value): ?string { + if (! $value) { + return null; + } + + if (str_starts_with($value, 'http://') || str_starts_with($value, 'https://')) { + return $value; + } + + if (Storage::disk('public')->exists($value)) { + return Storage::disk('public')->url($value); + } + + return Storage::url($value); + }, ); } diff --git a/resources/js/components/ui/avatar/Avatar.vue b/resources/js/components/ui/avatar/Avatar.vue index eae4d04e..8db04fed 100644 --- a/resources/js/components/ui/avatar/Avatar.vue +++ b/resources/js/components/ui/avatar/Avatar.vue @@ -1,7 +1,8 @@