Tag blog posts and sign them with a member
Tags are named in every language and made from the page form; the byline is the member who signs a post on the site. The public API sends both, filters posts by tag and lists the tags in use. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -49,6 +49,8 @@ class PageResource extends JsonResource
|
||||
|
||||
'category' => CategoryResource::make($this->whenLoaded('category')),
|
||||
'author' => UserResource::make($this->whenLoaded('author')),
|
||||
'byline_member_id' => $this->byline_member_id,
|
||||
'tag_ids' => $this->whenLoaded('tags', fn () => $this->tags->pluck('id')->values()),
|
||||
|
||||
// Opt-in: `?with=translations` returns every language at once,
|
||||
// which is what a translation UI needs and a page renderer does not.
|
||||
|
||||
@@ -5,6 +5,7 @@ declare(strict_types=1);
|
||||
namespace App\Http\Resources\PublicApi;
|
||||
|
||||
use App\Models\Page;
|
||||
use App\Models\Tag;
|
||||
use App\Support\ImagePayload;
|
||||
use App\Support\SiteUrls;
|
||||
use App\Support\TranslatablePayload;
|
||||
@@ -58,6 +59,29 @@ class PublicPageResource extends JsonResource
|
||||
|
||||
'category' => PublicCategoryResource::make($this->whenLoaded('category')),
|
||||
|
||||
// Only the tags named in this language: one without a slug here
|
||||
// has no listing to link to.
|
||||
'tags' => $this->whenLoaded('tags', fn () => $this->tags
|
||||
->filter(fn (Tag $tag) => filled($tag->getTranslation('slug', $locale, false)))
|
||||
->map(fn (Tag $tag) => [
|
||||
'name' => $tag->getTranslation('name', $locale),
|
||||
'slug' => $tag->getTranslation('slug', $locale, false),
|
||||
])
|
||||
->values()),
|
||||
|
||||
// Who signs it — only someone with a public profile to link to.
|
||||
'byline' => $this->whenLoaded('byline', fn () => $this->byline?->is_public ? [
|
||||
'name' => $this->byline->name,
|
||||
'slug' => $this->byline->slug,
|
||||
'headline' => $this->byline->getTranslation('headline', $locale),
|
||||
'avatar' => ImagePayload::make(
|
||||
$this->byline->avatar,
|
||||
$this->byline->relationLoaded('avatarMedia') ? $this->byline->getRelation('avatarMedia') : null,
|
||||
$this->byline->name,
|
||||
),
|
||||
'path' => SiteUrls::path('member', $locale, $this->byline->slug),
|
||||
] : null),
|
||||
|
||||
// Lets the frontend emit correct hreflang tags. Only locales that
|
||||
// actually have a translation appear.
|
||||
'alternates' => SiteUrls::alternates($this->resource, 'page'),
|
||||
|
||||
Reference in New Issue
Block a user