Refactor/journal event foundation 2 - #944
Merged
Merged
Conversation
dieppa
force-pushed
the
refactor/journal_event_foundation_2
branch
from
July 29, 2026 16:49
dba3eec to
95c7054
Compare
dieppa
marked this pull request as ready for review
July 29, 2026 17:44
There was a problem hiding this comment.
Pull request overview
Refactors the audit-store “audit persistence” surface toward a per-stage factory model (enabling stage-scoped journal sequencing) and introduces the initial local journal abstractions + MongoDB-sync implementation gated by a feature flag.
Changes:
- Introduces
AuditPersistenceFactoryand updates core execution/operations wiring to resolve per-stageAuditWriter/persistence viaAuditStore. - Adds local journal primitives (
JournalEventReader/Store, sequencer + factory) and MongoDB-sync journal persistence with feature-flagged behavior. - Adds/updates tests and design docs for the journal and per-stage writer approach; bumps
generalUtilVersion.
Reviewed changes
Copilot reviewed 44 out of 45 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| platform-plugins/flamingock-springboot-integration/src/test/java/io/flamingock/springboot/ValidationOnlyIntegrationTest.java | Updates Spring Boot validation-only integration test to the new AuditStore/factory wiring. |
| legacy/mongock-support/src/main/java/io/flamingock/support/mongock/MongockImportChange.java | Switches importer to request per-stage AuditWriter via AuditPersistenceFactory. |
| docs/THIN_PER_STAGE_WRITER_EXPLAINED.md | New design doc explaining the “thin per-stage writer” approach. |
| docs/CHANGE_STATE_JOURNAL_WRITE_DESIGN.md | New proposal doc for atomic ChangeState+JournalEvent writes and sequencing. |
| core/target-systems/flamingock-mongodb-sync-targetsystem/src/main/java/io/flamingock/targetsystem/mongodb/sync/MongoDBSyncTxWrapper.java | Minor log message tweak in MongoDB transaction wrapper. |
| core/target-systems/flamingock-mongodb-sync-targetsystem/src/main/java/io/flamingock/targetsystem/mongodb/sync/MongoDBSyncTargetSystem.java | Lazily initializes tx wrapper to support audit-store usage without full target-system initialization. |
| core/flamingock-core/src/test/java/io/flamingock/internal/core/operation/OperationResolverTest.java | Updates operation routing test to pass AuditStore instead of raw persistence. |
| core/flamingock-core/src/test/java/io/flamingock/internal/core/operation/AuditListOperationTest.java | Adjusts imports/types for moved AuditPersistence. |
| core/flamingock-core/src/test/java/io/flamingock/internal/core/context/BasicRuntimeContextTest.java | New tests for BasicRuntimeContext layering and transaction-wrapper dependency injection. |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/plan/community/CommunityExecutionPlanner.java | Generalizes planner to consume AuditReader (not community-specific reader). |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/pipeline/execution/StageExecutor.java | Resolves stage-scoped AuditWriter from AuditPersistenceFactory per stage execution. |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/operation/OperationResolver.java | Routes audit/issue operations through AuditStore faces and per-stage persistence factory. |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/operation/issue/IssueListOperation.java | Switches issue listing to use AuditReader. |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/operation/issue/IssueGetOperation.java | Switches issue lookup to use AuditReader. |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/operation/audit/AuditListOperation.java | Switches audit listing to use AuditReader. |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/operation/audit/AuditFixOperation.java | Writes audit fixes via per-stage AuditWriter from AuditPersistenceFactory, reads issues via AuditReader. |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/journal/JournalEventStore.java | New core journal store abstraction (read + acknowledge). |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/journal/JournalEventSequencerFactory.java | New factory to seed per-stream sequencers from persisted journal tail. |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/journal/JournalEventSequencer.java | New in-memory sequencer for stream ordering + event envelope creation. |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/journal/JournalEventReader.java | Renames/moves the read-only journal interface into core journal package. |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/external/store/AuditStore.java | Adds default AuditReader, per-stage persistence factory, closer, and non-guarded types to AuditStore. |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/external/store/audit/community/CommunityAuditReader.java | Moves snapshot-by-change-id default to shared AuditReader. |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/external/store/audit/community/CommunityAuditPersistence.java | Aligns community persistence to shared AuditPersistence type. |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/external/store/audit/cloud/CloudAuditPersistence.java | Aligns cloud persistence to shared AuditPersistence type and trims unused getters. |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/context/BasicRuntimeContext.java | New minimal RuntimeContext implementation for transaction wrapper usage outside change execution. |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/builder/CommunityChangeRunnerBuilder.java | Uses auditStore.getAuditReader() for execution planner construction. |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/builder/AbstractChangeRunnerBuilder.java | Registers AuditPersistenceFactory in context and passes AuditStore through to operation resolution. |
| core/flamingock-core/src/main/java/io/flamingock/internal/core/builder/AbstractBuilder.java | Removes old “extract persistence + register writer” helper. |
| core/flamingock-core-commons/src/main/java/io/flamingock/internal/common/core/transaction/TransactionWrapper.java | Heavily expands/clarifies contract docs and renames parameter for clarity. |
| core/flamingock-core-commons/src/main/java/io/flamingock/internal/common/core/feature/Features.java | New feature-flag name registry (adds JOURNAL_EVENTS). |
| core/flamingock-core-commons/src/main/java/io/flamingock/internal/common/core/audit/AuditReader.java | Adds shared default getAuditSnapshotByChangeId() implementation. |
| core/flamingock-core-commons/src/main/java/io/flamingock/internal/common/core/audit/AuditPersistenceFactory.java | New per-stage persistence factory interface. |
| core/flamingock-core-commons/src/main/java/io/flamingock/internal/common/core/audit/AuditPersistence.java | Moves AuditPersistence to common module/package and narrows it to writer+reader only. |
| core/flamingock-core-commons/src/main/java/io/flamingock/internal/common/core/audit/AuditIssueResolver.java | Removes old issue-resolver interface. |
| community/flamingock-mongodb-sync-auditstore/src/test/java/io/flamingock/store/mongodb/sync/MongoDBSyncJournalFeatureFlagE2ETest.java | New E2E test verifying feature flag gates journal writes through a full runner pass. |
| community/flamingock-mongodb-sync-auditstore/src/test/java/io/flamingock/store/mongodb/sync/internal/MongoDBSyncJournalEventStoreE2ETest.java | Extends E2E coverage for transactional journal appends and uniqueness constraints. |
| community/flamingock-mongodb-sync-auditstore/src/test/java/io/flamingock/store/mongodb/sync/internal/MongoDBSyncAuditPersistenceJournalTest.java | New persistence-level tests for atomic audit+journal behavior and feature flag gating. |
| community/flamingock-mongodb-sync-auditstore/src/main/java/io/flamingock/store/mongodb/sync/MongoDBSyncAuditStore.java | Reworks MongoDB sync audit store to build per-stage persistence with sequencers and journal store. |
| community/flamingock-mongodb-sync-auditstore/src/main/java/io/flamingock/store/mongodb/sync/internal/MongoDBSyncJournalEventStore.java | Adds transactional append API (package-private) and clarifies responsibilities. |
| community/flamingock-mongodb-sync-auditstore/src/main/java/io/flamingock/store/mongodb/sync/internal/MongoDBSyncAuditRepository.java | Splits “audit repository” from writer/reader interfaces; adds current-state vs history write modes. |
| community/flamingock-mongodb-sync-auditstore/src/main/java/io/flamingock/store/mongodb/sync/internal/MongoDBSyncAuditPersistence.java | Implements atomic audit+journal write path under transaction wrapper with feature-flagged behavior. |
| community/flamingock-mongodb-reactive-auditstore/src/main/java/io/flamingock/store/mongodb/reactive/MongoDBReactiveAuditStore.java | Moves non-guarded types to store level for reactive Mongo. |
| community/flamingock-mongodb-reactive-auditstore/src/main/java/io/flamingock/store/mongodb/reactive/internal/MongoDBReactiveAuditPersistence.java | Removes deprecated getNonGuardedTypes() from persistence. |
| cloud/flamingock-cloud/src/main/java/io/flamingock/cloud/CloudAuditPersistenceImpl.java | Removes unused getters in cloud persistence impl. |
| build.gradle.kts | Bumps generalUtilVersion to 1.6.0. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| import io.flamingock.internal.common.core.pipeline.StageDescriptor; | ||
| import io.flamingock.internal.common.core.response.data.StageResult; | ||
| import io.flamingock.internal.core.context.PriorityContext; | ||
| import io.flamingock.internal.core.external.store.audit.community.CommunityAuditPersistence; |
| import io.flamingock.api.external.TargetSystem; | ||
| import io.flamingock.internal.common.core.audit.AuditEntry; | ||
| import io.flamingock.internal.common.core.error.PendingChangesException; | ||
| import io.flamingock.internal.core.external.store.AuditStore; |
Comment on lines
+26
to
30
| private final AuditReader persistence; | ||
|
|
||
| public IssueGetOperation(AuditPersistence persistence) { | ||
| this.persistence = persistence; | ||
| public IssueGetOperation(AuditReader auditReader) { | ||
| this.persistence = auditReader; | ||
| } |
| return getPersistence(); | ||
| } | ||
|
|
||
| //TODO temporally default, until we implement the other DB stores |
Comment on lines
+74
to
+81
| public Result writeEntry(AuditEntry auditEntry) { | ||
| return auditor.writeEntry(auditEntry); | ||
| RuntimeContext baseContext = new BasicRuntimeContext("write-changeState-" + auditEntry.getChangeId()); | ||
| // The transaction is kept unconditionally, even when the journal is disabled. It exists for the | ||
| // journal — the audit entry and its event must be atomic — and the audit write on its own is a single | ||
| // upsert that needs no transaction. Consequence: this store requires a replica set (or mongos) either | ||
| // way, whereas before the journal an unsessioned replaceOne also worked on a standalone mongod. | ||
| return txWrapper.wrapInTransaction(baseContext, runtimeContext -> { | ||
| ClientSession clientSession = runtimeContext.getContext().getRequiredDependencyValue(ClientSession.class); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.