Skip to content

Commit ede45c6

Browse files
committed
Resolve Respekt redirects when getting URL content
1 parent 29acc1b commit ede45c6

File tree

2 files changed

+77
-11
lines changed

2 files changed

+77
-11
lines changed

Mailer/app/Models/PageMeta/Content/RespektContent.php

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
namespace Remp\Mailer\Models\PageMeta\Content;
44

5+
use GuzzleHttp\Exception\RequestException;
56
use Nette\Utils\Json;
67
use Nette\Utils\JsonException;
78
use Remp\Mailer\Models\PageMeta\RespektMeta;
9+
use Remp\Mailer\Models\PageMeta\Transport\RespektApiTransport;
810
use Remp\MailerModule\Models\PageMeta\Content\ContentInterface;
11+
use Remp\MailerModule\Models\PageMeta\Content\InvalidUrlException;
912
use Remp\MailerModule\Models\PageMeta\Meta;
1013
use Remp\MailerModule\Models\PageMeta\Transport\TransportInterface;
1114
use Tracy\Debugger;
@@ -27,19 +30,34 @@ public function __construct(private TransportInterface $transport)
2730

2831
public function fetchUrlMeta(string $url): ?Meta
2932
{
30-
$data = $this->transport->getContent($url);
31-
if ($data === null) {
32-
return null;
33-
}
34-
3533
try {
36-
$data = Json::decode($data, true);
37-
} catch (JsonException $e) {
38-
Debugger::log($e->getMessage(), ILogger::ERROR);
39-
return null;
40-
}
34+
$data = $this->transport->getContent($url);
35+
if ($data === null) {
36+
return null;
37+
}
4138

42-
$article = $data['data']['getArticle'];
39+
try {
40+
$data = Json::decode($data, true);
41+
} catch (JsonException $e) {
42+
Debugger::log($e->getMessage(), ILogger::ERROR);
43+
return null;
44+
}
45+
46+
$article = $data['data']['getArticle'];
47+
if ($article === null) {
48+
// URL has changed, we need to follow redirects and determine new URL
49+
if ($this->transport instanceof RespektApiTransport) {
50+
$resolvedUrl = $this->transport->resolveRedirects($url);
51+
if ($url && $resolvedUrl !== $url) {
52+
return $this->fetchUrlMeta($resolvedUrl);
53+
}
54+
}
55+
56+
return null;
57+
}
58+
} catch (RequestException $e) {
59+
throw new InvalidUrlException("Invalid URL: {$url}", 0, $e);
60+
}
4361

4462
// get article title
4563
$title = $article['title'];

Mailer/app/Models/PageMeta/Transport/RespektApiTransport.php

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use GuzzleHttp\Client;
77
use GuzzleHttp\Exception\GuzzleException;
88
use GuzzleHttp\Psr7\Uri;
9+
use Nette\Utils\Json;
910
use Remp\MailerModule\Models\PageMeta\Transport\TransportInterface;
1011
use Tracy\Debugger;
1112
use Tracy\ILogger;
@@ -60,4 +61,51 @@ public function getContent(string $url): ?string
6061

6162
return $response->getBody()->getContents();
6263
}
64+
65+
public function resolveRedirects(string $url): ?string
66+
{
67+
$uri = new Uri($url);
68+
$contentPath = trim($uri->getPath(), '/');
69+
70+
$client = new Client();
71+
try {
72+
$query = <<<'GRAPHQL'
73+
query GetRedirectUrlForMailer($articleUrl: String) {
74+
getUrl(by: { url: $articleUrl}) {
75+
redirectType
76+
target {
77+
internalTarget {
78+
url
79+
}
80+
}
81+
}
82+
}
83+
GRAPHQL;
84+
85+
$response = $client->post($this->respektContentUrl, [
86+
'headers' => ['Authorization' => 'Bearer ' . $this->respektContentToken],
87+
'json' => [
88+
'query' => $query,
89+
'variables' => [
90+
'articleUrl' => $contentPath
91+
]
92+
]
93+
]);
94+
} catch (GuzzleException $e) {
95+
Debugger::log($e->getMessage(), ILogger::ERROR);
96+
return null;
97+
}
98+
99+
$response = $response->getBody()->getContents();
100+
$json = Json::decode($response);
101+
102+
$path = $json->data->getUrl->target->internalTarget->url ?? null;
103+
if (!$path) {
104+
return null;
105+
}
106+
107+
$resolvedUrl = new Uri($url);
108+
$resolvedUrl = $resolvedUrl->withPath($path);
109+
return (string) $resolvedUrl;
110+
}
63111
}

0 commit comments

Comments
 (0)