A backend service for uploading and processing large contact lists asynchronously, with real-time progress tracking and crash-safe resumability.
-
Async CSV ingestion [DONE] - uploads return immediately; a background worker (BullMQ + Redis) streams and processes rows without blocking the request
-
Live progress via WebSockets - clients subscribe to a job ID and get real-time processed/total counts as the worker runs
-
Duplicate prevention - phone numbers are deduped via a unique constraint with atomic upsert, safe under concurrent processing
-
Resume after restart [DONE] - job state and checkpoints persist independently of the worker process, so an interrupted job picks back up without reprocessing or data loss
-
Distributed rate limiter - Redis-backed, atomic request limiting (100 req/user) that works correctly across multiple app instances