Kunden koennen eigene veroeffentlichte PMs kostenpflichtig aus der oeffentlichen Ansicht nehmen: Panel auf der PM-Detailseite (inkl. T1neu-Unternehmer-Checkbox und Doppelausweis netto/brutto), Stripe- Ad-hoc-Checkout wie Credit-Topups, Erfuellung im Webhook — die PM wechselt auf archived + depublished_at, die oeffentliche URL zeigt dauerhaft einen Tombstone (410 Gone, ohne Inhalte, mit ehrlichem Drittarchive-Hinweis). Doppelbuchungs-Bremse pro PM; Status-Log mit Quelle "depublication". Gate: ohne BILLING_DEPUBLICATION_PRICE_CENTS bleibt der Weg deaktiviert und /melden zeigt die neutrale Preisformulierung [EXTERN: Preis festlegen, O6]. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
26 lines
889 B
PHP
26 lines
889 B
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Web;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Services\Web\ReleaseDetailPageData;
|
|
use App\Support\WebPortalContext;
|
|
use Illuminate\Contracts\View\View;
|
|
use Illuminate\Http\Response;
|
|
|
|
class ReleaseDetailController extends Controller
|
|
{
|
|
// $edition stammt aus dem Gruppen-Prefix {edition} und steht positionsbedingt
|
|
// vor {slug}; es wird hier nicht gebraucht, muss aber in der Signatur stehen.
|
|
public function __invoke(string $edition, string $slug, ReleaseDetailPageData $pageData): View|Response
|
|
{
|
|
$data = $pageData->build(WebPortalContext::fromRequest(), $slug);
|
|
|
|
// T12: depublizierte PM → Tombstone mit 410 Gone (ohne Inhalte).
|
|
if (isset($data['tombstone'])) {
|
|
return response()->view('web.release-tombstone', [], 410);
|
|
}
|
|
|
|
return view('web.release-detail', $data);
|
|
}
|
|
}
|