Phase 8 (Rest) + Umbauten vom 10./11.06.: - Ein Titelbild pro PM (Cover 1280x580), SVG-Platzhalter-Set + Picker, PressReleaseCoverImage-Resolver - Lizenz-/Rechteformular nach "Lizenztyp Bildupload" (7 Lizenztypen, Personen-/Sachrechte-Status, bedingte Pflichtfelder, Risikohinweise) - Veroeffentlichungs-Box vereinfacht (Embargo aus der Form-UI entfernt), geplante Termine in Europe/Berlin (Speicherung UTC, DISPLAY_TIMEZONE) - Quota-Stub (users.press_release_quota) + monatlicher Reset-Command - Einreichungs-Modal einheitlich in Show/Create/Edit; Ghost-Buttons auf filled; PM-Editor-Layout responsive entkoppelt (.pr-editor-layout) KI-Pruef-Pipeline (Phasen 1-5 des Entwicklungsplans): - API-Haertung: status nicht mehr per API setzbar, eigene Submit-Route durch denselben Funnel (Blacklist, Quota, Status-Log) - Klassifikation Rot/Gelb/Gruen asynchron (Queue classification, OpenAI-Treiber + deterministischer Fallback), ki_audits-Audit-Log - Routing: Rot -> rejected + Mail, Gelb -> Review-Queue, Gruen -> Auto-Publish; Scheduler publiziert nur gruene faellige PMs - Content-Score 0-100 -> Stufe (Standard/Geprueft/Hochwertig) inkl. Editor-Panel und Badges; Re-Klassifikation/-Score bei Aenderung - Admin: KI-Badge + Filter, On-Demand-Pruefung mit Anbieter-Override Suite: 442 passed, 4 skipped. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
29 lines
1.6 KiB
PHP
29 lines
1.6 KiB
PHP
<?php
|
|
|
|
use App\Http\Controllers\Api\V1\CategoryController;
|
|
use App\Http\Controllers\Api\V1\CompanyController;
|
|
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])
|
|
->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');
|
|
});
|