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>
71 lines
1.8 KiB
PHP
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;
|
|
}
|
|
}
|