Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import io.flamingock.api.annotations.Rollback;
import io.flamingock.api.template.AbstractChangeTemplate;
import io.flamingock.api.template.wrappers.TemplateVoid;
import io.flamingock.api.template.TemplateValidationContext;
import io.flamingock.template.mongodb.model.MongoOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -86,7 +87,7 @@ public MongoChangeTemplate() {
* Executes the apply operation for the current step.
* <p>
* Precondition: {@code applyPayload} has been structurally validated at load time
* via {@link MongoOperation#validate()}, which delegates to the appropriate
* via {@link MongoOperation#validate(TemplateValidationContext)}, which delegates to the appropriate
* {@code ParametersValidator} for each operation type. No validation is performed here.
*/
@Apply
Expand All @@ -99,7 +100,7 @@ public void apply(MongoDatabase db, @Nullable ClientSession clientSession) {
* Executes the rollback operation for the current step.
* <p>
* Precondition: {@code rollbackPayload} has been structurally validated at load time
* via {@link MongoOperation#validate()}, which delegates to the appropriate
* via {@link MongoOperation#validate(TemplateValidationContext)}, which delegates to the appropriate
* {@code ParametersValidator} for each operation type. No validation is performed here.
*/
@Rollback
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import io.flamingock.api.NonLockGuardedType;
import io.flamingock.api.template.TemplatePayload;
import io.flamingock.api.template.TemplatePayloadValidationError;
import io.flamingock.api.template.TemplateValidationContext;
import io.flamingock.template.mongodb.model.operator.MongoOperator;
import io.flamingock.template.mongodb.validation.CollectionValidator;
import io.flamingock.template.mongodb.validation.TypeValidator;
Expand All @@ -31,6 +32,7 @@

@NonLockGuarded(NonLockGuardedType.NONE)
public class MongoOperation implements TemplatePayload {

private String type;
private String collection;
private Map<String, Object> parameters;
Expand Down Expand Up @@ -87,7 +89,7 @@ public String toString() {
private static final CollectionValidator COLLECTION_VALIDATOR = new CollectionValidator();

@Override
public List<TemplatePayloadValidationError> validate() {
public List<TemplatePayloadValidationError> validate(TemplateValidationContext context) {

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

if (!operationType.isTransactional() && context.isTransactional()) {
errors.add(new TemplatePayloadValidationError("type",
"Operation type '" + type + "' does not support transactions. "
+ "Transactional changes require all operations to be transactional "
+ "(insert, update, delete)."));
}

return errors;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,28 +45,31 @@

public enum MongoOperationType {

CREATE_COLLECTION("createCollection", CreateCollectionOperator::new, new NoParametersValidator("CreateCollection")),
CREATE_INDEX("createIndex", CreateIndexOperator::new, new CreateIndexParametersValidator()),
INSERT("insert", InsertOperator::new, new InsertParametersValidator()),
UPDATE("update", UpdateOperator::new, new UpdateParametersValidator()),
DELETE("delete", DeleteOperator::new, new DeleteParametersValidator()),
DROP_COLLECTION("dropCollection", DropCollectionOperator::new, new NoParametersValidator("DropCollection")),
DROP_INDEX("dropIndex", DropIndexOperator::new, new DropIndexParametersValidator()),
RENAME_COLLECTION("renameCollection", RenameCollectionOperator::new, new RenameCollectionParametersValidator()),
MODIFY_COLLECTION("modifyCollection", ModifyCollectionOperator::new, new ModifyCollectionParametersValidator()),
CREATE_VIEW("createView", CreateViewOperator::new, new CreateViewParametersValidator()),
DROP_VIEW("dropView", DropViewOperator::new, new NoParametersValidator("DropView"));
CREATE_COLLECTION("createCollection", CreateCollectionOperator::new, new NoParametersValidator("CreateCollection"), false),
CREATE_INDEX("createIndex", CreateIndexOperator::new, new CreateIndexParametersValidator(), false),
INSERT("insert", InsertOperator::new, new InsertParametersValidator(), true),
UPDATE("update", UpdateOperator::new, new UpdateParametersValidator(), true),
DELETE("delete", DeleteOperator::new, new DeleteParametersValidator(), true),
DROP_COLLECTION("dropCollection", DropCollectionOperator::new, new NoParametersValidator("DropCollection"), false),
DROP_INDEX("dropIndex", DropIndexOperator::new, new DropIndexParametersValidator(), false),
RENAME_COLLECTION("renameCollection", RenameCollectionOperator::new, new RenameCollectionParametersValidator(), false),
MODIFY_COLLECTION("modifyCollection", ModifyCollectionOperator::new, new ModifyCollectionParametersValidator(), false),
CREATE_VIEW("createView", CreateViewOperator::new, new CreateViewParametersValidator(), false),
DROP_VIEW("dropView", DropViewOperator::new, new NoParametersValidator("DropView"), false);

private final String value;
private final BiFunction<MongoDatabase, MongoOperation, MongoOperator> createOperatorFunction;
private final OperationValidator operationValidator;
private final boolean transactional;

MongoOperationType(String value,
BiFunction<MongoDatabase, MongoOperation, MongoOperator> createOperatorFunction,
OperationValidator operationValidator) {
OperationValidator operationValidator,
boolean transactional) {
this.value = value;
this.createOperatorFunction = createOperatorFunction;
this.operationValidator = operationValidator;
this.transactional = transactional;
}

public static MongoOperationType findByTypeOrThrow(String typeValue) {
Expand All @@ -90,6 +93,10 @@ public OperationValidator getOperationValidator() {
return operationValidator;
}

public boolean isTransactional() {
return transactional;
}

private boolean matches(String operationType) {
return this.value.equals(operationType);
}
Expand Down
Loading
Loading