presseportale/routes/api.php
Kevin Adametz 075d0d931f legal/web: Zustimmungsgate je Dokumentversion (aus bis AGB 0.7), OG-Variante mit eingebranntem Bildnachweis, Nachweis in Teasern (Bildkennzeichnung Blöcke G und H)
- legal_document_acceptances (insert-only), LegalAcceptanceGate, Pflicht-Schalter im Einreichungs-Modal über den gemeinsamen Trait; API: GET/POST /api/v1/legal/acceptances, submit antwortet 428 mit den geforderten Fassungen; LEGAL_ACCEPTANCE_GATE
- ImageService: og-Variante (1200×630) mit halbtransparentem Balken und Inter SemiBold, regenerateOgVariant() für Korrekturen und Bestand; Fokuspunkt/Letterbox getestet
- Uploader brennt den Nachweis beim Upload ein, ImageCorrectionService baut die OG-Variante nach einer Korrektur neu; Artikelseite nutzt og für og:image
- Teaser: Nachweis in alt/title (Feed, Hero, Kategorie, Newsroom), Unterschrift am Hero-Bild; PressRelease::cardImageCredit()

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-22 10:12:17 +00:00

37 lines
2.3 KiB
PHP

<?php
use App\Http\Controllers\Api\V1\CategoryController;
use App\Http\Controllers\Api\V1\CompanyController;
use App\Http\Controllers\Api\V1\LegalAcceptanceController;
use App\Http\Controllers\Api\V1\NewsletterSubscriptionController;
use App\Http\Controllers\Api\V1\PressReleaseController;
use App\Http\Controllers\Api\V1\PressReleaseImageController;
use App\Http\Middleware\EnsureApiTokenRateLimit;
use App\Http\Middleware\EnsureApiUserIsActive;
use Illuminate\Support\Facades\Route;
Route::prefix('v1')
->middleware(['auth:sanctum', EnsureApiUserIsActive::class, EnsureApiTokenRateLimit::class])
// Controller erwarten int-IDs — nicht-numerische Werte (z. B. vergessene
// Platzhalter wie „PM_ID") sollen 404 statt TypeError/500 ergeben.
->where(['pressRelease' => '[0-9]+', 'pressReleaseImage' => '[0-9]+', 'company' => '[0-9]+'])
->group(function (): void {
Route::apiResource('press-releases', PressReleaseController::class)
->parameters(['press-releases' => 'pressRelease']);
Route::post('press-releases/{pressRelease}/submit', [PressReleaseController::class, 'submit'])
->name('press-releases.submit');
Route::get('press-releases/{pressRelease}/images', [PressReleaseImageController::class, 'index'])
->name('press-releases.images.index');
Route::post('press-releases/{pressRelease}/images', [PressReleaseImageController::class, 'store'])
->name('press-releases.images.store');
Route::delete('press-release-images/{pressReleaseImage}', [PressReleaseImageController::class, 'destroy'])
->name('press-release-images.destroy');
Route::apiResource('companies', CompanyController::class)->only(['index', 'show']);
Route::get('categories', [CategoryController::class, 'index'])->name('categories.index');
Route::post('newsletter/subscribe', [NewsletterSubscriptionController::class, 'store'])
->name('newsletter.subscribe');
// Zustimmungsgate (Bildkennzeichnung Block G, O2): Annahme je
// Kontoinhaber und Dokumentversion; submit antwortet sonst 428.
Route::get('legal/acceptances', [LegalAcceptanceController::class, 'index'])->name('legal.acceptances.index');
Route::post('legal/acceptances', [LegalAcceptanceController::class, 'store'])->name('legal.acceptances.store');
});