Files
SkinbaseNova/.deploy/artwork-evolution-release/app/Services/Sitemaps/Builders/NewsSitemapBuilder.php
2026-04-18 17:02:56 +02:00

64 lines
1.9 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Services\Sitemaps\Builders;
use App\Services\Sitemaps\AbstractSitemapBuilder;
use App\Services\Sitemaps\SitemapUrl;
use App\Services\Sitemaps\SitemapUrlBuilder;
use DateTimeInterface;
use cPad\Plugins\News\Models\NewsArticle;
use cPad\Plugins\News\Models\NewsCategory;
use cPad\Plugins\News\Models\NewsTag;
final class NewsSitemapBuilder extends AbstractSitemapBuilder
{
public function __construct(private readonly SitemapUrlBuilder $urls)
{
}
public function name(): string
{
return 'news';
}
public function items(): array
{
$articles = NewsArticle::query()
->published()
->orderBy('id')
->cursor()
->map(fn (NewsArticle $article): ?SitemapUrl => $this->urls->news($article))
->filter()
->values();
$categories = NewsCategory::query()
->active()
->whereHas('publishedArticles')
->ordered()
->cursor()
->map(fn (NewsCategory $category): ?SitemapUrl => $this->urls->newsCategory($category))
->filter()
->values();
$tags = NewsTag::query()
->whereHas('articles', fn ($query) => $query->published())
->orderBy('name')
->cursor()
->map(fn (NewsTag $tag): ?SitemapUrl => $this->urls->newsTag($tag))
->filter()
->values();
return $articles->concat($categories)->concat($tags)->values()->all();
}
public function lastModified(): ?DateTimeInterface
{
return $this->dateTime(\collect([
NewsArticle::query()->published()->max('updated_at'),
NewsCategory::query()->active()->whereHas('publishedArticles')->max('updated_at'),
NewsTag::query()->whereHas('articles', fn ($query) => $query->published())->max('updated_at'),
])->filter()->max());
}
}