diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/NotificationTemplateRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/NotificationTemplateRepository.java index 92387ee21b7..e30a8cdef58 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/NotificationTemplateRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/NotificationTemplateRepository.java @@ -14,6 +14,7 @@ package org.openmetadata.service.jdbi3; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import lombok.extern.slf4j.Slf4j; @@ -24,6 +25,7 @@ import org.openmetadata.schema.entity.events.NotificationTemplate; import org.openmetadata.schema.type.Include; import org.openmetadata.schema.type.ProviderType; import org.openmetadata.schema.type.change.ChangeSource; +import org.openmetadata.schema.utils.JsonUtils; import org.openmetadata.service.Entity; import org.openmetadata.service.resources.events.NotificationTemplateResource; import org.openmetadata.service.template.NotificationTemplateProcessor; @@ -62,29 +64,23 @@ public class NotificationTemplateRepository extends EntityRepository 0) { - errors.append("; "); - } - errors.append("Template subject: ").append(response.getTemplateSubject().getError()); - } + // Check for validation errors + List errors = new ArrayList<>(); + if (response.getTemplateBody() != null && !response.getTemplateBody().getPassed()) { + errors.add("Template body: " + response.getTemplateBody().getError()); + } + if (response.getTemplateSubject() != null && !response.getTemplateSubject().getPassed()) { + errors.add("Template subject: " + response.getTemplateSubject().getError()); + } - if (errors.length() > 0) { - throw new IllegalArgumentException("Invalid template: " + errors); - } + if (!errors.isEmpty()) { + throw new IllegalArgumentException("Invalid template: " + String.join("; ", errors)); } } @@ -119,70 +115,80 @@ public class NotificationTemplateRepository extends EntityRepository defaultTemplates = getEntitiesFromSeedData(seedPath); - NotificationTemplate defaultTemplate = - defaultTemplates.stream() - .filter(t -> fqn.equals(t.getFullyQualifiedName())) - .findFirst() - .orElseThrow( - () -> - new IllegalArgumentException( - "Default template not found in seed data: " + fqn)); - - template + NotificationTemplate defaultTemplate = getDefaultTemplateFromSeed(fqn); + NotificationTemplate updated = JsonUtils.deepCopy(original, NotificationTemplate.class); + updated .withTemplateBody(defaultTemplate.getTemplateBody()) .withTemplateSubject(defaultTemplate.getTemplateSubject()) .withDescription(defaultTemplate.getDescription()) - .withDisplayName(defaultTemplate.getDisplayName()) - .withIsModifiedFromDefault(false) - .withDefaultTemplateChecksum(calculateTemplateChecksum(defaultTemplate)); + .withDisplayName(defaultTemplate.getDisplayName()); - store(template, true); + EntityUpdater entityUpdater = getUpdater(original, updated, Operation.PUT, null); + entityUpdater.update(); LOG.info("Reset NotificationTemplate {} to default", fqn); + } catch (IllegalArgumentException e) { + LOG.error("Failed to reset template: {}", e.getMessage(), e); + throw e; } catch (IOException e) { LOG.error("Failed to load seed data for reset operation", e); throw new RuntimeException("Failed to reset template due to seed data loading error", e); @@ -201,6 +207,17 @@ public class NotificationTemplateRepository extends EntityRepository defaultTemplates = getEntitiesFromSeedData(seedPath); + return defaultTemplates.stream() + .filter(t -> fqn.equals(t.getFullyQualifiedName())) + .findFirst() + .orElseThrow( + () -> new IllegalArgumentException("Default template not found in seed data: " + fqn)); + } + private String calculateTemplateChecksum(NotificationTemplate template) { // Only include functional fields in checksum // This allows users to customize displayName and description without triggering "modified" @@ -221,18 +238,21 @@ public class NotificationTemplateRepository extends EntityRepository