Skip to content

Commit d6f5fd1

Browse files
authored
feat: adapt to TemplateValidationContext and add transactional compatibility validation (#19)
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 d6f5fd1

4 files changed

Lines changed: 249 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: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
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;
@@ -31,6 +32,7 @@
3132

3233
@NonLockGuarded(NonLockGuardedType.NONE)
3334
public class MongoOperation implements TemplatePayload {
35+
3436
private String type;
3537
private String collection;
3638
private Map<String, Object> parameters;
@@ -87,7 +89,7 @@ public String toString() {
8789
private static final CollectionValidator COLLECTION_VALIDATOR = new CollectionValidator();
8890

8991
@Override
90-
public List<TemplatePayloadValidationError> validate() {
92+
public List<TemplatePayloadValidationError> validate(TemplateValidationContext context) {
9193

9294
List<TemplatePayloadValidationError> typeErrors = TYPE_VALIDATOR.validate(this);
9395
List<TemplatePayloadValidationError> errors = new ArrayList<>(typeErrors);
@@ -101,6 +103,13 @@ public List<TemplatePayloadValidationError> validate() {
101103
errors.addAll(COLLECTION_VALIDATOR.validate(this));
102104
errors.addAll(operationType.getOperationValidator().validate(this));
103105

106+
if (!operationType.isTransactional() && context.isTransactional()) {
107+
errors.add(new TemplatePayloadValidationError("type",
108+
"Operation type '" + type + "' does not support transactions. "
109+
+ "Transactional changes require all operations to be transactional "
110+
+ "(insert, update, delete)."));
111+
}
112+
104113
return errors;
105114
}
106115
}

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)