Implement academy analytics, billing, and web stories updates

This commit is contained in:
2026-05-26 07:27:29 +02:00
parent 456c3d6bb0
commit 0b33a1b074
177 changed files with 27360 additions and 2685 deletions

View File

@@ -26,6 +26,7 @@ final class StaticPagesSitemapBuilder extends AbstractSitemapBuilder
$this->urls->staticRoute('/'),
$this->urls->staticRoute('/academy'),
$this->urls->staticRoute('/academy/pricing'),
$this->urls->staticRoute('/web-stories'),
$this->urls->staticRoute('/faq'),
$this->urls->staticRoute('/rules-and-guidelines'),
$this->urls->staticRoute('/privacy-policy'),

View File

@@ -0,0 +1,41 @@
<?php
declare(strict_types=1);
namespace App\Services\Sitemaps\Builders;
use App\Models\WorldWebStory;
use App\Services\Sitemaps\AbstractSitemapBuilder;
use App\Services\Sitemaps\SitemapUrlBuilder;
use DateTimeInterface;
final class WorldWebStoriesSitemapBuilder extends AbstractSitemapBuilder
{
public function __construct(private readonly SitemapUrlBuilder $urls)
{
}
public function name(): string
{
return 'web-stories';
}
public function items(): array
{
return WorldWebStory::query()
->visible()
->with('world')
->orderByDesc('published_at')
->orderByDesc('id')
->get()
->map(fn (WorldWebStory $story) => $this->urls->webStory($story))
->filter()
->values()
->all();
}
public function lastModified(): ?DateTimeInterface
{
return $this->dateTime(WorldWebStory::query()->visible()->max('updated_at'));
}
}

View File

@@ -22,6 +22,7 @@ use App\Services\Sitemaps\Builders\StaticPagesSitemapBuilder;
use App\Services\Sitemaps\Builders\StoriesSitemapBuilder;
use App\Services\Sitemaps\Builders\TagsSitemapBuilder;
use App\Services\Sitemaps\Builders\UsersSitemapBuilder;
use App\Services\Sitemaps\Builders\WorldWebStoriesSitemapBuilder;
final class SitemapRegistry
{
@@ -43,6 +44,7 @@ final class SitemapRegistry
CollectionsSitemapBuilder $collections,
CardsSitemapBuilder $cards,
StoriesSitemapBuilder $stories,
WorldWebStoriesSitemapBuilder $webStories,
NewsSitemapBuilder $news,
GoogleNewsSitemapBuilder $googleNews,
ForumIndexSitemapBuilder $forumIndex,
@@ -63,6 +65,7 @@ final class SitemapRegistry
$collections->name() => $collections,
$cards->name() => $cards,
$stories->name() => $stories,
$webStories->name() => $webStories,
$news->name() => $news,
$googleNews->name() => $googleNews,
$forumIndex->name() => $forumIndex,

View File

@@ -14,6 +14,7 @@ use App\Models\Page;
use App\Models\Story;
use App\Models\Tag;
use App\Models\User;
use App\Models\WorldWebStory;
use App\Services\ThumbnailPresenter;
use cPad\Plugins\Forum\Models\ForumBoard;
use cPad\Plugins\Forum\Models\ForumCategory;
@@ -187,6 +188,21 @@ final class SitemapUrlBuilder extends AbstractSitemapBuilder
);
}
public function webStory(WorldWebStory $story): ?SitemapUrl
{
if (trim((string) $story->slug) === '') {
return null;
}
return new SitemapUrl(
$story->publicUrl(),
$this->newest($story->updated_at, $story->published_at, $story->created_at),
$this->images([
$this->image($story->posterPortraitUrl(), (string) $story->title),
]),
);
}
public function forumIndex(): SitemapUrl
{
return new SitemapUrl(route('forum.index'));