Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php

namespace wcf\command\unfurl\url;

use wcf\data\unfurl\url\UnfurlUrl;
use wcf\data\unfurl\url\UnfurlUrlAction;
use wcf\system\background\BackgroundQueueHandler;
use wcf\system\background\job\UnfurlUrlBackgroundJob;

/**
* Returns the unfurl url object for a given url.
*
* @author Marcel Werk
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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']))();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
}