diff --git a/modules/api/src/main/scala/vinyldns/api/domain/batch/BatchChangeValidations.scala b/modules/api/src/main/scala/vinyldns/api/domain/batch/BatchChangeValidations.scala index 7b24c40a5..2f38050dd 100644 --- a/modules/api/src/main/scala/vinyldns/api/domain/batch/BatchChangeValidations.scala +++ b/modules/api/src/main/scala/vinyldns/api/domain/batch/BatchChangeValidations.scala @@ -28,6 +28,7 @@ import vinyldns.api.domain.batch.BatchChangeInterfaces._ import vinyldns.api.domain.batch.BatchTransformations._ import vinyldns.api.domain.zone.ZoneRecordValidations.isStringInRegexList import vinyldns.api.domain.zone.ZoneRecordValidations +import vinyldns.core.Messages.{nonExistentRecordDataDeleteMessage, nonExistentRecordDeleteMessage} import vinyldns.core.domain.DomainHelpers.omitTrailingDot import vinyldns.core.domain.record._ import vinyldns.core.domain._ @@ -350,9 +351,6 @@ class BatchChangeValidations( isApproved: Boolean ): SingleValidation[ChangeForValidation] = { - val nonExistentRecordDeleteMessage = "This record does not exist. No further action is required." - val nonExistentRecordDataDeleteMessage = "Record data entered does not exist. No further action is required." - val recordData = change match { case AddChangeForValidation(_, _, inputChange, _, _) => inputChange.record.toString case DeleteRRSetChangeForValidation(_, _, inputChange) => inputChange.record.map(_.toString).getOrElse("") @@ -425,9 +423,6 @@ class BatchChangeValidations( isApproved: Boolean ): SingleValidation[ChangeForValidation] = { - val nonExistentRecordDeleteMessage = "This record does not exist. No further action is required." - val nonExistentRecordDataDeleteMessage = "Record data entered does not exist. No further action is required." - // To handle add and delete for the record with same record data is present in the batch val recordData = change match { case AddChangeForValidation(_, _, inputChange, _, _) => inputChange.record.toString diff --git a/modules/api/src/main/scala/vinyldns/api/engine/RecordSetChangeHandler.scala b/modules/api/src/main/scala/vinyldns/api/engine/RecordSetChangeHandler.scala index 92381f6a1..31c57febd 100644 --- a/modules/api/src/main/scala/vinyldns/api/engine/RecordSetChangeHandler.scala +++ b/modules/api/src/main/scala/vinyldns/api/engine/RecordSetChangeHandler.scala @@ -23,6 +23,7 @@ import scalikejdbc.DB import vinyldns.api.backend.dns.DnsProtocol.TryAgain import vinyldns.api.domain.record.RecordSetChangeGenerator import vinyldns.api.domain.record.RecordSetHelpers._ +import vinyldns.core.Messages.{nonExistentRecordDataDeleteMessage, nonExistentRecordDeleteMessage} import vinyldns.core.domain.backend.{Backend, BackendResponse} import vinyldns.core.domain.batch.{BatchChangeRepository, SingleChange} import vinyldns.core.domain.record._ @@ -92,15 +93,31 @@ object RecordSetChangeHandler extends TransactionProvider { ): IO[Unit] = executeWithinTransaction { db: DB => for { - _ <- recordSetRepository.apply(db, changeSet) - _ <- recordChangeRepository.save(db, changeSet) - _ <- recordSetCacheRepository.save(db, changeSet) // Update single changes within this transaction to rollback the changes made to recordset and record change repo // when exception occurs while updating single changes singleBatchChanges <- batchChangeRepository.getSingleChanges( recordSetChange.singleBatchChangeIds ) singleChangeStatusUpdates = updateBatchStatuses(singleBatchChanges, completedState.change) + updatedChangeSet = if (singleChangeStatusUpdates.size == 1) { + // Filter out RecordSetChange from changeSet if systemMessage matches + val filteredChangeSetChanges = changeSet.changes.filterNot { recordSetChange => + // Find the corresponding singleChangeStatusUpdate by recordChangeId + singleChangeStatusUpdates.exists { singleChange => + singleChange.recordChangeId.contains(recordSetChange.id) && + singleChange.systemMessage.exists(msg => + msg == nonExistentRecordDeleteMessage || msg == nonExistentRecordDataDeleteMessage + ) + } + } + // Create a new ChangeSet with filtered changes + changeSet.copy(changes = filteredChangeSetChanges) + } else { + changeSet + } + _ <- recordSetRepository.apply(db, updatedChangeSet) + _ <- recordChangeRepository.save(db, updatedChangeSet) + _ <- recordSetCacheRepository.save(db, updatedChangeSet) _ <- batchChangeRepository.updateSingleChanges(singleChangeStatusUpdates) } yield () } diff --git a/modules/api/src/test/scala/vinyldns/api/domain/batch/BatchChangeConverterSpec.scala b/modules/api/src/test/scala/vinyldns/api/domain/batch/BatchChangeConverterSpec.scala index b4e389e51..d4cc72655 100644 --- a/modules/api/src/test/scala/vinyldns/api/domain/batch/BatchChangeConverterSpec.scala +++ b/modules/api/src/test/scala/vinyldns/api/domain/batch/BatchChangeConverterSpec.scala @@ -26,6 +26,7 @@ import vinyldns.api.domain.batch.BatchTransformations._ import vinyldns.api.domain.batch.BatchTransformations.LogicalChangeType._ import vinyldns.api.engine.TestMessageQueue import vinyldns.api.repository._ +import vinyldns.core.Messages.nonExistentRecordDeleteMessage import vinyldns.core.TestMembershipData.okUser import vinyldns.core.TestRecordSetData._ import vinyldns.core.TestZoneData.{okZone, _} @@ -37,8 +38,6 @@ import vinyldns.core.domain.record._ import vinyldns.core.domain.zone.Zone class BatchChangeConverterSpec extends AnyWordSpec with Matchers { - private val nonExistentRecordDeleteMessage: String = "This record does not exist. " + - "No further action is required." private def makeSingleAddChange( name: String, diff --git a/modules/core/src/main/scala/vinyldns/core/Messages.scala b/modules/core/src/main/scala/vinyldns/core/Messages.scala index def8fd9d9..95c61793e 100644 --- a/modules/core/src/main/scala/vinyldns/core/Messages.scala +++ b/modules/core/src/main/scala/vinyldns/core/Messages.scala @@ -84,4 +84,8 @@ object Messages { val InvalidEmailValidationErrorMsg = "Please enter a valid Email." val DotsValidationErrorMsg = "Please enter a valid Email. Number of dots allowed after @ is" + + val nonExistentRecordDeleteMessage = "This record does not exist. No further action is required." + + val nonExistentRecordDataDeleteMessage = "Record data entered does not exist. No further action is required." }