Auf dem Testserver lief die App beim Scrollen langer Timelines in ein 429: nach jeder Scroll-Pause ging sofort ein PUT /settings raus, und jedes sichtbare Vorschaubild zählte auf dasselbe Limit von 300/min. Danach blieben Bilder leer und "Einstellungen konnten nicht gespeichert werden" erschien. Backend: Medien-Reads bekommen einen eigenen Limiter (media, 1200/min), POST /client-logs nimmt Warnungen und Fehler der App an (client-logs, 30/min) und schreibt sie in den täglichen Kanal `client`; Exceptions tragen user_id, path und method im Kontext. Frontend: Einstellungen gehen frühestens 1,5 s nach der letzten Änderung und nur bei geändertem Inhalt zum Server, 429/Netzfehler werden still mit Backoff wiederholt, nur eine Ablehnung wird gemeldet. Bilder laufen durch ein Gate (6 parallel, Retry-After, 3 Versuche) und fallen auf einen Platzhalter statt auf einen kaputten Pfad zurück. Neuer clientLog-Service mit IndexedDB-Puffer, Dedupe und Batch-Versand, globaler Fehlerfang im Boot, Protokoll im Entwickler-Tab. Drei pulsierende Punkte statt weißer Fläche in Timeline-Punkt, Key Image und Medienkacheln. Dokumentation in documentation/logging.md. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
33 lines
1.1 KiB
PHP
33 lines
1.1 KiB
PHP
<?php
|
|
|
|
use Illuminate\Support\Facades\Route;
|
|
|
|
function middlewareOf(string $method, string $uri): array
|
|
{
|
|
$route = collect(Route::getRoutes()->getRoutes())
|
|
->first(fn ($route) => in_array($method, $route->methods(), true) && $route->uri() === $uri);
|
|
|
|
expect($route)->not->toBeNull("route {$method} {$uri} is missing");
|
|
|
|
return $route->gatherMiddleware();
|
|
}
|
|
|
|
test('media reads have their own rate limit, apart from the api writes', function () {
|
|
foreach (['api/event-media/{media}/{variant}', 'api/settings/media/background'] as $uri) {
|
|
$middleware = middlewareOf('GET', $uri);
|
|
|
|
expect($middleware)->toContain('auth:api')
|
|
->toContain('throttle:media')
|
|
->not->toContain('throttle:api');
|
|
}
|
|
});
|
|
|
|
test('api writes and client logs keep their limits', function () {
|
|
expect(middlewareOf('PUT', 'api/settings'))->toContain('throttle:api');
|
|
expect(middlewareOf('GET', 'api/events'))->toContain('throttle:api');
|
|
|
|
$clientLogs = middlewareOf('POST', 'api/client-logs');
|
|
expect($clientLogs)->toContain('auth:api')
|
|
->toContain('throttle:client-logs')
|
|
->not->toContain('throttle:api');
|
|
});
|