Skip to content

Commit 42ce40f

Browse files
committed
feat: adapt to TemplateValidationContext and add transactional compatibility validation
The TemplatePayload interface changed from validate() to validate(TemplateValidationContext). This updates MongoOperation to match the new signature and implements transactional compatibility checks at load time: non-transactional operations in a transactional change produce a validation error, while transactional operations in a non-transactional change log a warning. - Add boolean transactional field to MongoOperationType enum - Update MongoOperation.validate() to accept TemplateValidationContext - Update MongoChangeTemplate javadoc @link references - Update all 93 test validate() calls and add TransactionalValidationTests
1 parent c925833 commit 42ce40f

4 files changed

Lines changed: 258 additions & 108 deletions

File tree

src/main/java/io/flamingock/template/mongodb/MongoChangeTemplate.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.flamingock.api.annotations.Rollback;
2424
import io.flamingock.api.template.AbstractChangeTemplate;
2525
import io.flamingock.api.template.wrappers.TemplateVoid;
26+
import io.flamingock.api.template.TemplateValidationContext;
2627
import io.flamingock.template.mongodb.model.MongoOperation;
2728
import org.slf4j.Logger;
2829
import org.slf4j.LoggerFactory;
@@ -86,7 +87,7 @@ public MongoChangeTemplate() {
8687
* Executes the apply operation for the current step.
8788
* <p>
8889
* Precondition: {@code applyPayload} has been structurally validated at load time
89-
* via {@link MongoOperation#validate()}, which delegates to the appropriate
90+
* via {@link MongoOperation#validate(TemplateValidationContext)}, which delegates to the appropriate
9091
* {@code ParametersValidator} for each operation type. No validation is performed here.
9192
*/
9293
@Apply
@@ -99,7 +100,7 @@ public void apply(MongoDatabase db, @Nullable ClientSession clientSession) {
99100
* Executes the rollback operation for the current step.
100101
* <p>
101102
* Precondition: {@code rollbackPayload} has been structurally validated at load time
102-
* via {@link MongoOperation#validate()}, which delegates to the appropriate
103+
* via {@link MongoOperation#validate(TemplateValidationContext)}, which delegates to the appropriate
103104
* {@code ParametersValidator} for each operation type. No validation is performed here.
104105
*/
105106
@Rollback

src/main/java/io/flamingock/template/mongodb/model/MongoOperation.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,23 @@
2020
import io.flamingock.api.NonLockGuardedType;
2121
import io.flamingock.api.template.TemplatePayload;
2222
import io.flamingock.api.template.TemplatePayloadValidationError;
23+
import io.flamingock.api.template.TemplateValidationContext;
2324
import io.flamingock.template.mongodb.model.operator.MongoOperator;
2425
import io.flamingock.template.mongodb.validation.CollectionValidator;
2526
import io.flamingock.template.mongodb.validation.TypeValidator;
2627
import org.bson.Document;
28+
import org.slf4j.Logger;
29+
import org.slf4j.LoggerFactory;
2730

2831
import java.util.ArrayList;
2932
import java.util.List;
3033
import java.util.Map;
3134

3235
@NonLockGuarded(NonLockGuardedType.NONE)
3336
public class MongoOperation implements TemplatePayload {
37+
38+
private static final Logger logger = LoggerFactory.getLogger(MongoOperation.class);
39+
3440
private String type;
3541
private String collection;
3642
private Map<String, Object> parameters;
@@ -87,7 +93,7 @@ public String toString() {
8793
private static final CollectionValidator COLLECTION_VALIDATOR = new CollectionValidator();
8894

8995
@Override
90-
public List<TemplatePayloadValidationError> validate() {
96+
public List<TemplatePayloadValidationError> validate(TemplateValidationContext context) {
9197

9298
List<TemplatePayloadValidationError> typeErrors = TYPE_VALIDATOR.validate(this);
9399
List<TemplatePayloadValidationError> errors = new ArrayList<>(typeErrors);
@@ -101,6 +107,18 @@ public List<TemplatePayloadValidationError> validate() {
101107
errors.addAll(COLLECTION_VALIDATOR.validate(this));
102108
errors.addAll(operationType.getOperationValidator().validate(this));
103109

110+
if (!operationType.isTransactional() && context.isTransactional()) {
111+
errors.add(new TemplatePayloadValidationError("type",
112+
"Operation type '" + type + "' does not support transactions. "
113+
+ "Transactional changes require all operations to be transactional "
114+
+ "(insert, update, delete)."));
115+
}
116+
if (operationType.isTransactional() && !context.isTransactional()) {
117+
logger.warn("Operation '{}' on collection '{}' supports transactions but the change "
118+
+ "is not marked as transactional. Consider setting transactional: true "
119+
+ "for native rollback on failure.", type, collection);
120+
}
121+
104122
return errors;
105123
}
106124
}

src/main/java/io/flamingock/template/mongodb/model/MongoOperationType.java

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,28 +45,31 @@
4545

4646
public enum MongoOperationType {
4747

48-
CREATE_COLLECTION("createCollection", CreateCollectionOperator::new, new NoParametersValidator("CreateCollection")),
49-
CREATE_INDEX("createIndex", CreateIndexOperator::new, new CreateIndexParametersValidator()),
50-
INSERT("insert", InsertOperator::new, new InsertParametersValidator()),
51-
UPDATE("update", UpdateOperator::new, new UpdateParametersValidator()),
52-
DELETE("delete", DeleteOperator::new, new DeleteParametersValidator()),
53-
DROP_COLLECTION("dropCollection", DropCollectionOperator::new, new NoParametersValidator("DropCollection")),
54-
DROP_INDEX("dropIndex", DropIndexOperator::new, new DropIndexParametersValidator()),
55-
RENAME_COLLECTION("renameCollection", RenameCollectionOperator::new, new RenameCollectionParametersValidator()),
56-
MODIFY_COLLECTION("modifyCollection", ModifyCollectionOperator::new, new ModifyCollectionParametersValidator()),
57-
CREATE_VIEW("createView", CreateViewOperator::new, new CreateViewParametersValidator()),
58-
DROP_VIEW("dropView", DropViewOperator::new, new NoParametersValidator("DropView"));
48+
CREATE_COLLECTION("createCollection", CreateCollectionOperator::new, new NoParametersValidator("CreateCollection"), false),
49+
CREATE_INDEX("createIndex", CreateIndexOperator::new, new CreateIndexParametersValidator(), false),
50+
INSERT("insert", InsertOperator::new, new InsertParametersValidator(), true),
51+
UPDATE("update", UpdateOperator::new, new UpdateParametersValidator(), true),
52+
DELETE("delete", DeleteOperator::new, new DeleteParametersValidator(), true),
53+
DROP_COLLECTION("dropCollection", DropCollectionOperator::new, new NoParametersValidator("DropCollection"), false),
54+
DROP_INDEX("dropIndex", DropIndexOperator::new, new DropIndexParametersValidator(), false),
55+
RENAME_COLLECTION("renameCollection", RenameCollectionOperator::new, new RenameCollectionParametersValidator(), false),
56+
MODIFY_COLLECTION("modifyCollection", ModifyCollectionOperator::new, new ModifyCollectionParametersValidator(), false),
57+
CREATE_VIEW("createView", CreateViewOperator::new, new CreateViewParametersValidator(), false),
58+
DROP_VIEW("dropView", DropViewOperator::new, new NoParametersValidator("DropView"), false);
5959

6060
private final String value;
6161
private final BiFunction<MongoDatabase, MongoOperation, MongoOperator> createOperatorFunction;
6262
private final OperationValidator operationValidator;
63+
private final boolean transactional;
6364

6465
MongoOperationType(String value,
6566
BiFunction<MongoDatabase, MongoOperation, MongoOperator> createOperatorFunction,
66-
OperationValidator operationValidator) {
67+
OperationValidator operationValidator,
68+
boolean transactional) {
6769
this.value = value;
6870
this.createOperatorFunction = createOperatorFunction;
6971
this.operationValidator = operationValidator;
72+
this.transactional = transactional;
7073
}
7174

7275
public static MongoOperationType findByTypeOrThrow(String typeValue) {
@@ -90,6 +93,10 @@ public OperationValidator getOperationValidator() {
9093
return operationValidator;
9194
}
9295

96+
public boolean isTransactional() {
97+
return transactional;
98+
}
99+
93100
private boolean matches(String operationType) {
94101
return this.value.equals(operationType);
95102
}

0 commit comments

Comments
 (0)