-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHandler.php
More file actions
72 lines (63 loc) · 2.4 KB
/
Handler.php
File metadata and controls
72 lines (63 loc) · 2.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
declare(strict_types=1);
namespace App\Actions\Extract\Portal;
use App\Actions\Extract\ChunkRawPages;
use App\Actions\Extract\HandlerInterface;
use App\Actions\Extract\SyncPak;
use App\Actions\Extract\UpdateOrCreatePage;
use App\Enums\SiteName;
use App\Models\Page;
use App\Models\RawPage;
use Carbon\CarbonImmutable;
use Illuminate\Support\Collection;
use Psr\Log\LoggerInterface;
final readonly class Handler implements HandlerInterface
{
public function __construct(
private ChunkRawPages $chunkRawPages,
private FindArticle $findArticle,
private ExtractContents $extractContents,
private UpdateOrCreatePage $updateOrCreatePage,
private SyncPak $syncPak,
) {}
#[\Override]
public function __invoke(LoggerInterface $logger): void
{
($this->chunkRawPages)(SiteName::Portal, function (Collection $rawPages) use ($logger): void {
/**
* @var \Illuminate\Support\Collection<int,\App\Models\RawPage> $rawPages
*/
foreach ($rawPages as $rawPage) {
try {
$logger->info('try', [$rawPage->url]);
$article = ($this->findArticle)($this->getPortalArticleId($rawPage));
/** @var CarbonImmutable */
$lastModiefied = $article->modified_at;
// pageがない
// pageがあって更新有り
if (! $rawPage->page || $this->needUpdate($rawPage->page, $lastModiefied)) {
$contents = ($this->extractContents)($article);
$page = ($this->updateOrCreatePage)(
$rawPage,
$contents['title'],
$contents['text'],
$lastModiefied,
);
($this->syncPak)($page, $contents['paks']);
}
} catch (\Throwable $th) {
$logger->error('failed', [$rawPage->url, $th]);
}
}
});
}
private function needUpdate(Page $page, CarbonImmutable $lastModiefied): bool
{
return $lastModiefied->greaterThan($page->last_modified);
}
private function getPortalArticleId(RawPage $rawPage): string
{
$tmp = explode('/', (string) $rawPage->url);
return end($tmp) ?: '';
}
}