+ /**
+ * Assign a new avatar image to the given user by fetching from a remote URL.
+ */
+ public function assignToUserFromUrl(User $user, string $avatarUrl, ?string $accessToken = null): void
+ {
+ // Quickly skip invalid or non-HTTP URLs
+ if (!$avatarUrl || !str_starts_with($avatarUrl, 'http')) {
+ return;
+ }
+
+ try {
+ $this->destroyAllForUser($user);
+ $imageData = $this->getAvatarImageData($avatarUrl, $accessToken);
+ $avatar = $this->createAvatarImageFromData($user, $imageData, 'png');
+ $user->avatar()->associate($avatar);
+ $user->save();
+ } catch (Exception $e) {
+ Log::error('Failed to save user avatar image from URL', [
+ 'exception' => $e,
+ 'url' => $avatarUrl,
+ 'user_id' => $user->id,
+ ]);
+ }
+ }
+