diff --git a/wcfsetup/install/files/lib/command/unfurl/url/FindOrCreateUnfurlUrl.class.php b/wcfsetup/install/files/lib/command/unfurl/url/FindOrCreateUnfurlUrl.class.php new file mode 100644 index 00000000000..09843667925 --- /dev/null +++ b/wcfsetup/install/files/lib/command/unfurl/url/FindOrCreateUnfurlUrl.class.php @@ -0,0 +1,52 @@ + + * @since 6.2 + */ +final class FindOrCreateUnfurlUrl +{ + public const REFETCH_UNFURL_URL = 86_400; + + public function __construct( + private readonly string $url, + ) {} + + public function __invoke(): UnfurlUrl + { + $object = UnfurlUrl::getByUrl($this->url); + + if (!$object) { + $returnValues = (new UnfurlUrlAction([], 'create', [ + 'data' => [ + 'url' => $this->url, + 'urlHash' => \sha1($this->url), + ], + ]))->executeAction(); + + $object = $returnValues['returnValues']; + \assert($object instanceof UnfurlUrl); + } + + if ($object->status !== UnfurlUrl::STATUS_PENDING && $object->lastFetch < \TIME_NOW - self::REFETCH_UNFURL_URL) { + BackgroundQueueHandler::getInstance()->enqueueIn([ + new UnfurlUrlBackgroundJob($object), + ]); + + BackgroundQueueHandler::getInstance()->forceCheck(); + } + + return $object; + } +} diff --git a/wcfsetup/install/files/lib/data/unfurl/url/UnfurlUrlAction.class.php b/wcfsetup/install/files/lib/data/unfurl/url/UnfurlUrlAction.class.php index 412b8b1b3fc..7c47dd54eb4 100644 --- a/wcfsetup/install/files/lib/data/unfurl/url/UnfurlUrlAction.class.php +++ b/wcfsetup/install/files/lib/data/unfurl/url/UnfurlUrlAction.class.php @@ -2,6 +2,7 @@ namespace wcf\data\unfurl\url; +use wcf\command\unfurl\url\FindOrCreateUnfurlUrl; use wcf\data\AbstractDatabaseObjectAction; use wcf\system\background\BackgroundQueueHandler; use wcf\system\background\job\UnfurlUrlBackgroundJob; @@ -82,22 +83,10 @@ private function saveImageData(array $imageData): int /** * Returns the unfurl url object to a given url. + * @deprecated 6.2 Use `FindOrCreateUnfurlUrl` instead. */ public function findOrCreate(): UnfurlUrl { - $object = UnfurlUrl::getByUrl($this->parameters['data']['url']); - - if (!$object) { - $returnValues = (new self([], 'create', [ - 'data' => [ - 'url' => $this->parameters['data']['url'], - 'urlHash' => \sha1($this->parameters['data']['url']), - ], - ]))->executeAction(); - - return $returnValues['returnValues']; - } - - return $object; + return (new FindOrCreateUnfurlUrl($this->parameters['data']['url']))(); } } diff --git a/wcfsetup/install/files/lib/system/html/node/HtmlNodeUnfurlLink.class.php b/wcfsetup/install/files/lib/system/html/node/HtmlNodeUnfurlLink.class.php index 9f1ea9db531..29693b2b46b 100644 --- a/wcfsetup/install/files/lib/system/html/node/HtmlNodeUnfurlLink.class.php +++ b/wcfsetup/install/files/lib/system/html/node/HtmlNodeUnfurlLink.class.php @@ -4,7 +4,7 @@ use Laminas\Diactoros\Exception\InvalidArgumentException; use Laminas\Diactoros\Uri; -use wcf\data\unfurl\url\UnfurlUrlAction; +use wcf\command\unfurl\url\FindOrCreateUnfurlUrl; use wcf\util\DOMUtil; use wcf\util\Url; @@ -42,7 +42,7 @@ public static function setUnfurl(HtmlNodePlainLink $link): void // be encoded at all times according to RFC 1738. $path = \preg_replace_callback( '~[^0-9a-zA-Z$-_.+!*\'(),;/?:@=&]~', - static fn (array $matches) => \rawurlencode($matches[0]), + static fn(array $matches) => \rawurlencode($matches[0]), $path ); $uri = $uri->withPath($path); @@ -91,13 +91,8 @@ private static function lowercaseHostname(Uri $uri): Uri private static function findOrCreate(Uri $uri): int { - $object = new UnfurlUrlAction([], 'findOrCreate', [ - 'data' => [ - 'url' => $uri->__toString(), - ], - ]); - $returnValues = $object->executeAction(); - - return $returnValues['returnValues']->urlID; + $unfurlUrl = (new FindOrCreateUnfurlUrl($uri->__toString()))(); + + return $unfurlUrl->urlID; } }