j5ik2o/scala-ddd-base
61.1
Adequate · 21 September 2026
2.9k
lines of production code
Scala
primary language
4
measurements over time
What this system is
This system is a Domain-Driven Design (DDD) base library that provides a standardized interface for managing aggregate states across multiple storage backends. It supports hard and soft deletion, as well as single and multi-aggregate read and write operations. The library offers concrete implementations for relational databases (via Slick and Skinny), NoSQL stores (DynamoDB, Redis, Memcached), and in-memory caches, allowing developers to persist and query aggregates consistently regardless of the underlying data store.
Features
Add DynamoDB aggregate persistence features
The nosql/dynamodb module now includes a complete set of traits for DynamoDB-backed aggregate persistence. This adds the base IO feature, single and multi read/write/delete features, and the underlying DAO support for interacting with DynamoDB. Users can now implement these traits to persist aggregates to DynamoDB using the reactive-aws-dynamodb client.
nosql/dynamodb · high confidence
Add example implementations for UserAccount and UserMessage across multiple storage backends
Added example implementations for UserAccount and UserMessage entities, providing concrete data access and repository layers for DynamoDB, Redis, Memcached, in-memory (Guava cache), Slick, and Skinny. Each backend-specific component defines the record structure and DAO, while the repository layer bridges the domain models to the underlying storage, enabling users to see how to integrate these storage options with the DDD base library.
example · high confidence
Add in-memory aggregate read, write, and delete features
The \nosql/memory\ module now provides a complete set of in-memory aggregate features, including single and multi read, single and multi write, single and multi soft/hard delete, and a new \resolveAll\ capability. These new traits implement the core data access operations for in-memory storage, allowing users to persist and query aggregates without an external database.
nosql/memory · high confidence
Added Memcached and Redis persistence features for aggregates
Introduced new traits and implementations for Memcached and Redis backends, enabling single and multi-aggregate read, write, and delete operations. Each backend provides base features for reading and writing, as well as specific handlers for hard and soft deletes, allowing users to persist and manage aggregate states in these NoSQL stores.
nosql/memcached · high confidence
Added build configuration and utility helpers for the SBT build
The project's build infrastructure was initialized with new files: project/build.properties sets the SBT version to 1.2.8, and project/plugins.sbt adds a suite of SBT plugins including scalastyle, scalafmt, sbt-release, sbt-sonatype, sbt-pgp, sbt-wix-embedded-mysql, sbt-dao-generator, flyway-sbt, and sbt-updates, along with a repository and library dependency. Additionally, project/Utils.scala was added to provide SBT logger conversion utilities and a helper for generating temporary server ports during build or test execution.
project · high confidence
Expanded aggregate deletion and querying capabilities
The core library now supports multi-aggregate hard and soft deletion, as well as querying all aggregates. New traits \AggregateMultiHardDeletable\ and \AggregateSingleHardDeletable\ allow deleting multiple or single aggregates via hard delete, while \AggregateMultiSoftDeletable\ and \AggregateSingleSoftDeletable\ provide soft delete functionality. Additionally, \AggregateAllReader\ enables fetching all aggregates, and \AggregateChunkReader\ supports paginated queries with offset and limit. The return types for \store\ and \storeMulti\ in \AggregateSingleWriter\ and \AggregateMultiWriter\ have been changed from \Int\ to \Long\ to better represent the number of affected rows.
core · high confidence
Initial project scaffolding and configuration
The repository was initialized with essential project configuration files: a \.scalafmt.conf\ for code formatting, a \scalastyle-config.xml\ for code style enforcement, a \release.sbt\ for automated release processes, and a \version.sbt\ setting the project version to 1.0.28-SNAPSHOT. Additionally, a \LICENSE\ file (MIT) and a \README.md\ documenting the \scala-ddd-base\ library were added to the project root.
(repo-wide) · high confidence
Migrate Slick DAO layer to Monix Task and add multi-aggregate operations
The Slick DAO implementation in the jdbc/slick module has been refactored to use Monix's Task for all asynchronous database operations, replacing the previous RIO abstraction. This change introduces new capabilities for handling multiple aggregates, including reading all entities (resolveAll), chunked reads (resolveMultiWithOffsetLimit), and multi-writes (storeMulti). Additionally, the module now supports soft and hard deletion of multiple records, as well as single and multi-record reads and writes, providing a more comprehensive set of operations for aggregate management.
jdbc/slick · medium confidence
New Skinny ORM integration for JPA-style aggregate persistence
Added a new \jdbc/skinny\ module that provides a set of Scala traits to integrate the Skinny ORM with the DDD base library. This includes \SkinnyDaoSupport\ which defines the \SkinnyDao\ interface for CRUD operations, and feature traits like \AggregateSingleReadFeature\, \AggregateMultiReadFeature\, \AggregateSingleWriteFeature\, and various delete features (hard/soft) that map DDD aggregates to database records using Monix \Task\ and Cats \ReaderT\ for asynchronous database sessions.
jdbc/skinny · high confidence
Behavioural changes
Removal of Slick aggregate repository traits
The Slick-based repository layer for aggregates has been removed. Specifically, the traits for single and multi-read/write operations (AggregateBaseReadFeature, AggregateMultiReadFeature, AggregateMultiWriteFeature, AggregateSingleWriteFeature, and AggregateSoftDeleteFeature) have been deleted from the codebase. This eliminates the previous implementation of aggregate persistence using Slick and Monix, indicating a shift away from this specific data access pattern.
slick · high confidence
Test coverage
Added test schema for multi-column primary keys
Updated the test database migration script to include a new \user\_message\ table with a composite primary key on \user\_id\ and \message\_id\, along with a corresponding sequence table, to support testing scenarios involving multiple primary keys.
flyway · high confidence
Dependencies
Update reactive-aws-client, reactive-redis, and reactive-dynamodb versions
The build.sbt file has been updated to upgrade the versions of several reactive client libraries. Specifically, the versions for reactive-aws-client, reactive-redis, and reactive-dynamodb have been updated to their latest releases. This ensures the project uses the most recent stable versions of these dependencies, which may include bug fixes, performance improvements, or new features provided by the upstream libraries.
(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 67 → 61 (-6.2)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 100 → 97 (-3.1)
- Architecture 100 → 87 (-13.4)
- Maturity 54 → 49 (-5.5)
- Readiness 70 → 61 (-9.0)
- Security 78 → 78 (+0.0)
Resolved (7)
- Coverage not included — suite not readable by the collector
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- No exposed public API
- Test reliability not included
- complexity unreadable for .scala — churn × complexity hotspots could not be measured
- no production source files with tracked history to analyse
- no production source files with tracked history to analyse
New (26)
- Documentation: no installation or build instructions (README.md)
- Duplicated block (10 lines × 2) (example/src/main/scala/com/github/j5ik2o/dddbase/example/dao/dynamodb/UserAccountComponent.scala)
- Duplicated block (10 lines × 2) (example/src/main/scala/com/github/j5ik2o/dddbase/example/dao/memcached/UserAccountComponent.scala)
- Duplicated block (10–11 lines × 2) (example/src/main/scala/com/github/j5ik2o/dddbase/example/dao/dynamodb/UserAccountComponent.scala)
- Duplicated block (13 lines × 2) (example/src/main/scala/com/github/j5ik2o/dddbase/example/dao/dynamodb/UserAccountComponent.scala)
- Duplicated block (13 lines × 2) (example/src/main/scala/com/github/j5ik2o/dddbase/example/dao/dynamodb/UserAccountComponent.scala)
- Duplicated block (13 lines × 2) (example/src/main/scala/com/github/j5ik2o/dddbase/example/repository/skinny/UserAccountRepositoryBySkinny.scala)
- Duplicated block (13 lines × 2) (example/src/main/scala/com/github/j5ik2o/dddbase/example/repository/skinny/UserAccountRepositoryBySkinny.scala)
- Duplicated block (13 lines × 4) (example/src/main/scala/com/github/j5ik2o/dddbase/example/repository/dynamodb/UserAccountRepositoryOnDynamoDB.scala)
- Duplicated block (13 lines × 4) (example/src/main/scala/com/github/j5ik2o/dddbase/example/repository/dynamodb/UserAccountRepositoryOnDynamoDB.scala)
- Duplicated block (15–16 lines × 2) (example/src/main/scala/com/github/j5ik2o/dddbase/example/dao/dynamodb/UserAccountComponent.scala)
- Duplicated block (16 lines × 2) (example/src/main/scala/com/github/j5ik2o/dddbase/example/dao/dynamodb/UserAccountComponent.scala)
- Duplicated block (16 lines × 2) (example/src/main/scala/com/github/j5ik2o/dddbase/example/repository/memcached/UserAccountRepositoryOnMemcached.scala)
- Duplicated block (16 lines × 2) (example/src/main/scala/com/github/j5ik2o/dddbase/example/repository/memcached/UserAccountRepositoryOnMemcached.scala)
- Duplicated block (5–6 lines × 4) (example/src/main/scala/com/github/j5ik2o/dddbase/example/dao/dynamodb/UserAccountComponent.scala)
- Duplicated block (7 lines × 2) (example/src/main/scala/com/github/j5ik2o/dddbase/example/dao/dynamodb/UserMesssageComponent.scala)
- Duplicated block (7 lines × 2) (example/src/main/scala/com/github/j5ik2o/dddbase/example/dao/memcached/UserAccountComponent.scala)
- Duplicated block (7 lines × 2) (example/src/main/scala/com/github/j5ik2o/dddbase/example/dao/memcached/UserAccountComponent.scala)
- Duplicated block (7 lines × 2) (nosql/memcached/src/main/scala/com/github/j5ik2o/dddbase/memcached/AggregateSingleReadFeature.scala)
- Duplicated block (7–8 lines × 2) (example/src/main/scala/com/github/j5ik2o/dddbase/example/dao/dynamodb/UserMesssageComponent.scala)
- …and 6 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
j5ik2o/scala-ddd-base 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 5b2e0bc6d585480da96a85ace4ea1acf9b9976c1 — 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.