thangchung/northwind-dotnet
33.5
Weak · 21 September 2026
10.6k
lines of production code
C#
primary language
4
measurements over time
What this system is
This is a .NET 6-based microservices platform for managing products, sales, shipping, and human resources, orchestrated through a central API gateway. It employs an event-driven architecture using Kafka and Dapr to synchronize state across services like ProductCatalog, SalePayment, and HumanResources. The system supports both synchronous HTTP/gRPC interactions and asynchronous domain event processing, with shared infrastructure handling caching, authentication, and database persistence.
Features
Add Avro schemas and generated C\# classes for integration events
Added Avro schema definitions (.avsc) and auto-generated C\# classes for a range of integration events, including Customer, Employee, Product, Shipper, Supplier, and Order events. These classes implement the MediatR INotification interface, enabling the system to publish and handle domain events such as creation, update, and deletion for these entities.
shared/Northwind.IntegrationEvents/Avro · high confidence
Add Blazor Web client for product management
The BlazorWeb project now includes a complete client-side interface for managing products. This includes a REST API client interface (IAppApi) for creating, reading, updating, and deleting products, along with Razor components for the product list (Products.razor) and a modal form for creating/editing products (NewProduct.razor). The application is configured in Program.cs to connect to the backend API and includes standard Blazor layout and navigation components.
BlazorWeb · high confidence
Add CDC consumers and database models for customer, employee, and product information
The SalePayment service now includes Change Data Capture (CDC) consumers that synchronize Customer, Employee, and Product information from upstream services into the local database. Additionally, compiled EF Core models and a database migration are added to persist CustomerInfo, EmployeeInfo, ProductInfo, Order, OrderDetails, and OrderOutbox entities in the 'sale\_payment' schema.
SalePayment · high confidence
Add core domain, specification, and repository abstractions
The shared N8T.Core library now includes foundational domain and data-access abstractions. This adds entity and aggregate root base classes with domain event tracking, a domain event model wrapping MediatR notifications, a Dapr Pub/Sub attribute, and a validation-enabled Outbox entity. It also introduces a repository interface for aggregate roots, a specification pattern with support for AND/OR/Negation, filtering, sorting, and paging, along with helper classes for DateTime and Guid generation.
shared/N8T.Core · high confidence
Added EF Core infrastructure for database access and transactional MediatR pipeline behavior
The shared N8T.Infrastructure.EfCore library introduces a new data access layer. It provides a base DbContext (AppDbContextBase) that collects and clears domain events, and a generic RepositoryBase implementing IRepository and IGridRepository for standard CRUD and specification-based queries. A TxBehavior pipeline behavior wraps MediatR commands marked as ITxRequest in a database transaction, ensuring domain events are published within the same atomic scope. Additionally, the library includes design-time factory support for migrations, extension methods to register PostgreSQL/Entity Framework Core services, and a script-based migration helper.
shared/N8T.Infrastructure.EfCore · high confidence
Added HTTP client scripts for order, product, and Kafka integration
New HTTP client scripts were added to the \_httpclient directory to facilitate testing and interaction with the system. The order.http file provides endpoints for creating orders, processing payments, and managing shipment states (pick and delivery). The product.http file exposes CRUD operations for the product catalog, including health checks and product listing. Additionally, kafka\_connect.http and kafka\_rest.http files were introduced to configure Kafka Connectors for Change Data Capture (CDC) from PostgreSQL databases (product\_outboxes and order\_outboxes) and to manage Kafka topics via the REST API.
_\httpclient · high confidence
Added audit service and message definitions
New Protocol Buffer definitions have been added to the Northwind integration events, introducing an audit service. This includes the 'Audit' message type and an 'Auditor' gRPC service with 'Ping' and 'SubmitAudit' RPCs, enabling the submission of audit events with details like correlation ID, event type, status, actor, and timestamp.
shared/Northwind.IntegrationEvents/proto · high confidence
Added compiled Entity Framework Core models for the Human Resources domain
The HumanResources/Data/CompiledModels directory now contains auto-generated C\# classes that define the database schema for entities such as Employee, Customer, Supplier, and their associated outbox and join tables. These compiled models provide a pre-built, optimized representation of the data layer, which improves startup performance and ensures the database context is correctly configured with all entity mappings, relationships, and constraints.
HumanResources/Data · high confidence
Adds infrastructure for authentication, caching, and messaging
The shared infrastructure library now includes a new authentication pipeline behavior that enforces JWT-based authorization on MediatR requests, a Redis caching service with configurable expiration and connection options, and a message bus abstraction supporting both Dapr and Kafka consumers for event-driven architectures.
shared/N8T.Infrastructure · high confidence
Initial database schema and domain model for CustomerService
The CustomerService now includes the initial Entity Framework Core model, domain entities, and database migration for managing customer data. This introduces three new tables in the 'customer\_service' schema: 'customer\_demographics' for storing demographic details, 'customers\_info' for customer details, and 'customer\_customer\_demo' as a linking table. The service is configured to use a PostgreSQL database via the 'northwind\_db' connection string and listens on port 80 (HTTP) and 443 (HTTPS) within a Docker container.
CustomerService · high confidence
Initial database schema and event-driven synchronization for the Product Catalog
The Product Catalog now includes a complete database schema (migrations and compiled models) for entities including Products, Categories, Suppliers, and a Product View, along with consumers that synchronize state via domain events (ProductCreated/Updated/Deleted, SupplierCreated/Updated/Deleted). This enables the catalog to maintain a read-optimized view of product data that is updated in response to changes in the source of truth.
ProductCatalog · high confidence
Initial project scaffolding and local development environment
The repository has been initialized with a complete .NET 6 solution structure, including shared infrastructure and domain projects (N8T.Core, N8T.Infrastructure), alongside microservice applications (ProductCatalog, HumanResources, SalePayment, Shipping, AuditCenter, AppGateway, BlazorWeb). The change introduces a local development environment via Tye (tye.yaml) and Docker Compose (docker-compose.yaml) configurations to run supporting services such as Redis, PostgreSQL, Kafka, and MongoDB. Additionally, global using directives and package references for libraries like MediatR, FluentValidation, Dapr, and MassTransit are established to support the microservices' internal architecture.
(repo-wide) · high confidence
Initial release of the HumanResources service
The HumanResources microservice is introduced, providing APIs to create and manage employees, customers, shippers, and suppliers. The service is containerized via a new Dockerfile and configured with structured logging (Serilog) and a PostgreSQL database connection. Each entity includes a Create command that persists data and exports change data capture (CDC) events to Kafka, enabling downstream consumers to track these specific resource changes.
HumanResources · high confidence
Introduce AppGateway as a reverse proxy for product, sale, and ship services
A new AppGateway service has been added, configured via YARP to route traffic to the product, sale, and ship applications. The gateway exposes routes at /product-api, /sale-api, and /ship-api, stripping the prefix and forwarding requests to the respective backend services on ports 5002, 5003, and 5004. This change introduces a new entry point for accessing these microservices through a single gateway.
AppGateway · high confidence
Introduce AuditCenter gRPC service
Added a new .NET 6-based gRPC service named AuditCenter. It exposes a Greeter service for testing and an AuditService that logs incoming audit events. The service is configured to listen on port 5006 using HTTP/2, with a corresponding Dockerfile and launch settings provided for containerized and local development.
AuditCenter · high confidence
Introduce shipping domain models and database persistence
The Shipping service now includes domain models for ShipperInfo, ShippingOrder, and State, along with the corresponding Entity Framework Core configuration, database context, and initial migration scripts. This establishes the underlying data schema and persistence layer for tracking shipments and associated state information.
Shipping · high confidence
Introduces domain models for the Human Resources service
The HumanResources/Domain layer now includes new domain entities for managing employee, customer, supplier, shipper, and region data, along with an AddressInfo value object and corresponding outbox classes for each entity to support event-driven communication.
HumanResources/Domain · medium confidence
New order and shipment lifecycle event contracts
Added a comprehensive set of integration event contracts for the Northwind system, covering the full order and shipment lifecycle. This includes events for order submission, validation, confirmation, completion, cancellation, and status updates, as well as payment processing outcomes and detailed shipment tracking states (prepared, dispatched, delivered) including their respective failure scenarios.
shared/Northwind.IntegrationEvents/Contracts · high confidence
Behavioural changes
Updated Kafka Connect Elasticsearch connector to version 11.1.2
The \confluentinc-kafka-connect-elasticsearch\ connector has been updated to version 11.1.2. This update includes the latest documentation, license files, and dependency license information for the connector, ensuring compliance with the Confluent Community License and Apache 2.0 licenses for its dependencies.
_\_build, \build/debezium/connectors/confluentinc-kafka-connect-jdbc-10.2.1 · high confidence
Dependencies
Migrate to .NET 6 and update core libraries
The project has been upgraded to target .NET 6.0 across all service and shared library projects. This includes updating the ASP.NET Core, Entity Framework Core, and various third-party dependencies (such as MassTransit, Serilog, and FluentValidation) to versions compatible with the new framework.
(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 36 → 34 (-2.6)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 74 → 73 (-0.7)
- Architecture 81 → 81 (+0.2)
- Maturity 39 → 39 (+0.0)
- Readiness 24 → 24 (-0.7)
- Security 42 → 31 (-10.5)
- Domain Modelling 58 → 60 (+2.0)
- Event-Driven 82 → 82 (+0.0)
- Accessibility 51 → 51 (-0.3)
- Performance 70 → 70 (+0.0)
Resolved (26)
- Bounded contexts not declared
- Duplicated block (7 lines × 2) (CustomerService/Data/MainDbContext.cs)
- LLM evaluation failed
- LLM evaluation failed
- Medium IaC: CKV_DOCKER_2 (_build/debezium/Dockerfile)
- Medium IaC: CKV_DOCKER_3 (AppGateway/Dockerfile)
- Medium IaC: CKV_DOCKER_3 (AuditCenter/Dockerfile)
- Medium IaC: CKV_DOCKER_3 (CustomerService/Dockerfile)
- Medium IaC: CKV_DOCKER_3 (HumanResources/Dockerfile)
- Medium IaC: CKV_DOCKER_3 (ProductCatalog/Dockerfile)
- Medium IaC: CKV_DOCKER_3 (SalePayment/Dockerfile)
- Medium IaC: CKV_DOCKER_3 (Shipping/Dockerfile)
- Medium IaC: CKV_DOCKER_7 (AppGateway/Dockerfile)
- Medium IaC: CKV_DOCKER_7 (AuditCenter/Dockerfile)
- Medium IaC: CKV_DOCKER_7 (CustomerService/Dockerfile)
- Medium IaC: CKV_DOCKER_7 (HumanResources/Dockerfile)
- Medium IaC: CKV_DOCKER_7 (ProductCatalog/Dockerfile)
- Medium IaC: CKV_DOCKER_7 (SalePayment/Dockerfile)
- Medium IaC: CKV_DOCKER_7 (Shipping/Dockerfile)
- Medium IaC: CKV_DOCKER_8 (_build/debezium/Dockerfile)
- …and 6 more
New (63)
- CommentedOutCode (ProductCatalog/Data/Extensions.cs)
- CommentedOutCode (SalePayment/Extensions.cs)
- CommentedOutCode (SalePayment/Extensions.cs)
- CommentedOutCode (SalePayment/Extensions.cs)
- CommentedOutCode (SalePayment/Extensions.cs)
- CommentedOutCode (SalePayment/Extensions.cs)
- CommentedOutCode (SalePayment/Extensions.cs)
- Documentation: no contributor guidance
- Documentation: no installation or build instructions
- Documentation: no installation or build instructions (README.md)
- Documentation: no licence statement
- Documentation: no project overview
- Documentation: no usage examples
- Duplicated block (10 lines × 2) (Shipping/UseCases/DeliverShipment.cs)
- Duplicated block (10 lines × 2) (shared/N8T.Core/Specification/ISpecification.cs)
- Duplicated block (5 lines × 2) (shared/N8T.Core/Specification/GridSpecificationBase.cs)
- Duplicated block (7 lines × 2) (ProductCatalog/UseCases/GetProductView.cs)
- Duplicated block (9 lines × 2) (CustomerService/Data/MainDbContext.cs)
- Duplicated block (9 lines × 2) (SalePayment/StateMachines/OrderStateMachineDefinition.cs)
- End-of-life runtime: .NET net6.0
- …and 43 more
API surface
- Unchanged — 14 HTTP endpoints
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
thangchung/northwind-dotnet 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 1af077c209f74c5357ac074d8bfcde8cdbc34d79 — 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-7e99f679af8e.