Skip to content

Commit fada235

Browse files
Validation that Multiple Rules with Same Name cannot be Created (#266)
* Validation that Multiple Rules with Same Name cannot be Created * resolved comments
1 parent 8760970 commit fada235

File tree

3 files changed

+44
-4
lines changed

3 files changed

+44
-4
lines changed

notification-rule-config-service-impl/src/main/java/org/hypertrace/notification/config/service/NotificationRuleConfigServiceImpl.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.grpc.Channel;
44
import io.grpc.Status;
55
import io.grpc.stub.StreamObserver;
6+
import java.util.List;
67
import java.util.UUID;
78
import java.util.stream.Collectors;
89
import lombok.extern.slf4j.Slf4j;
@@ -41,7 +42,12 @@ public void createNotificationRule(
4142
StreamObserver<CreateNotificationRuleResponse> responseObserver) {
4243
try {
4344
RequestContext requestContext = RequestContext.CURRENT.get();
44-
validator.validateCreateNotificationRuleRequest(requestContext, request);
45+
List<NotificationRule> existingNotificationRules =
46+
notificationRuleStore.getAllObjects(requestContext).stream()
47+
.map(ConfigObject::getData)
48+
.collect(Collectors.toList());
49+
validator.validateCreateNotificationRuleRequest(
50+
requestContext, request, existingNotificationRules);
4551
NotificationRule notificationRule =
4652
NotificationRule.newBuilder()
4753
.setId(UUID.randomUUID().toString())
@@ -66,7 +72,12 @@ public void updateNotificationRule(
6672
StreamObserver<UpdateNotificationRuleResponse> responseObserver) {
6773
try {
6874
RequestContext requestContext = RequestContext.CURRENT.get();
69-
validator.validateUpdateNotificationRuleRequest(requestContext, request);
75+
List<NotificationRule> existingNotificationRules =
76+
notificationRuleStore.getAllObjects(requestContext).stream()
77+
.map(ConfigObject::getData)
78+
.collect(Collectors.toList());
79+
validator.validateUpdateNotificationRuleRequest(
80+
requestContext, request, existingNotificationRules);
7081
NotificationRule notificationRule =
7182
NotificationRule.newBuilder()
7283
.setId(request.getId())

notification-rule-config-service-impl/src/main/java/org/hypertrace/notification/config/service/NotificationRuleConfigServiceRequestValidator.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,54 @@
44
import static org.hypertrace.config.validation.GrpcValidatorUtils.validateRequestContextOrThrow;
55

66
import io.grpc.Status;
7+
import java.util.List;
78
import org.hypertrace.core.grpcutils.context.RequestContext;
89
import org.hypertrace.notification.config.service.v1.CreateNotificationRuleRequest;
910
import org.hypertrace.notification.config.service.v1.DeleteNotificationRuleRequest;
1011
import org.hypertrace.notification.config.service.v1.GetAllNotificationRulesRequest;
1112
import org.hypertrace.notification.config.service.v1.GetNotificationRuleRequest;
1213
import org.hypertrace.notification.config.service.v1.NotificationIntegrationTarget;
14+
import org.hypertrace.notification.config.service.v1.NotificationRule;
1315
import org.hypertrace.notification.config.service.v1.NotificationRuleMutableData;
1416
import org.hypertrace.notification.config.service.v1.UpdateNotificationRuleRequest;
1517

1618
public class NotificationRuleConfigServiceRequestValidator {
1719

1820
public void validateCreateNotificationRuleRequest(
19-
RequestContext requestContext, CreateNotificationRuleRequest request) {
21+
RequestContext requestContext,
22+
CreateNotificationRuleRequest request,
23+
List<NotificationRule> existingNotificationRules) {
2024
validateRequestContextOrThrow(requestContext);
25+
validateNonDuplicateNotificationRuleOrThrow(
26+
request.getNotificationRuleMutableData().getRuleName(), existingNotificationRules);
2127
validateNotificationRuleMutableData(request.getNotificationRuleMutableData());
2228
}
2329

2430
public void validateUpdateNotificationRuleRequest(
25-
RequestContext requestContext, UpdateNotificationRuleRequest request) {
31+
RequestContext requestContext,
32+
UpdateNotificationRuleRequest request,
33+
List<NotificationRule> existingNotificationRules) {
2634
validateRequestContextOrThrow(requestContext);
2735
validateNonDefaultPresenceOrThrow(request, UpdateNotificationRuleRequest.ID_FIELD_NUMBER);
36+
validateNonDuplicateNotificationRuleOrThrow(
37+
request.getNotificationRuleMutableData().getRuleName(), existingNotificationRules);
2838
validateNotificationRuleMutableData(request.getNotificationRuleMutableData());
2939
}
3040

41+
private void validateNonDuplicateNotificationRuleOrThrow(
42+
String ruleName, List<NotificationRule> existingNotificationRules) {
43+
for (NotificationRule existingNotificationRule : existingNotificationRules) {
44+
if (existingNotificationRule
45+
.getNotificationRuleMutableData()
46+
.getRuleName()
47+
.equals(ruleName)) {
48+
throw Status.ALREADY_EXISTS
49+
.withDescription("Notification Rule with the same name already exists.")
50+
.asRuntimeException();
51+
}
52+
}
53+
}
54+
3155
private void validateNotificationRuleMutableData(NotificationRuleMutableData data) {
3256
validateNonDefaultPresenceOrThrow(data, NotificationRuleMutableData.RULE_NAME_FIELD_NUMBER);
3357
if (data.hasIntegrationTarget()) {

notification-rule-config-service-impl/src/test/java/org/hypertrace/notification/config/service/NotificationRuleConfigServiceImplTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package org.hypertrace.notification.config.service;
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.mockito.ArgumentMatchers.any;
45
import static org.mockito.Mockito.mock;
6+
import static org.mockito.Mockito.when;
57

68
import java.util.List;
79
import org.hypertrace.config.service.change.event.api.ConfigChangeEventGenerator;
@@ -21,11 +23,13 @@ class NotificationRuleConfigServiceImplTest {
2123

2224
MockGenericConfigService mockGenericConfigService;
2325
NotificationRuleConfigServiceGrpc.NotificationRuleConfigServiceBlockingStub notificationStub;
26+
NotificationRuleStore notificationRuleStore;
2427

2528
@BeforeEach
2629
void beforeEach() {
2730
mockGenericConfigService =
2831
new MockGenericConfigService().mockUpsert().mockGet().mockGetAll().mockDelete();
32+
notificationRuleStore = mock(NotificationRuleStore.class);
2933

3034
ConfigChangeEventGenerator configChangeEventGenerator = mock(ConfigChangeEventGenerator.class);
3135
mockGenericConfigService
@@ -44,6 +48,7 @@ void createReadUpdateDeleteNotificationRules() {
4448
getNotificationRuleMutableData("rule1", "channel1");
4549
NotificationRuleMutableData notificationRuleMutableData2 =
4650
getNotificationRuleMutableData("rule2", "channel1");
51+
when(notificationRuleStore.getAllObjects(any())).thenReturn(List.of());
4752

4853
NotificationRule notificationRule1 =
4954
notificationStub

0 commit comments

Comments
 (0)