TidyLinker.com
TypeScript
Pull Request Merged
PR #167 merged: fix: stop notification + mailable queue jobs from burning out
Summary
Three production Sentry issue clusters in one bundle:
- TIDY-LINKER-3J / 3H / 3K / 3M —
DirectBooking*Notificationclasses did not useSerializesModels, so the fullJobPosting+Usergraphs were serialized into queue payloads. A deploy on 2026-05-26 13:20Z left in-flight payloads that unserialized to__PHP_Incomplete_Class, then every channel (Mail/Broadcast/Database) blew up on the type check, and thefailed()handler tripped a finalmethod_existsError. Now usingSerializesModelsso payloads carry id refs only. - TIDY-LINKER-3A —
VerificationReminderMail(and all the otherThrottlesResendApimailables) hitMaxAttemptsExceededExceptionafter 3 attempts becauseRateLimitedWithRedisreleases the job back to the queue, and each release counts towardtries. Bulk nudges from admin produced bursts that exhausted attempts before the limiter could let them through. The trait now declaresretryUntil(now()->addMinutes(30))so throttled releases don't burn attempts. - TIDY-LINKER-2Y (unblocking) — JS errors in Sentry currently come back as
at undefined:31 in Nonebecause sourcemaps aren't uploaded. Added the@sentry/vite-plugintovite.config.ts, conditionally enabled whenSENTRY_AUTH_TOKEN(orSENTRY_API_TOKEN) is set at build time. The plugin uploads maps tostu-ht/tidy-linkeron the DE region and deletes them post-upload so they don't ship to the CDN. Next occurrence of 2Y should have a real stack.
Test plan
-
php artisan test --testsuite=Feature— 1196 passed, 0 failed (browser-suite failures are pre-existing, unrelated) - New
tests/Feature/Notifications/DirectBookingSerializationTest.php— asserts each DirectBooking notification serializes/unserializes withModelIdentifierrefs (not full model bodies) - Extended
tests/Feature/Mail/ThrottlesResendApiTest.php— asserts every throttled mailable'sretryUntil()returns a futureDateTimeInterface -
npm run buildsucceeds locally (Sentry plugin no-ops without auth token) -
vendor/bin/pint --dirtyclean - After merge: clear
failed_jobsqueue on prod (php artisan queue:flush) - After merge: set
SENTRY_AUTH_TOKENenv var on Coolify so the next prod build uploads sourcemaps - After merge: confirm Coolify post-deploy hook runs
php artisan horizon:terminateso workers always reload current code (the original trigger for the deserialization cluster)
+543
additions
-4
deletions
10
files changed