A production-deployed e-wallet: deposit via Stripe Checkout, user-to-user transfers guarded by optimistic locking + idempotency keys, event-driven notifications through a Transactional Outbox → Kafka pipeline, and realtime in-app / OS notifications over WebSocket (STOMP). Fully Dockerized.
Modules
▸Money transfer with @Version optimistic locking (no lost updates under concurrency) + Idempotency-Key header (no double-spend on retries), double-entry ledger
▸Transactional Outbox + Kafka: the transfer event is written atomically with the money in one DB transaction, then relayed to Kafka (at-least-once) and consumed idempotently
▸Realtime notifications over Spring WebSocket (STOMP) with JWT auth at the CONNECT frame + per-user routing; frontend shows toast + OS notification + sound
▸Stripe Checkout deposit with a signature-verified webhook that credits the wallet idempotently — the balance is never trusted from the client
▸Balance history chart (Highcharts candlestick) filterable by month; counterparty names in transaction history solved with @EntityGraph to eliminate the N+1 query
▸JWT auth (Spring Security), global exception handling, DTO mapping layer, Spring Data JPA + PostgreSQL
▸Dockerized: app + PostgreSQL + Kafka (KRaft) via docker-compose; Next.js standalone image for the frontend behind a reverse proxy