Files
crewli/api/app/Exceptions/FormBuilder/RateLimitedException.php
bert.hausmans 53fe4d25a7 feat(form-builder): standardised error envelope for public form API (D6)
S2c D6. Seven concrete exceptions over a shared PublicFormApiException
base + a single renderer in bootstrap/app.php produce the contract:

  { "message": "...", "code": "...", "errors"?: {...} }

Codes: SCHEMA_NOT_FOUND (404), TOKEN_EXPIRED (410), TOKEN_REVOKED (410),
SCHEMA_UNPUBLISHED (410), SUBMISSION_ALREADY_SUBMITTED (409),
RATE_LIMITED (429 with Retry-After header), VALIDATION_FAILED (422
with per-field errors).

Used by PublicFormController (resolve) and PublicFormSubmissionController
(load/submit lifecycle). Every public-form endpoint now emits the same
envelope regardless of which branch failed; the renderer only fires on
PublicFormApiException so the authenticated API still uses its default
Laravel shapes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 22:55:44 +02:00

15 lines
377 B
PHP

<?php
declare(strict_types=1);
namespace App\Exceptions\FormBuilder;
final class RateLimitedException extends PublicFormApiException
{
public function __construct(int $retryAfterSeconds)
{
parent::__construct('RATE_LIMITED', 429, 'Too many submissions. Try again later.');
$this->headers['Retry-After'] = (string) max($retryAfterSeconds, 0);
}
}