Skip to content

Commit fd8445b

Browse files
authored
Merge pull request #6408 from WoltLab/6.3-unfurl-fetch-again
Reload data from rich embeds after 30 days
2 parents 7ad3454 + 82da78b commit fd8445b

File tree

3 files changed

+60
-24
lines changed

3 files changed

+60
-24
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
namespace wcf\command\unfurl\url;
4+
5+
use wcf\data\unfurl\url\UnfurlUrl;
6+
use wcf\data\unfurl\url\UnfurlUrlAction;
7+
use wcf\system\background\BackgroundQueueHandler;
8+
use wcf\system\background\job\UnfurlUrlBackgroundJob;
9+
10+
/**
11+
* Returns the unfurl url object for a given url.
12+
*
13+
* @author Marcel Werk
14+
* @copyright 2001-2025 WoltLab GmbH
15+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
16+
* @since 6.2
17+
*/
18+
final class FindOrCreateUnfurlUrl
19+
{
20+
public const REFETCH_UNFURL_URL = 86_400;
21+
22+
public function __construct(
23+
private readonly string $url,
24+
) {}
25+
26+
public function __invoke(): UnfurlUrl
27+
{
28+
$object = UnfurlUrl::getByUrl($this->url);
29+
30+
if (!$object) {
31+
$returnValues = (new UnfurlUrlAction([], 'create', [
32+
'data' => [
33+
'url' => $this->url,
34+
'urlHash' => \sha1($this->url),
35+
],
36+
]))->executeAction();
37+
38+
$object = $returnValues['returnValues'];
39+
\assert($object instanceof UnfurlUrl);
40+
}
41+
42+
if ($object->status !== UnfurlUrl::STATUS_PENDING && $object->lastFetch < \TIME_NOW - self::REFETCH_UNFURL_URL) {
43+
BackgroundQueueHandler::getInstance()->enqueueIn([
44+
new UnfurlUrlBackgroundJob($object),
45+
]);
46+
47+
BackgroundQueueHandler::getInstance()->forceCheck();
48+
}
49+
50+
return $object;
51+
}
52+
}

wcfsetup/install/files/lib/data/unfurl/url/UnfurlUrlAction.class.php

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace wcf\data\unfurl\url;
44

5+
use wcf\command\unfurl\url\FindOrCreateUnfurlUrl;
56
use wcf\data\AbstractDatabaseObjectAction;
67
use wcf\system\background\BackgroundQueueHandler;
78
use wcf\system\background\job\UnfurlUrlBackgroundJob;
@@ -82,22 +83,10 @@ private function saveImageData(array $imageData): int
8283

8384
/**
8485
* Returns the unfurl url object to a given url.
86+
* @deprecated 6.2 Use `FindOrCreateUnfurlUrl` instead.
8587
*/
8688
public function findOrCreate(): UnfurlUrl
8789
{
88-
$object = UnfurlUrl::getByUrl($this->parameters['data']['url']);
89-
90-
if (!$object) {
91-
$returnValues = (new self([], 'create', [
92-
'data' => [
93-
'url' => $this->parameters['data']['url'],
94-
'urlHash' => \sha1($this->parameters['data']['url']),
95-
],
96-
]))->executeAction();
97-
98-
return $returnValues['returnValues'];
99-
}
100-
101-
return $object;
90+
return (new FindOrCreateUnfurlUrl($this->parameters['data']['url']))();
10291
}
10392
}

wcfsetup/install/files/lib/system/html/node/HtmlNodeUnfurlLink.class.php

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use Laminas\Diactoros\Exception\InvalidArgumentException;
66
use Laminas\Diactoros\Uri;
7-
use wcf\data\unfurl\url\UnfurlUrlAction;
7+
use wcf\command\unfurl\url\FindOrCreateUnfurlUrl;
88
use wcf\util\DOMUtil;
99
use wcf\util\Url;
1010

@@ -42,7 +42,7 @@ public static function setUnfurl(HtmlNodePlainLink $link): void
4242
// be encoded at all times according to RFC 1738.
4343
$path = \preg_replace_callback(
4444
'~[^0-9a-zA-Z$-_.+!*\'(),;/?:@=&]~',
45-
static fn (array $matches) => \rawurlencode($matches[0]),
45+
static fn(array $matches) => \rawurlencode($matches[0]),
4646
$path
4747
);
4848
$uri = $uri->withPath($path);
@@ -91,13 +91,8 @@ private static function lowercaseHostname(Uri $uri): Uri
9191

9292
private static function findOrCreate(Uri $uri): int
9393
{
94-
$object = new UnfurlUrlAction([], 'findOrCreate', [
95-
'data' => [
96-
'url' => $uri->__toString(),
97-
],
98-
]);
99-
$returnValues = $object->executeAction();
100-
101-
return $returnValues['returnValues']->urlID;
94+
$unfurlUrl = (new FindOrCreateUnfurlUrl($uri->__toString()))();
95+
96+
return $unfurlUrl->urlID;
10297
}
10398
}

0 commit comments

Comments
 (0)