ttulka/ddd-example-ecommerce-microservices
36.2
Weak · 20 September 2026
3.6k
lines of production code
Java
with JavaScript
4
measurements over time
What this system is
This system is an e-commerce platform built on a microservices architecture, comprising distinct services for catalog, cart, order, payment, delivery, and warehouse management. It facilitates the end-to-end shopping workflow, from product browsing and cart management to order placement, payment processing, and shipping dispatch. The frontend is a client-side single-page application that communicates with backend REST APIs, while internal service communication relies on domain events published via Redis or RabbitMQ.
Features
Add Nginx reverse proxy configuration for the portal
A new Nginx-based reverse proxy has been introduced to route traffic to various backend services. The configuration proxies root requests to the portal service and directs specific paths (such as /catalog, /order, /cart, /payment, /delivery, /dispatching, and /warehouse) to their respective backend services, all running on port 8080.
reverseproxy · high confidence
Add configurable message broker support (Redis and RabbitMQ)
The application-integration-spring-boot-starter now supports external message brokers for domain event publishing. By default, it uses local Spring application events, but users can switch to Redis (via the 'redis' profile) or RabbitMQ (via the 'rabbitmq' profile) to enable distributed messaging. This includes auto-configuration for the respective brokers, transactional event listeners, and JSON serialization for events. Configuration properties for database (Postgres) and Redis broker connections are also provided.
common/application-integration-spring-boot-starter · high confidence
Initial application entry points and integration tests for payment, delivery, and warehouse services
This change introduces the Spring Boot application entry points (main classes) and corresponding integration tests for three microservices: billing/payment, shipping/delivery, and warehouse. Each service now has a dedicated \\*Application\ class configured with \@SpringBootConfiguration\, \@EnableAutoConfiguration\, and \@EnableAsync\, along with tests that verify the availability of REST endpoints (e.g., \/payment\, \/delivery\, \/warehouse/stock\) and basic data retrieval functionality.
billing/payment/application, shipping/delivery/application, warehouse/application · high confidence
Initial infrastructure and deployment configuration for microservices
This change introduces the foundational infrastructure and deployment artifacts for the e-commerce microservices architecture. It adds Kubernetes manifests defining the deployment and service configurations for backend services (catalog, order, cart, payment), the frontend portal, and a reverse proxy API gateway, along with infrastructure components for Redis and PostgreSQL. A Docker Compose file is provided to orchestrate the entire stack locally, including the reverse proxy and all microservices. Additionally, Gradle wrapper scripts and a \.gitignore\ file are added to support the multi-project build, while the README is updated to document these new deployment options.
(repo-wide) · high confidence
Initial portal application entry point and integration tests
The portal module now includes its Spring Boot application entry point (PortalApplication) and a corresponding integration test suite. The application is configured to enable auto-configuration and asynchronous processing. The new tests verify that the application starts correctly on a random port and that the root index and the main JavaScript resource are served successfully.
portal/application · high confidence
Initial release of Cart, Catalog, and Order microservice applications
This change introduces the initial Spring Boot application entry points and integration tests for three new microservices: Cart, Catalog, and Order. The Cart service exposes endpoints to add, remove, and empty shopping cart items. The Catalog service provides APIs to list categories, products, and products filtered by category. The Order service allows users to place new orders. Each service is configured with Spring Boot auto-configuration and async support, and includes tests verifying the core REST API behaviors.
sales/cart/application, sales/catalog/application, sales/order/application · high confidence
Initializes the Dispatching microservice application entry point
Adds the main entry point for the Shipping Dispatching microservice, bootstrapping a Spring Boot application with automatic configuration and asynchronous processing enabled. This change establishes the foundational application class and includes a basic integration test to verify that the application context starts successfully.
shipping/dispatching/application · high confidence
Introduction of catalog, order, and delivery web components
New custom elements have been added to the sales and shipping modules to handle specific UI interactions: a categories menu for navigation, a product list displaying items with stock status and buy buttons, an order form that aggregates items and triggers a placement event, and a delivery form for collecting shipping details with validation. These components provide the frontend interface for browsing products, managing cart actions, and submitting order and delivery information.
sales/catalog/webcomp, sales/order/webcomp, shipping/delivery/webcomp · high confidence
New REST endpoints for preparing deliveries and bulk stock checks
The Shipping and Warehouse services now expose new POST endpoints to support order fulfillment workflows. The Delivery service accepts a request to prepare a delivery for an order, requiring an order ID, recipient name, and address, and returns a 201 Created status upon success. The Warehouse service adds a bulk stock check endpoint that accepts a list of product IDs and returns an array of objects containing the product ID and the remaining stock amount for each, replacing the previous single-product lookup capability with a batch-oriented approach.
portal/use-cases/src, shipping/delivery/rest, warehouse/rest · high confidence
New cart web components for product interaction and cart management
This change introduces three new Web Components to the sales cart interface: \cart-buy-button\ for adding items to the cart, \cart-item-list\ for displaying and removing cart items, and \cart-menu-link\ for showing the cart item count in the navigation. These components handle local UI interactions and dispatch custom events (\cart:add\, \cart:remove\, \cart:emptied\) to synchronize state across the application.
sales/cart/webcomp · high confidence
Behavioural changes
Asynchronous delivery dispatching via event listener
The system now decouples the delivery dispatching process from the core delivery logic by introducing an asynchronous event-driven mechanism. A new \DeliveryDispatchedListener\ listens for \DeliveryDispatched\ domain events and triggers the \DispatchDelivery\ use case asynchronously, ensuring that the dispatching action does not block the original transaction. This change is supported by a new \Dispatching\ interface in the dispatching domain and verified by unit tests for the listener.
shipping/delivery/listeners, shipping/dispatching/domain · high confidence
Cart item existence check now requires cart ID
The logic for verifying whether a specific item exists in a cart has been updated to include the cart's unique identifier in the database query. Previously, the system checked for item presence based solely on product ID, title, and price, which could lead to false positives if an item with identical details existed in a different cart. Now, the check is scoped to the specific cart instance, ensuring accurate item tracking.
sales/cart/jdbc · high confidence
Cart service migrated to REST API with Spring Boot 3
The CartController has been moved from the portal web module to the sales/cart/rest module and converted from a server-side rendered web controller to a REST controller. This change upgrades the application to Spring Boot 3, evidenced by the migration from javax.servlet to jakarta.servlet packages. The API behavior changes significantly: the cart listing now returns a JSON array of items instead of rendering a view, adding items requires a JSON body instead of form data and returns a 201 Created status, removing items uses a DELETE request instead of a GET redirect, and a new endpoint allows emptying the cart.
sales/cart/rest · high confidence
Catalog and Order services expose REST APIs
The catalog and order modules now provide REST endpoints instead of serving web pages. The catalog controller has moved to the sales layer and exposes JSON endpoints for listing categories (/catalog/categories), products (/catalog/products), and products by category (/catalog/products/{categoryUri}), while removing the previous warehouse stock checks and model-based view rendering. A new order controller exposes a POST /order endpoint that accepts a JSON payload to place orders, mapping the request to the underlying use-case.
sales/catalog/rest, sales/order/rest · high confidence
Clarified API documentation and updated order placement signature
The Payment interface documentation has been refined to explicitly link thrown exceptions using Javadoc {@link} tags, improving clarity for developers handling payment states. Additionally, the PlaceOrder interface now requires a total amount parameter when placing an order, ensuring the order total is explicitly passed during the placement process.
billing/payment/domain, sales/order/domain · high confidence
Decoupled delivery dispatching via new event-driven flow
The system has separated the delivery dispatching logic from the delivery state management. Previously, the \Delivery\ entity raised a \DeliveryDispatched\ event directly when dispatched; this behavior was removed from \DeliveryJdbc\. Instead, a new \Dispatching\ service (\DispatchingJdbc\) now handles the dispatch command, logs the action, and publishes the \DeliveryDispatched\ event. The \DispatchingSagaJdbc\ was updated to call this new \Dispatching\ service instead of the previous \DispatchDelivery\ use case. Consequently, the \DeliveryDispatchedListener\ in the warehouse module now subscribes to the event from the dispatching module, maintaining the decoupled architecture.
shipping/delivery/jdbc, shipping/dispatching/jdbc, warehouse/listeners · high confidence
Decoupled dispatching from delivery and migrated to Spring Boot 3 auto-configuration
The shipping module has been refactored to decouple the dispatching logic from the delivery process, allowing them to operate independently. In the delivery starter, the \DispatchDelivery\ bean is now backed by a new \DispatchDeliveryJdbc\ implementation, and the auto-configuration metadata has been migrated from the legacy \spring.factories\ file to the Spring Boot 3 standard \AutoConfiguration.imports\. Similarly, the dispatching starter now uses a dedicated \DispatchingJdbcConfig\ that injects a generic \Dispatching\ interface and an \EventPublisher\ instead of depending on delivery-specific classes, with its auto-configuration also updated to the new metadata format.
shipping/delivery/spring-boot-starter, shipping/dispatching/spring-boot-starter · high confidence
Decoupling dispatching logic from delivery domain
The \DispatchDelivery\ class has been converted from a concrete Spring-managed service (with transactional boundaries and dependency injection) into a pure domain interface. This change removes the implementation details of the dispatch use-case from this module, effectively decoupling the dispatching mechanism from the delivery domain logic. Additionally, Javadoc comments for \Delivery.prepare()\, \Delivery.dispatch()\, and \PrepareDelivery.prepare()\ have been updated to standardize exception documentation.
shipping/delivery/domain · high confidence
DeliveryDispatched event relocated and simplified
The DeliveryDispatched domain event has been moved from the shipping/delivery module to the shipping/dispatching module, reflecting a decoupling of dispatching logic from delivery. Additionally, the event class has been simplified by removing required constructor arguments and non-null constraints, allowing instances to be created with default values.
shipping/dispatching/events · high confidence
Domain events now support default and all-args constructors
Domain event classes (PaymentCollected, OrderPlaced, DeliveryPrepared, GoodsFetched, GoodsMissed) have been updated to use Lombok's @NoArgsConstructor and @AllArgsConstructor instead of @RequiredArgsConstructor, and fields are no longer final or non-null. This change enables serialization frameworks (such as JSON serializers for Redis messages) to instantiate events using a no-argument constructor and set fields via setters or reflection, facilitating easier serialization and deserialization of event data.
(repo-wide) · high confidence
DomainEvent interface now implements Serializable
The DomainEvent interface now extends java.io.Serializable, allowing domain events to be serialized. This change supports the initialization of a Redis message broker, as Redis typically requires serializable payloads for message transmission.
common/events · high confidence
Migrate auto-configuration to Spring Boot 2.7+ format
The billing/payment and warehouse starters now use the Spring Boot 2.7+ standard for auto-configuration by replacing the legacy \META-INF/spring.factories\ file with \META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports\. This change aligns the modules with the newer Spring Boot version (2.7.0) and ensures that the payment and warehouse components (controllers, JDBC configs, and listeners) are correctly registered via the new import mechanism.
billing/payment/spring-boot-starter, warehouse/spring-boot-starter, portal/spring-boot-starter · high confidence
Migrated auto-configuration to Spring Boot 2.7+ format and exposed REST controllers
The cart, catalog, and order starters have migrated their auto-configuration registration from the deprecated spring.factories file to the new Spring Boot 2.7+ AutoConfiguration.imports mechanism. Additionally, the REST controllers for each module (CartController, CatalogController, OrderController) are now explicitly registered in the auto-configuration imports, ensuring they are automatically available when the respective starters are on the classpath.
sales/cart/spring-boot-starter, sales/catalog/spring-boot-starter, sales/order/spring-boot-starter · high confidence
Portal web layer migrated from server-side Thymeleaf to client-side JavaScript components
The portal's web presentation layer has been refactored from a server-side rendered model (Spring MVC controllers, Thymeleaf templates, and server-side layout advice) to a client-side single-page application architecture. Server-side controllers like OrderController and configuration classes like PortalWebConfig have been removed in favor of a new PortalController serving a static index.html and a suite of JavaScript modules (Application.js, CartPage.js, CatalogPage.js, OrderPage.js, etc.) that handle routing, rendering, and user interactions via custom elements. Corresponding Thymeleaf templates and i18n properties have been deleted, and the UI now relies on a new set of JavaScript services (cart, catalog, order, delivery, warehouse) to communicate with REST endpoints. The visual styling has also been updated with new CSS rules in layout.css.
portal/web · high confidence
Fixes
Corrected pagination parameter order in JDBC queries
The JDBC implementations for payments and product catalog queries now correctly pass pagination parameters in the order expected by the SQL statement. Previously, the code appended the start offset before the limit, but the SQL used \LIMIT ?,?\, causing the offset value to be interpreted as the limit. The code has been updated to append the limit first, then the start offset, and the SQL string now uses \LIMIT ? OFFSET ?\ to match this order, ensuring that pagination returns the correct range of results.
billing/payment/jdbc, sales/catalog/jdbc · high confidence
Test coverage
Refactored order workflow integration tests
The application module's integration tests for the order workflow have been refactored to use a shared abstract base class (OrderWorkFlow) that defines the test scenarios for order shipping, stock deduction, and payment collection. The concrete test classes (OrderWorkFlowTest and OrderWorkFlowTestIT) now extend this base class, providing the server port configuration, which simplifies test maintenance and ensures consistent verification of the end-to-end order process.
application · high confidence
Dependencies
Gradle wrapper updated to version 8.4
The project's Gradle wrapper has been updated to use Gradle 8.4, ensuring that builds are executed with this specific version of the build tool. This change standardizes the build environment and leverages the features and improvements available in Gradle 8.4.
gradle · high confidence
Upgrade to Spring Boot 3.2 and Java 17
The build configuration has been updated to use Spring Boot 3.2.0 and the dependency management plugin 1.1.4, requiring Java 17. This upgrade aligns the project with modern Jakarta EE namespaces and the latest Spring Boot features.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.
Score
- CAI 44 → 36 (-8.2)
- Rubric changed (rubric-2026.08.17 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 63 → 69 (+6.3)
- Architecture 100 → 94 (-6.3)
- Maturity 69 → 69 (+0.0)
- Readiness 23 → 23 (-0.3)
- Security 56 → 66 (+9.9)
- Accessibility 23 (new)
Resolved (24)
- Coverage not included — suite not readable by the collector
- Dependency hygiene not measured — no supported dependency manifest was read
- High IaC: KSV-0014 (1-infrastructure.k8s.yml)
- High IaC: KSV-0014 (2-backend-services.k8s.yml)
- High IaC: KSV-0118 (1-infrastructure.k8s.yml)
- High IaC: KSV-0118 (2-backend-services.k8s.yml)
- High IaC: KSV-0118 (3-frontend-portal.k8s.yml)
- High IaC: KSV-0118 (4-api-gateway.k8s.yml)
- Medium IaC: KSV-0001 (1-infrastructure.k8s.yml)
- Medium IaC: KSV-0001 (2-backend-services.k8s.yml)
- Medium: security finding (details withheld)
- Medium: security finding (details withheld)
- Medium: security finding (details withheld)
- Medium: security finding (details withheld)
- Medium: security finding (details withheld)
- Medium: security finding (details withheld)
- Medium: security finding (details withheld)
- Medium: security finding (details withheld)
- Medium: security finding (details withheld)
- No admission-control policy
- …and 4 more
New (403)
- Coverage not measured — no coverage collector is wired up
- Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- Duplicated block (11 lines × 12) (billing/payment/domain/src/main/java/com/ttulka/ecommerce/billing/payment/PaymentId.java)
- Duplicated block (11 lines × 3) (sales/cart/domain/src/main/java/com/ttulka/ecommerce/sales/cart/item/Title.java)
- Duplicated block (5 lines × 2) (sales/order/jdbc/src/main/java/com/ttulka/ecommerce/sales/order/jdbc/FindOrdersJdbc.java)
- Duplicated block (7 lines × 2) (sales/catalog/jdbc/src/main/java/com/ttulka/ecommerce/sales/catalog/jdbc/FindCategoriesJdbc.java)
- Duplicated block (8 lines × 2) (billing/payment/jdbc/src/main/java/com/ttulka/ecommerce/billing/payment/jdbc/PaymentsJdbc.java)
- Duplicated block (9 lines × 2) (billing/payment/jdbc/src/main/java/com/ttulka/ecommerce/billing/payment/jdbc/PaymentsJdbc.java)
- High IaC: KSV-0014 (1-infrastructure.k8s.yml)
- High IaC: KSV-0014 (1-infrastructure.k8s.yml)
- High IaC: KSV-0014 (2-backend-services.k8s.yml)
- High IaC: KSV-0014 (2-backend-services.k8s.yml)
- High IaC: KSV-0014 (2-backend-services.k8s.yml)
- High IaC: KSV-0014 (2-backend-services.k8s.yml)
- High IaC: KSV-0014 (2-backend-services.k8s.yml)
- High IaC: KSV-0014 (2-backend-services.k8s.yml)
- High IaC: KSV-0014 (2-backend-services.k8s.yml)
- High IaC: WD-COMPOSE-0002 (docker-compose.yml)
- …and 383 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
ttulka/ddd-example-ecommerce-microservices was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 20 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 374ef774c55dbe9e9e18a9026c63af713f889658 — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-28e75b8e3254.