Careeroza
Services and Responsibilities
Services Table
| Service | Owns (data) | Main APIs | Publishes | Consumes |
|---|---|---|---|---|
| product-service | Product, Category | GET /api/products, GET /api/products/{id}, admin CRUD | ProductUpdated | — |
| user-service | User, Address | GET /api/users/me, addresses | UserRegistered | — |
| cart-service | CartItem (Redis) | GET/POST/DELETE /api/cart | — | ProductUpdated (price changes) |
| order-service | Order, OrderItem, saga_instance, outbox | POST /api/orders, GET /api/orders/{id} | OrderCreated, OrderConfirmed, OrderCancelled, commands | StockReserved/Rejected, PaymentCompleted/Declined |
| inventory-service | Stock, Reservation | internal only | StockReserved, StockRejected, StockReleased | ReserveStock, ReleaseStock |
| payment-service | Payment, Refund, idempotency_record | POST /api/payments/webhook (Razorpay) | PaymentCompleted, PaymentDeclined, Refunded | ChargePayment, RefundPayment |
| notification-service | Notification log | internal only | — | OrderConfirmed, OrderCancelled, Refunded |
Note: Product.stock from the shared ShopEase model now lives in inventory-service as the source of truth; product-service only shows an "in stock" flag updated from inventory events.
Kafka Topics
| Topic | Key | Producer | Consumers | Partitions |
|---|---|---|---|---|
order-events | orderId | order-service (outbox) | notification, analytics, order-query | 12 |
inventory-commands | orderId | order-service (saga) | inventory-service | 12 |
inventory-events | orderId | inventory-service (outbox) | order-service (saga) | 12 |
payment-commands | orderId | order-service (saga) | payment-service | 12 |
payment-events | orderId | payment-service (outbox) | order-service, notification | 12 |
*.DLT | same | error handlers | on-call engineers / replay tool | 1 |
Repository Layout
shopease/ (monorepo) ├── api-gateway/ ├── web-bff/ mobile-bff/ ├── product-service/ user-service/ cart-service/ ├── order-service/ │ ├── src/main/java/com/shopease/order/ │ │ ├── api/ OrderController, DTOs │ │ ├── domain/ Order, OrderItem, OrderStatus │ │ ├── saga/ OrderSagaOrchestrator, OrderSaga, replies │ │ ├── outbox/ OutboxEvent, OutboxRelay │ │ └── client/ ProductClient (RestClient + Resilience4j) │ ├── src/main/resources/db/migration/ V1__orders.sql, V2__outbox.sql │ └── Dockerfile ├── inventory-service/ payment-service/ notification-service/ ├── k8s/ Kustomize base + overlays (staging, prod) ├── docker-compose.yml local development └── .github/workflows/ one workflow per service