{"id":28823635,"url":"https://github.com/tmorin/faggregate","last_synced_at":"2025-10-28T11:42:52.319Z","repository":{"id":141661717,"uuid":"465323936","full_name":"tmorin/faggregate","owner":"tmorin","description":"Unlock the Power of DDD Aggregates and Functional Programming with `faggregate`!","archived":false,"fork":false,"pushed_at":"2024-03-23T11:00:43.000Z","size":442,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-05-01T21:28:49.611Z","etag":null,"topics":["aggregate","ddd","functional-programming","java"],"latest_commit_sha":null,"homepage":"https://tmorin.github.io/faggregate/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tmorin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2022-03-02T13:47:47.000Z","updated_at":"2024-03-16T07:21:44.000Z","dependencies_parsed_at":"2024-02-17T19:24:59.797Z","dependency_job_id":"f73b5780-5d00-4682-ac16-c78b1b3a599a","html_url":"https://github.com/tmorin/faggregate","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/tmorin/faggregate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmorin%2Ffaggregate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmorin%2Ffaggregate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmorin%2Ffaggregate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmorin%2Ffaggregate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tmorin","download_url":"https://codeload.github.com/tmorin/faggregate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmorin%2Ffaggregate/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260654700,"owners_count":23042680,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aggregate","ddd","functional-programming","java"],"created_at":"2025-06-19T00:10:39.743Z","updated_at":"2025-10-28T11:42:52.306Z","avatar_url":"https://github.com/tmorin.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# faggregate\n\n[![Continuous Integration - Build](https://github.com/tmorin/faggregate/actions/workflows/ci-build.yaml/badge.svg)](https://github.com/tmorin/faggregate/actions/workflows/ci-build.yaml)\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=tmorin_faggregate\u0026metric=alert_status)](https://sonarcloud.io/summary/new_code?id=tmorin_faggregate)\n\n\u003e Enhance DDD and Functional Programming with `faggregate`.\n\u003e\n\u003e `faggregate` offers Java developers tools and abstractions to streamline building scalable and robust software.\n\u003e Ideal for any developer level, it maximizes Domain Driven Design Aggregates and functional programming.\n\nThe library provides a simple and flexible way to define Aggregates:\n\n1. define the data structure of the aggregate's state\n2. define the commands and events which change the state\n3. define the side effects : initialization, storing, loading, destroying\n4. and finally bundle everything with the help of a nice builder\n\n\u003e Empower Your Development with DDD Aggregates \u0026 Functional Programming - Learn with this [Tutorial](https://tmorin.github.io/faggregate)!\n\n## Features\n\n### Outbox Pattern\n\nThe library handle the transactional part of the [Outbox Pattern](https://microservices.io/patterns/data/transactional-outbox.html).\n\nThe [todo-infra-quarkus](examples/todo-infra-quarkus) example demonstrates the usage of MongoDB to store the state and the domain events of an Aggregate.\n\n### Native Image\n\nThe library is designed to be integrated directly into a [Native Image](https://www.graalvm.org/latest/reference-manual/native-image/basics/).\n\nThe [todo-infra-quarkus](examples/todo-infra-quarkus) example provides an E2E example leveraging on [Quarkus](https://quarkus.io).\n\n### Functional\n\nThe library emphases some functional programing concepts like immutable structures.\n\nThe [todo-core](examples/todo-core) example provides an implementation leveraging on the [Immutables](https://immutables.github.io) Java library to easily and nicely force the immutable structures of the Aggregate state.\n\nThe [todo-core](examples/todo-core) module is also used by [todo-infra-quarkus](examples/todo-infra-quarkus).\nTherefore, it demonstrates [Immutables](https://immutables.github.io) can be used also within common Framework and Native Images.\n\n### Validation framework\n\nThe library provides a tiny framework ([core-scenario](core-scenario)) to drive and validate the implementation of side effects.\n\nThe [todo-core](examples/todo-core) example provides an implementation of scenarios suite.\n\nThe [todo-infra-quarkus](examples/todo-infra-quarkus) example proves its correctness executing the scenarios suite as an Integration Test.\n\n## Installation\n\nThe library provides an implementation: `faggregate-core-simple`.\nIts usage can be done _manually_ or via [Service Loader](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ServiceLoader.html).\n\nThe artifacts are deployed on [GitHub](https://github.com/tmorin?tab=packages\u0026repo_name=faggregate).\nTherefore, a custom configuration is required to resolve the artifacts, please review [Working with the Apache Maven registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry).\n\n### Manual integration\n\n[The GitHub Package](https://github.com/tmorin/faggregate/packages/1453016)\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.morin.faggregate\u003c/groupId\u003e\n    \u003cartifactId\u003efaggregate-core-simple\u003c/artifactId\u003e\n    \u003cversion\u003eVERSION\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### Service Loader integration\n\n[The GitHub Package](https://github.com/tmorin/faggregate/packages/1453021)\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.morin.faggregate\u003c/groupId\u003e\n    \u003cartifactId\u003efaggregate-spi-simple\u003c/artifactId\u003e\n    \u003cversion\u003eVERSION\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### The scenario framework\n\n[The GitHub Package](https://github.com/tmorin/faggregate/packages/1842497)\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.morin.faggregate\u003c/groupId\u003e\n    \u003cartifactId\u003efaggregate-core-scenario\u003c/artifactId\u003e\n    \u003cversion\u003eVERSION\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## Maintenance\n\n**Dependencies upgrade**\n```shell\n./mvnw versions:display-dependency-updates\n```\n\n**Release**\n```shell\n./mvnw --batch-mode release:clean \\\n\u0026\u0026 ./mvnw --batch-mode release:prepare \\\n  -DreleaseVersion=X.Y.Z \\\n  -DdevelopmentVersion=Y.X.Z-SNAPSHOT\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmorin%2Ffaggregate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftmorin%2Ffaggregate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmorin%2Ffaggregate/lists"}