ivangfr/axon-springboot-websocket
45.1
Weak · 21 September 2026
3.1k
lines of production code
Java
with JavaScript
4
measurements over time
What this system is
This system is a food ordering application built on an event-driven, CQRS architecture using the Axon Framework and Spring Boot. It manages customer, order, and restaurant domains through distinct microservices that handle command processing, event sourcing, and real-time WebSocket updates. The codebase includes comprehensive test coverage and automated environment management scripts to support development and deployment workflows.
How it got here
2020 — CQRS and event-driven architecture migration
11 changes.
This period focused on migrating the codebase to an event-driven, CQRS architecture using the Axon Framework, introducing new services for food ordering and restaurant management. The work involved significant refactoring of existing services, updating build tooling and dependencies, and modernizing the frontend with Tailwind CSS and WebSocket integration.
2021–2022 — Domain model and test coverage
7 changes.
This period focused on establishing a robust domain-driven architecture by introducing comprehensive event models and refactoring service packages to align with a new namespace. Significant effort was also dedicated to increasing test coverage for both customer and food ordering services, alongside the addition of utility scripts and documentation diagrams.
Features
Add environment management scripts and configuration files
The project now includes shell scripts (\init-environment.sh\, \build-docker-images.sh\, \start-apps.sh\, \stop-apps.sh\, \remove-docker-images.sh\, \shutdown-environment.sh\) to automate the lifecycle of the development environment. These scripts handle starting and stopping Docker containers for Axon Server, MySQL, PostgreSQL, and MongoDB, as well as building and running the Spring Boot applications. Additionally, \.editorconfig\ and \.gitattributes\ files have been added to enforce consistent code formatting and Git behavior across different operating systems.
(repo-wide) · high confidence
Add project overview diagram to documentation
A new interactive project overview diagram (project-overview.excalidraw) has been added to the documentation folder, providing a visual representation of the system architecture, including components like the food-ordering-service and websocket interactions.
documentation · high confidence
Added utility script for container log monitoring
A new shell script, scripts/my-functions.sh, was added to provide a reusable function for waiting for specific strings in Docker container logs, with a configurable timeout.
scripts · high confidence
Implement CQRS and event-driven architecture for customer, order, and restaurant domains
The application now enforces a strict separation between command (write) and query (read) models using Axon Framework. The \customer-service\ exposes REST endpoints to manage customers and their orders, projecting events into a JPA-backed read model. The \food-ordering-service\ introduces an \OrderAggregate\ to handle order creation and a repository projector to sync order state, while the \restaurant-service\ manages restaurant and dish entities with corresponding aggregates and projectors. Additionally, WebSocket handlers were added across services to broadcast real-time updates for customer, order, and restaurant events, and logging interceptors were introduced to trace command and event dispatching.
restaurant-service · high confidence
Introduces domain event models for customer, order, and restaurant aggregates
The axon-event-commons module now includes a comprehensive set of domain event classes for tracking changes to customers, orders, and restaurants. This includes specific events for adding, updating, and deleting customers, as well as order creation events containing item details. For restaurants, the module provides events for adding, updating, and deleting restaurants, along with specific events for adding, updating, and deleting menu items (dishes). These classes serve as the foundational data structures for the application's event-driven architecture.
axon-event-commons · high confidence
New food ordering service with real-time updates and multi-step wizard
A new food-ordering-service is introduced, providing a multi-step order placement wizard and real-time updates via WebSocket. The frontend, located in static/app.js, implements a state-driven wizard flow for orders and subscribes to STOMP topics for customers, restaurants, and dishes. The UI displays order details including formatted currency and dates, and shows a live connection status indicator.
food-ordering-service/src/main/resources/static · high confidence
Behavioural changes
Customer service UI migrated to Tailwind CSS and modernized JavaScript
The customer service interface has been updated with a new visual style using Tailwind CSS classes, replacing the previous styling approach. Additionally, the JavaScript logic for managing customer data and WebSocket connections has been refactored to use the Stomp.js library for WebSocket communication and the dayjs library for date formatting, improving how connection status is displayed and how order details are rendered in the customer list.
customer-service/src/main/resources/static · high confidence
Customer service UI migrated to Tailwind CSS with modern JavaScript libraries
The customer service interface has been rebuilt using Tailwind CSS for styling, replacing the previous framework. The template now includes a navigation bar with a WebSocket connection status indicator, a customer management form, and a customer list. The page also features custom confirmation and alert modals for user interactions. Additionally, the frontend dependencies have been updated to use jQuery 3.7.1, SockJS Client 1.6.1, STOMP.js 7.3.0, Day.js 1.11.18, and Accounting.js 0.4.1.
customer-service/src/main/resources/templates · medium confidence
Migrate customer-service configuration from YAML to properties format
The customer-service application configuration has been converted from YAML (application.yml) to the standard Java properties format (application.properties). This change includes the addition of environment variable placeholders for database credentials and Axon Server host/port, the removal of the Spring Boot Actuator and SpringDoc/Swagger UI configuration blocks, and the removal of the banner text. Users will see the service start with the new configuration structure, which may affect how environment variables are used for sensitive data and removes previously exposed actuator endpoints.
customer-service/src/main/resources, food-ordering-service/src/main/resources · high confidence
Redesigned order placement interface with multi-step wizard and modern styling
The order placement flow has been redesigned as a multi-step wizard that guides users through selecting a customer, restaurant, dishes, and a final review. The interface has been restyled using Tailwind CSS, replacing the previous styling framework, and includes a visual step indicator to track progress through the four stages of the order process.
food-ordering-service/src/main/resources/templates · high confidence
Refactor customer-service package structure and add Axon4 interceptors
The customer-service module has been migrated from the com.mycompany package to com.ivanfranchin.customerservice. New Axon 4.5.14 interceptors (CommandLoggingDispatchInterceptor, EventLoggingDispatchInterceptor) and their configuration (AxonConfig) have been added to log command dispatches and event publications. The ErrorAttributes bean was updated to use Spring Boot 4.0.6's webmvc-specific classes and exclude EXCEPTION from error attributes. Several classes were renamed or repurposed (e.g., CustomerDeletedEvent to GetCustomerOrdersQuery, DishPk to OrderItem) to align with the new package structure and domain model.
customer-service/src/main/java/com/ivanfranchin · medium confidence
Refactored food-ordering-service package structure and domain model
The food-ordering-service has been refactored to use the \com.ivanfranchin\ package namespace, replacing the previous \com.mycompany\ structure. This change includes renaming classes to better reflect their domain roles (e.g., \OrderDto\ to \Order\ model, \OpenOrderCommand\ to \CreateOrderCommand\) and moving files into more specific sub-packages (e.g., \customer\, \order\, \restaurant\). Additionally, the \ErrorAttributesConfig\ was updated to use the Spring Boot 3/4 compatible \webmvc\ error attributes, and the \Order\ model was converted to a proper domain entity with MongoDB annotations.
food-ordering-service/src/main/java/com/ivanfranchin · high confidence
Removal of legacy order and restaurant domain models and services
The food-ordering-service has removed a large number of Java classes related to the previous implementation, including the OrderAggregate, Order model, OrderItem model, and associated controllers, repositories, and services for customers, restaurants, and dishes. This cleanup removes the old JPA-based persistence layer and command handlers, likely as part of a migration to a new architecture (such as event sourcing or a different data store), as indicated by the deletion of files like OrderAggregate.java, OrderController.java, and various service/DTO classes.
food-ordering-service/src/main/java/com/mycompany · high confidence
Removed customer management endpoints and related components from customer-service
The customer-service module has had its customer management capabilities removed. This includes the deletion of the Customer model, repository, mapper, controller, DTOs, and service interfaces, along with associated events and queries. As a result, the API endpoints for creating, updating, deleting, and retrieving customers are no longer available in this service.
customer-service/src/main/java/com/mycompany · high confidence
Upgraded Maven Wrapper to version 3.3.4 and Maven distribution to 3.9.16
The project's Maven wrapper has been upgraded from version 0.5.6 to 3.3.4, and the underlying Maven distribution has been updated from 3.6.3 to 3.9.16. This change modernizes the build tooling, ensuring that developers and CI systems use a consistent, up-to-date version of Maven for all builds, which may include performance improvements and bug fixes associated with the newer Maven and wrapper versions.
.mvn · high confidence
Test coverage
Added comprehensive test coverage for the food ordering service; Added comprehensive test suite for the customer service.
Dependencies
Upgrade to Spring Boot 4.1.0 and Axon 4.13.1 with new shared event module
The project has been upgraded to Spring Boot 4.1.0 and Axon Framework 4.13.1, introducing significant changes to the build configuration and dependencies. A new shared module, \axon-event-commons\, has been added to the multi-module build, allowing services to share common event definitions. The parent project's group ID and artifact ID have been updated to \com.ivanfranchin/axon-springboot-websocket\, and the Java version target has been raised to 25. Individual services now depend on \axon-event-commons\ and include specific test dependencies for JPA, Thymeleaf, WebSocket, and Testcontainers (MySQL, MongoDB, PostgreSQL). Additionally, the root \pom.xml\ now enforces code formatting via the Spotless plugin, and services have replaced generic \spring-boot-starter-web\ with \spring-boot-starter-webmvc\ and \spring-boot-starter-websocket\.
(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
Score
- CAI 47 → 45 (-1.8)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 98 → 97 (-0.9)
- Architecture 100 → 92 (-8.4)
- Maturity 73 → 72 (-0.6)
- Readiness 26 → 31 (+5.1)
- Security 100 → 89 (-11.4)
- Domain Modelling 70 → 53 (-16.4)
- Event Sourcing 100 → 100 (+0.0)
- Accessibility 48 → 43 (-4.7)
Resolved (13)
- Coverage not included — suite not readable by the collector
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- Duplicated block (10 lines × 2) (food-ordering-service/src/main/java/com/ivanfranchin/foodorderingservice/restaurant/repository/RestaurantRepositoryProjector.java)
- Duplicated block (12 lines × 2) (food-ordering-service/src/main/java/com/ivanfranchin/foodorderingservice/order/rest/dto/OrderResponse.java)
- Duplicated block (6 lines × 2) (customer-service/src/main/java/com/ivanfranchin/customerservice/repository/CustomerRepositoryProjector.java)
- Duplicated block (6 lines × 2) (food-ordering-service/src/main/java/com/ivanfranchin/foodorderingservice/restaurant/rest/dto/RestaurantResponse.java)
- Duplicated block (8 lines × 2) (food-ordering-service/src/main/java/com/ivanfranchin/foodorderingservice/order/repository/OrderRepositoryProjector.java)
- Duplicated block (8 lines × 2) (food-ordering-service/src/main/java/com/ivanfranchin/foodorderingservice/restaurant/repository/RestaurantRepositoryProjector.java)
- Duplicated block (9 lines × 2) (food-ordering-service/src/main/java/com/ivanfranchin/foodorderingservice/restaurant/repository/RestaurantRepositoryProjector.java)
- No exposed public API
- Prerequisites (Axon setup, Spring Boot dependencies) are not fully stated in the visible text. (README.md)
- Scanner failed to run — not a clean result
- Test reliability not included
New (69)
- 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 (10 lines × 2) (food-ordering-service/src/main/java/com/ivanfranchin/foodorderingservice/order/rest/dto/OrderResponse.java)
- Duplicated block (10 lines × 2) (food-ordering-service/src/main/java/com/ivanfranchin/foodorderingservice/restaurant/repository/RestaurantRepositoryProjector.java)
- Duplicated block (15 lines × 2) (food-ordering-service/src/main/java/com/ivanfranchin/foodorderingservice/restaurant/repository/RestaurantRepositoryProjector.java)
- Duplicated block (22 lines × 3) (customer-service/src/main/java/com/ivanfranchin/customerservice/websocket/WebSocketConfig.java)
- Duplicated block (25 lines × 3) (customer-service/src/main/java/com/ivanfranchin/customerservice/config/ErrorAttributesConfig.java)
- Duplicated block (29 lines × 3) (customer-service/src/main/java/com/ivanfranchin/customerservice/config/AxonConfig.java)
- Duplicated block (42 lines × 3) (customer-service/src/main/java/com/ivanfranchin/customerservice/websocket/WebSocketHandler.java)
- Duplicated block (5 lines × 2) (food-ordering-service/src/main/java/com/ivanfranchin/foodorderingservice/restaurant/rest/dto/RestaurantResponse.java)
- Duplicated block (5 lines × 3) (customer-service/src/main/java/com/ivanfranchin/customerservice/repository/CustomerRepositoryProjector.java)
- Duplicated block (51 lines × 2) (customer-service/src/main/java/com/ivanfranchin/customerservice/model/Order.java)
- Duplicated block (56 lines × 2) (food-ordering-service/src/main/java/com/ivanfranchin/foodorderingservice/order/websocket/WebSocketHandler.java)
- Duplicated block (5–8 lines × 2) (customer-service/src/main/java/com/ivanfranchin/customerservice/repository/CustomerRepositoryProjector.java)
- Duplicated block (6 lines × 2) (axon-event-commons/src/main/java/com/ivanfranchin/axoneventcommons/customer/CustomerDeletedEvent.java)
- Duplicated block (7 lines × 2) (food-ordering-service/src/main/java/com/ivanfranchin/foodorderingservice/restaurant/repository/RestaurantRepositoryProjector.java)
- Duplicated block (8 lines × 2) (customer-service/src/main/java/com/ivanfranchin/customerservice/repository/CustomerRepositoryProjector.java)
- Duplicated block (9 lines × 2) (customer-service/src/main/java/com/ivanfranchin/customerservice/rest/dto/CustomerResponse.java)
- Duplicated block (9 lines × 2) (food-ordering-service/src/main/java/com/ivanfranchin/foodorderingservice/restaurant/repository/RestaurantRepositoryProjector.java)
- …and 49 more
Architecture
- Containers 0 added · 0 removed · contexts 2 added · 0 removed · edges 0 added · 0 removed
Added bounded contexts (2)
- customer-service
- food-ordering-service
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
ivangfr/axon-springboot-websocket 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 21 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 a46df16c7fd25c98599019ba32e4c42a489e3597 — 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-fa71c66cabd8.