Skip to content

Commit db961fe

Browse files
Space rules update and delete (#61)
* feat: add update and delete apis for space config * test: add update and delete tests
1 parent 09f73d4 commit db961fe

19 files changed

+498
-3
lines changed

hypertrace-graphql-spaces-schema/src/main/java/org/hypertrace/graphql/spaces/dao/ConfigServiceSpacesConfigDao.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import org.hypertrace.core.graphql.utils.grpc.GrpcChannelRegistry;
1111
import org.hypertrace.graphql.config.HypertraceGraphQlServiceConfig;
1212
import org.hypertrace.graphql.spaces.request.SpaceConfigRuleCreationRequest;
13+
import org.hypertrace.graphql.spaces.request.SpaceConfigRuleDeleteRequest;
14+
import org.hypertrace.graphql.spaces.request.SpaceConfigRuleUpdateRequest;
1315
import org.hypertrace.graphql.spaces.schema.query.SpaceConfigRuleResultSet;
1416
import org.hypertrace.graphql.spaces.schema.shared.SpaceConfigRule;
1517
import org.hypertrace.spaces.config.service.v1.SpacesConfigServiceGrpc;
@@ -67,4 +69,30 @@ public Single<SpaceConfigRule> createRule(SpaceConfigRuleCreationRequest request
6769
.createRule(this.requestConverter.convertCreationRequest(request))))
6870
.flatMap(this.responseConverter::convertRule);
6971
}
72+
73+
@Override
74+
public Single<SpaceConfigRule> updateRule(SpaceConfigRuleUpdateRequest request) {
75+
return Single.fromFuture(
76+
this.grpcContextBuilder
77+
.build(request.context())
78+
.callInContext(
79+
() ->
80+
this.spaceConfigServiceStub
81+
.withDeadlineAfter(DEFAULT_DEADLINE_SEC, SECONDS)
82+
.updateRule(this.requestConverter.convertUpdateRequest(request))))
83+
.flatMap(this.responseConverter::convertRule);
84+
}
85+
86+
@Override
87+
public Single<Boolean> deleteRule(SpaceConfigRuleDeleteRequest request) {
88+
return Single.fromFuture(
89+
this.grpcContextBuilder
90+
.build(request.context())
91+
.callInContext(
92+
() ->
93+
this.spaceConfigServiceStub
94+
.withDeadlineAfter(DEFAULT_DEADLINE_SEC, SECONDS)
95+
.deleteRule(this.requestConverter.convertDeleteRequest(request))))
96+
.flatMap(unusedResponse -> this.responseConverter.buildDeleteResponse());
97+
}
7098
}

hypertrace-graphql-spaces-schema/src/main/java/org/hypertrace/graphql/spaces/dao/SpaceConfigRulesRequestConverter.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package org.hypertrace.graphql.spaces.dao;
22

33
import org.hypertrace.graphql.spaces.request.SpaceConfigRuleCreationRequest;
4+
import org.hypertrace.graphql.spaces.request.SpaceConfigRuleDeleteRequest;
5+
import org.hypertrace.graphql.spaces.request.SpaceConfigRuleUpdateRequest;
46
import org.hypertrace.graphql.spaces.schema.shared.SpaceConfigRuleAttributeValueRule;
57
import org.hypertrace.graphql.spaces.schema.shared.SpaceConfigRuleDefinition;
68
import org.hypertrace.spaces.config.service.v1.AttributeValueRuleData;
79
import org.hypertrace.spaces.config.service.v1.CreateRuleRequest;
10+
import org.hypertrace.spaces.config.service.v1.DeleteRuleRequest;
811
import org.hypertrace.spaces.config.service.v1.GetRulesRequest;
12+
import org.hypertrace.spaces.config.service.v1.SpaceConfigRule;
13+
import org.hypertrace.spaces.config.service.v1.UpdateRuleRequest;
914

1015
class SpaceConfigRulesRequestConverter {
1116

@@ -17,6 +22,16 @@ GetRulesRequest convertGetRequest() {
1722
return GetRulesRequest.getDefaultInstance();
1823
}
1924

25+
DeleteRuleRequest convertDeleteRequest(SpaceConfigRuleDeleteRequest deleteRequest) {
26+
return DeleteRuleRequest.newBuilder().setId(deleteRequest.id()).build();
27+
}
28+
29+
UpdateRuleRequest convertUpdateRequest(SpaceConfigRuleUpdateRequest updateRequest) {
30+
return UpdateRuleRequest.newBuilder()
31+
.setUpdatedRule(this.convertRule(updateRequest.rule()))
32+
.build();
33+
}
34+
2035
private CreateRuleRequest buildCreationRequestForRule(SpaceConfigRuleDefinition ruleDefinition) {
2136
switch (ruleDefinition.type()) {
2237
case ATTRIBUTE_VALUE:
@@ -30,6 +45,20 @@ private CreateRuleRequest buildCreationRequestForRule(SpaceConfigRuleDefinition
3045
}
3146
}
3247

48+
private SpaceConfigRule convertRule(
49+
org.hypertrace.graphql.spaces.schema.shared.SpaceConfigRule rule) {
50+
switch (rule.type()) {
51+
case ATTRIBUTE_VALUE:
52+
return SpaceConfigRule.newBuilder()
53+
.setId(rule.id())
54+
.setAttributeValueRuleData(this.buildAttributeValueRuleData(rule.attributeValueRule()))
55+
.build();
56+
default:
57+
throw new UnsupportedOperationException(
58+
"Cannot convert unknown rule type: " + rule.type().name());
59+
}
60+
}
61+
3362
private AttributeValueRuleData buildAttributeValueRuleData(
3463
SpaceConfigRuleAttributeValueRule attributeValueRule) {
3564
return AttributeValueRuleData.newBuilder()

hypertrace-graphql-spaces-schema/src/main/java/org/hypertrace/graphql/spaces/dao/SpaceConfigRulesResponseConverter.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.hypertrace.spaces.config.service.v1.AttributeValueRuleData;
1717
import org.hypertrace.spaces.config.service.v1.CreateRuleResponse;
1818
import org.hypertrace.spaces.config.service.v1.GetRulesResponse;
19+
import org.hypertrace.spaces.config.service.v1.UpdateRuleResponse;
1920

2021
@Slf4j
2122
class SpaceConfigRulesResponseConverter {
@@ -40,6 +41,16 @@ Single<SpaceConfigRule> convertRule(CreateRuleResponse createRuleResponse) {
4041
Single.error(new IllegalArgumentException("Unable to convert rule creation response")));
4142
}
4243

44+
Single<Boolean> buildDeleteResponse() {
45+
return Single.just(true);
46+
}
47+
48+
Single<SpaceConfigRule> convertRule(UpdateRuleResponse updateRuleResponse) {
49+
return this.convertRule(updateRuleResponse.getRule())
50+
.switchIfEmpty(
51+
Single.error(new IllegalArgumentException("Unable to convert rule update response")));
52+
}
53+
4354
private Maybe<SpaceConfigRule> convertRule(
4455
org.hypertrace.spaces.config.service.v1.SpaceConfigRule rule) {
4556
switch (rule.getRuleDataCase()) {

hypertrace-graphql-spaces-schema/src/main/java/org/hypertrace/graphql/spaces/dao/SpacesConfigDao.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@
33
import io.reactivex.rxjava3.core.Single;
44
import org.hypertrace.core.graphql.context.GraphQlRequestContext;
55
import org.hypertrace.graphql.spaces.request.SpaceConfigRuleCreationRequest;
6+
import org.hypertrace.graphql.spaces.request.SpaceConfigRuleDeleteRequest;
7+
import org.hypertrace.graphql.spaces.request.SpaceConfigRuleUpdateRequest;
68
import org.hypertrace.graphql.spaces.schema.query.SpaceConfigRuleResultSet;
79
import org.hypertrace.graphql.spaces.schema.shared.SpaceConfigRule;
810

911
public interface SpacesConfigDao {
1012
Single<SpaceConfigRuleResultSet> getAllRules(GraphQlRequestContext requestContext);
1113

1214
Single<SpaceConfigRule> createRule(SpaceConfigRuleCreationRequest request);
15+
16+
Single<SpaceConfigRule> updateRule(SpaceConfigRuleUpdateRequest request);
17+
18+
Single<Boolean> deleteRule(SpaceConfigRuleDeleteRequest request);
1319
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package org.hypertrace.graphql.spaces.deserialization;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import com.fasterxml.jackson.databind.Module;
5+
import com.fasterxml.jackson.databind.module.SimpleModule;
6+
import java.util.List;
7+
import lombok.NoArgsConstructor;
8+
import lombok.Value;
9+
import lombok.experimental.Accessors;
10+
import org.hypertrace.core.graphql.deserialization.ArgumentDeserializationConfig;
11+
import org.hypertrace.graphql.spaces.schema.shared.SpaceConfigRule;
12+
import org.hypertrace.graphql.spaces.schema.shared.SpaceConfigRuleAttributeValueRule;
13+
import org.hypertrace.graphql.spaces.schema.shared.SpaceConfigRuleType;
14+
15+
public class SpaceConfigRuleDeserializationConfig implements ArgumentDeserializationConfig {
16+
17+
@Override
18+
public String getArgumentKey() {
19+
return SpaceConfigRule.ARGUMENT_NAME;
20+
}
21+
22+
@Override
23+
public Class<SpaceConfigRule> getArgumentSchema() {
24+
return SpaceConfigRule.class;
25+
}
26+
27+
@Override
28+
public List<Module> jacksonModules() {
29+
return List.of(
30+
new SimpleModule()
31+
.addAbstractTypeMapping(SpaceConfigRule.class, SpaceConfigRuleArgument.class)
32+
.addAbstractTypeMapping(
33+
SpaceConfigRuleAttributeValueRule.class,
34+
SpaceConfigRuleAttributeValueRuleArgument.class));
35+
}
36+
37+
@Value
38+
@Accessors(fluent = true)
39+
@NoArgsConstructor(force = true)
40+
private static class SpaceConfigRuleArgument implements SpaceConfigRule {
41+
@JsonProperty(IDENTITY_FIELD_NAME)
42+
String id;
43+
44+
@JsonProperty(SPACE_CONFIG_RULE_DEFINITION_TYPE_KEY)
45+
SpaceConfigRuleType type;
46+
47+
@JsonProperty(SPACE_CONFIG_RULE_DEFINITION_ATTRIBUTE_VALUE_RULE_KEY)
48+
SpaceConfigRuleAttributeValueRule attributeValueRule;
49+
}
50+
51+
@Value
52+
@Accessors(fluent = true)
53+
@NoArgsConstructor(force = true)
54+
private static class SpaceConfigRuleAttributeValueRuleArgument
55+
implements SpaceConfigRuleAttributeValueRule {
56+
@JsonProperty(ATTRIBUTE_VALUE_ATTRIBUTE_SCOPE_KEY)
57+
String attributeScope;
58+
59+
@JsonProperty(ATTRIBUTE_VALUE_ATTRIBUTE_KEY_KEY)
60+
String attributeKey;
61+
}
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.hypertrace.graphql.spaces.deserialization;
2+
3+
import org.hypertrace.core.graphql.deserialization.PrimitiveArgument;
4+
5+
public interface SpaceRuleIdArgument extends PrimitiveArgument<String> {
6+
String ARGUMENT_NAME = "id";
7+
}

hypertrace-graphql-spaces-schema/src/main/java/org/hypertrace/graphql/spaces/deserialization/SpacesDeserializationModule.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,13 @@ protected void configure() {
1313
deserializationConfigBinder
1414
.addBinding()
1515
.to(SpaceConfigRuleDefinitionDeserializationConfig.class);
16+
17+
deserializationConfigBinder.addBinding().to(SpaceConfigRuleDeserializationConfig.class);
18+
19+
deserializationConfigBinder
20+
.addBinding()
21+
.toInstance(
22+
ArgumentDeserializationConfig.forPrimitive(
23+
SpaceRuleIdArgument.ARGUMENT_NAME, SpaceRuleIdArgument.class));
1624
}
1725
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package org.hypertrace.graphql.spaces.mutator;
2+
3+
import graphql.schema.DataFetcher;
4+
import graphql.schema.DataFetchingEnvironment;
5+
import java.util.concurrent.CompletableFuture;
6+
import javax.inject.Inject;
7+
import org.hypertrace.core.graphql.common.fetcher.InjectableDataFetcher;
8+
import org.hypertrace.graphql.spaces.dao.SpacesConfigDao;
9+
import org.hypertrace.graphql.spaces.request.SpaceConfigRequestBuilder;
10+
11+
public class SpaceConfigRuleDeleteMutator extends InjectableDataFetcher<Boolean> {
12+
13+
public SpaceConfigRuleDeleteMutator() {
14+
super(SpaceConfigRuleDeleteMutatorImpl.class);
15+
}
16+
17+
static final class SpaceConfigRuleDeleteMutatorImpl
18+
implements DataFetcher<CompletableFuture<Boolean>> {
19+
private final SpacesConfigDao configDao;
20+
private final SpaceConfigRequestBuilder requestBuilder;
21+
22+
@Inject
23+
SpaceConfigRuleDeleteMutatorImpl(
24+
SpacesConfigDao configDao, SpaceConfigRequestBuilder requestBuilder) {
25+
this.configDao = configDao;
26+
this.requestBuilder = requestBuilder;
27+
}
28+
29+
@Override
30+
public CompletableFuture<Boolean> get(DataFetchingEnvironment environment) {
31+
return this.configDao
32+
.deleteRule(
33+
this.requestBuilder.buildDeleteRequest(
34+
environment.getContext(), environment.getArguments()))
35+
.toCompletionStage()
36+
.toCompletableFuture();
37+
}
38+
}
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package org.hypertrace.graphql.spaces.mutator;
2+
3+
import graphql.schema.DataFetcher;
4+
import graphql.schema.DataFetchingEnvironment;
5+
import java.util.concurrent.CompletableFuture;
6+
import javax.inject.Inject;
7+
import org.hypertrace.core.graphql.common.fetcher.InjectableDataFetcher;
8+
import org.hypertrace.graphql.spaces.dao.SpacesConfigDao;
9+
import org.hypertrace.graphql.spaces.request.SpaceConfigRequestBuilder;
10+
import org.hypertrace.graphql.spaces.schema.shared.SpaceConfigRule;
11+
12+
public class SpaceConfigRuleUpdateMutator extends InjectableDataFetcher<SpaceConfigRule> {
13+
14+
public SpaceConfigRuleUpdateMutator() {
15+
super(SpaceConfigRuleUpdateMutatorImpl.class);
16+
}
17+
18+
static final class SpaceConfigRuleUpdateMutatorImpl
19+
implements DataFetcher<CompletableFuture<SpaceConfigRule>> {
20+
private final SpacesConfigDao configDao;
21+
private final SpaceConfigRequestBuilder requestBuilder;
22+
23+
@Inject
24+
SpaceConfigRuleUpdateMutatorImpl(
25+
SpacesConfigDao configDao, SpaceConfigRequestBuilder requestBuilder) {
26+
this.configDao = configDao;
27+
this.requestBuilder = requestBuilder;
28+
}
29+
30+
@Override
31+
public CompletableFuture<SpaceConfigRule> get(DataFetchingEnvironment environment) {
32+
return this.configDao
33+
.updateRule(
34+
this.requestBuilder.buildUpdateRequest(
35+
environment.getContext(), environment.getArguments()))
36+
.toCompletionStage()
37+
.toCompletableFuture();
38+
}
39+
}
40+
}

hypertrace-graphql-spaces-schema/src/main/java/org/hypertrace/graphql/spaces/request/SpaceConfigRequestBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,10 @@
66
public interface SpaceConfigRequestBuilder {
77
SpaceConfigRuleCreationRequest buildCreationRequest(
88
GraphQlRequestContext requestContext, Map<String, Object> arguments);
9+
10+
SpaceConfigRuleUpdateRequest buildUpdateRequest(
11+
GraphQlRequestContext requestContext, Map<String, Object> arguments);
12+
13+
SpaceConfigRuleDeleteRequest buildDeleteRequest(
14+
GraphQlRequestContext requestContext, Map<String, Object> arguments);
915
}

0 commit comments

Comments
 (0)