presseportale/app/Models/ChangelogEntry.php
Kevin Adametz 2c590fa9df changelog: Entwürfe aus den Commits, Freigabe im Admin, öffentliche Seite mit RSS
Decision-Update Changelog, Stufen 1 bis 3:
- changelog:collect liest die Commits zwischen zwei Tags und legt aus den
  Zeilen Changelog:/Public: Entwürfe an (ganze Nachricht, nicht nur der
  Trailer-Block); ohne Changelog-Zeile intern, Sicherheit als eine
  Sammelzeile je Release, Sicherheitsbegriffe im Titel stufen hoch, ohne
  Public-Satz ein markierter Vorschlag aus dem Titel; idempotent.
- changelog:backfill trägt die Neuerungen seit dem Relaunch als Entwurf nach.
- Admin ▸ Changelog (settings:manage): gegenlesen, bearbeiten, Rubrik,
  artikelwürdig, freigeben/verwerfen, Tag gesammelt freigeben, Eintrag von Hand.
- pressekonto.com/changelog und /changelog/feed (RSS), auf den Portalen
  301 zum Hub; Kundenmenü „Was ist neu“ mit Neu-Kennzeichen (14 Tage).

Changelog: Neu
Public: Unter pressekonto.com/changelog steht, was sich auf pressekonto, presseecho und businessportal24 ändert – auch als RSS-Feed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 08:30:46 +00:00

71 lines
1.8 KiB
PHP

<?php
namespace App\Models;
use App\Enums\ChangelogCategory;
use App\Enums\ChangelogStatus;
use Database\Factories\ChangelogEntryFactory;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
/**
* Ein Changelog-Eintrag (Decision-Update Changelog): Entwurf aus dem Deploy,
* öffentlich erst nach Freigabe.
*/
class ChangelogEntry extends Model
{
/** @use HasFactory<ChangelogEntryFactory> */
use HasFactory;
protected $fillable = [
'released_on',
'release_tag',
'category',
'text',
'status',
'source_key',
'commit_subject',
'review_note',
'article_worthy',
'published_at',
'reviewed_by_user_id',
];
protected function casts(): array
{
return [
'released_on' => 'date',
'category' => ChangelogCategory::class,
'status' => ChangelogStatus::class,
'article_worthy' => 'boolean',
'published_at' => 'datetime',
];
}
/**
* @return BelongsTo<User, $this>
*/
public function reviewer(): BelongsTo
{
return $this->belongsTo(User::class, 'reviewed_by_user_id');
}
/**
* @param Builder<ChangelogEntry> $query
*/
public function scopePublished(Builder $query): void
{
$query->where('status', ChangelogStatus::Published->value);
}
/**
* Öffentlicher Text: Sicherheit immer nur als Sammelzeile (E5), egal
* was im Entwurf steht.
*/
public function publicText(): string
{
return $this->category === ChangelogCategory::Security ? ChangelogCategory::SECURITY_LINE : $this->text;
}
}