- New FeaturedListingExpiryCronService runs every 5 minutes and clears
Listing.featuredUntil when the promotion period has ended
- Uses a single atomic UPDATE ... RETURNING so concurrent instances do not
double-process rows (idempotent)
- Publishes ListingFeaturedExpiredEvent via CQRS EventBus for downstream
cache/search index invalidation
- Unit test covers event emission, no-op path, error path, and concurrency
Co-Authored-By: Paperclip <noreply@paperclip.ing>