Skip to content

Commit 3549f7c

Browse files
kamaleshnneerasakamaleshnneerasa
andauthored
Eng 11242 (#98)
* Added Create, Delete and Update mutations for labels * Fixing style of code * Addressing PR comments * Removed delete mutation Co-authored-by: kamaleshnneerasa <kamaleshnneerasa@github.com>
1 parent c1ceb5e commit 3549f7c

20 files changed

Lines changed: 398 additions & 5 deletions

hypertrace-graphql-labels-schema/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ dependencies {
2424
implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-grpc-utils")
2525
implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-schema-utils")
2626
implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-rx-utils")
27+
implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-deserialization")
2728

2829
implementation(project(":hypertrace-graphql-service-config"))
2930
}

hypertrace-graphql-labels-schema/src/main/java/org/hypertrace/graphql/label/LabelSchemaFragment.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.hypertrace.core.graphql.spi.schema.GraphQlSchemaFragment;
44
import org.hypertrace.graphql.label.schema.LabelSchema;
5+
import org.hypertrace.graphql.label.schema.mutation.LabelMutationSchema;
56

67
class LabelSchemaFragment implements GraphQlSchemaFragment {
78

@@ -14,4 +15,9 @@ public String fragmentName() {
1415
public Class<LabelSchema> annotatedQueryClass() {
1516
return LabelSchema.class;
1617
}
18+
19+
@Override
20+
public Class<?> annotatedMutationClass() {
21+
return LabelMutationSchema.class;
22+
}
1723
}

hypertrace-graphql-labels-schema/src/main/java/org/hypertrace/graphql/label/LabelSchemaModule.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.google.inject.multibindings.Multibinder;
55
import org.hypertrace.core.graphql.spi.schema.GraphQlSchemaFragment;
66
import org.hypertrace.graphql.label.dao.LabelDaoModule;
7+
import org.hypertrace.graphql.label.deserialization.LabelDeserializationModule;
8+
import org.hypertrace.graphql.label.request.LabelRequestModule;
79

810
public class LabelSchemaModule extends AbstractModule {
911
@Override
@@ -13,5 +15,7 @@ protected void configure() {
1315
.to(LabelSchemaFragment.class);
1416

1517
install(new LabelDaoModule());
18+
install(new LabelDeserializationModule());
19+
install(new LabelRequestModule());
1620
}
1721
}

hypertrace-graphql-labels-schema/src/main/java/org/hypertrace/graphql/label/dao/LabelConfigServiceDao.java

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@
44

55
import io.grpc.CallCredentials;
66
import io.reactivex.rxjava3.core.Single;
7+
import java.util.concurrent.TimeUnit;
78
import javax.inject.Inject;
89
import org.hypertrace.core.graphql.common.request.ContextualRequest;
910
import org.hypertrace.core.graphql.context.GraphQlRequestContext;
1011
import org.hypertrace.core.graphql.utils.grpc.GrpcChannelRegistry;
1112
import org.hypertrace.core.graphql.utils.grpc.GrpcContextBuilder;
1213
import org.hypertrace.graphql.config.HypertraceGraphQlServiceConfig;
14+
import org.hypertrace.graphql.label.request.LabelCreateRequest;
15+
import org.hypertrace.graphql.label.request.LabelUpdateRequest;
16+
import org.hypertrace.graphql.label.schema.Label;
1317
import org.hypertrace.graphql.label.schema.LabelResultSet;
1418
import org.hypertrace.label.config.service.v1.GetLabelsRequest;
1519
import org.hypertrace.label.config.service.v1.GetLabelsResponse;
@@ -20,18 +24,21 @@ class LabelConfigServiceDao implements LabelDao {
2024
private final LabelsConfigServiceFutureStub labelConfigServiceStub;
2125
private final GrpcContextBuilder grpcContextBuilder;
2226
private final HypertraceGraphQlServiceConfig serviceConfig;
23-
private final LabelResponseConverter converter;
27+
private final LabelRequestConverter requestConverter;
28+
private final LabelResponseConverter responseConverter;
2429

2530
@Inject
2631
LabelConfigServiceDao(
2732
HypertraceGraphQlServiceConfig serviceConfig,
2833
CallCredentials credentials,
2934
GrpcContextBuilder grpcContextBuilder,
3035
GrpcChannelRegistry grpcChannelRegistry,
31-
LabelResponseConverter converter) {
36+
LabelRequestConverter requestConverter,
37+
LabelResponseConverter responseConverter) {
3238
this.grpcContextBuilder = grpcContextBuilder;
3339
this.serviceConfig = serviceConfig;
34-
this.converter = converter;
40+
this.requestConverter = requestConverter;
41+
this.responseConverter = responseConverter;
3542
this.labelConfigServiceStub =
3643
LabelsConfigServiceGrpc.newFutureStub(
3744
grpcChannelRegistry.forAddress(
@@ -42,7 +49,7 @@ class LabelConfigServiceDao implements LabelDao {
4249
@Override
4350
public Single<LabelResultSet> getLabels(ContextualRequest request) {
4451
return this.makeRequest(request.context(), GetLabelsRequest.getDefaultInstance())
45-
.flatMap(serverResponse -> converter.convert(serverResponse));
52+
.flatMap(this.responseConverter::convert);
4653
}
4754

4855
private Single<GetLabelsResponse> makeRequest(
@@ -57,4 +64,34 @@ private Single<GetLabelsResponse> makeRequest(
5764
serviceConfig.getConfigServiceTimeout().toMillis(), MILLISECONDS)
5865
.getLabels(request)));
5966
}
67+
68+
@Override
69+
public Single<Label> createLabel(LabelCreateRequest request) {
70+
return Single.fromFuture(
71+
this.grpcContextBuilder
72+
.build(request.context())
73+
.call(
74+
() ->
75+
this.labelConfigServiceStub
76+
.withDeadlineAfter(
77+
serviceConfig.getConfigServiceTimeout().toMillis(),
78+
TimeUnit.MILLISECONDS)
79+
.createLabel(this.requestConverter.convertCreationRequest(request))))
80+
.flatMap(this.responseConverter::convertLabel);
81+
}
82+
83+
@Override
84+
public Single<Label> updateLabel(LabelUpdateRequest request) {
85+
return Single.fromFuture(
86+
this.grpcContextBuilder
87+
.build(request.context())
88+
.call(
89+
() ->
90+
this.labelConfigServiceStub
91+
.withDeadlineAfter(
92+
serviceConfig.getConfigServiceTimeout().toMillis(),
93+
TimeUnit.MILLISECONDS)
94+
.updateLabel(this.requestConverter.convertUpdateRequest(request))))
95+
.flatMap(this.responseConverter::convertUpdateLabel);
96+
}
6097
}

hypertrace-graphql-labels-schema/src/main/java/org/hypertrace/graphql/label/dao/LabelDao.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,15 @@
22

33
import io.reactivex.rxjava3.core.Single;
44
import org.hypertrace.core.graphql.common.request.ContextualRequest;
5+
import org.hypertrace.graphql.label.request.LabelCreateRequest;
6+
import org.hypertrace.graphql.label.request.LabelUpdateRequest;
7+
import org.hypertrace.graphql.label.schema.Label;
58
import org.hypertrace.graphql.label.schema.LabelResultSet;
69

710
public interface LabelDao {
8-
911
Single<LabelResultSet> getLabels(ContextualRequest request);
12+
13+
Single<Label> createLabel(LabelCreateRequest request);
14+
15+
Single<Label> updateLabel(LabelUpdateRequest request);
1016
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.hypertrace.graphql.label.dao;
2+
3+
import org.hypertrace.graphql.label.request.LabelCreateRequest;
4+
import org.hypertrace.graphql.label.request.LabelUpdateRequest;
5+
import org.hypertrace.label.config.service.v1.CreateLabel;
6+
import org.hypertrace.label.config.service.v1.CreateLabelRequest;
7+
import org.hypertrace.label.config.service.v1.Label;
8+
import org.hypertrace.label.config.service.v1.UpdateLabelRequest;
9+
10+
public class LabelRequestConverter {
11+
CreateLabelRequest convertCreationRequest(LabelCreateRequest creationRequest) {
12+
return CreateLabelRequest.newBuilder()
13+
.setLabel(CreateLabel.newBuilder().setKey(creationRequest.label().key()).build())
14+
.build();
15+
}
16+
17+
UpdateLabelRequest convertUpdateRequest(LabelUpdateRequest updateRequest) {
18+
return UpdateLabelRequest.newBuilder()
19+
.setLabel(
20+
Label.newBuilder()
21+
.setKey(updateRequest.label().key())
22+
.setId(updateRequest.label().id())
23+
.build())
24+
.build();
25+
}
26+
}

hypertrace-graphql-labels-schema/src/main/java/org/hypertrace/graphql/label/dao/LabelResponseConverter.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
import lombok.experimental.Accessors;
88
import org.hypertrace.graphql.label.schema.Label;
99
import org.hypertrace.graphql.label.schema.LabelResultSet;
10+
import org.hypertrace.label.config.service.v1.CreateLabelResponse;
1011
import org.hypertrace.label.config.service.v1.GetLabelsResponse;
12+
import org.hypertrace.label.config.service.v1.UpdateLabelResponse;
1113

1214
class LabelResponseConverter {
1315

@@ -19,6 +21,14 @@ Single<LabelResultSet> convert(GetLabelsResponse response) {
1921
return Single.just(new DefaultLabelResultSet(labelList, labelList.size(), labelList.size()));
2022
}
2123

24+
Single<Label> convertLabel(CreateLabelResponse response) {
25+
return Single.just(new DefaultLabel(response.getLabel().getId(), response.getLabel().getKey()));
26+
}
27+
28+
Single<Label> convertUpdateLabel(UpdateLabelResponse response) {
29+
return Single.just(new DefaultLabel(response.getLabel().getId(), response.getLabel().getKey()));
30+
}
31+
2232
@Value
2333
@Accessors(fluent = true)
2434
private static class DefaultLabelResultSet implements LabelResultSet {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package org.hypertrace.graphql.label.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.label.schema.mutation.CreateLabel;
12+
13+
public class CreateLabelDeserializationConfig implements ArgumentDeserializationConfig {
14+
@Override
15+
public String getArgumentKey() {
16+
return CreateLabel.ARGUMENT_NAME;
17+
}
18+
19+
@Override
20+
public Class<?> getArgumentSchema() {
21+
return CreateLabel.class;
22+
}
23+
24+
@Override
25+
public List<Module> jacksonModules() {
26+
return List.of(
27+
new SimpleModule().addAbstractTypeMapping(CreateLabel.class, CreateLabelArgument.class));
28+
}
29+
30+
@Value
31+
@Accessors(fluent = true)
32+
@NoArgsConstructor(force = true)
33+
private static class CreateLabelArgument implements CreateLabel {
34+
@JsonProperty(KEY)
35+
String key;
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package org.hypertrace.graphql.label.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.label.schema.Label;
12+
13+
public class LabelDeserializationConfig implements ArgumentDeserializationConfig {
14+
15+
@Override
16+
public String getArgumentKey() {
17+
return Label.ARGUMENT_NAME;
18+
}
19+
20+
@Override
21+
public Class<?> getArgumentSchema() {
22+
return Label.class;
23+
}
24+
25+
@Override
26+
public List<Module> jacksonModules() {
27+
return List.of(new SimpleModule().addAbstractTypeMapping(Label.class, LabelArgument.class));
28+
}
29+
30+
@Value
31+
@Accessors(fluent = true)
32+
@NoArgsConstructor(force = true)
33+
private static class LabelArgument implements Label {
34+
@JsonProperty(IDENTITY_FIELD_NAME)
35+
String id;
36+
37+
@JsonProperty(KEY)
38+
String key;
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.hypertrace.graphql.label.deserialization;
2+
3+
import com.google.inject.AbstractModule;
4+
import com.google.inject.multibindings.Multibinder;
5+
import org.hypertrace.core.graphql.deserialization.ArgumentDeserializationConfig;
6+
7+
public class LabelDeserializationModule extends AbstractModule {
8+
@Override
9+
protected void configure() {
10+
Multibinder<ArgumentDeserializationConfig> deserializationConfigBinder =
11+
Multibinder.newSetBinder(binder(), ArgumentDeserializationConfig.class);
12+
13+
deserializationConfigBinder.addBinding().to(CreateLabelDeserializationConfig.class);
14+
deserializationConfigBinder.addBinding().to(LabelDeserializationConfig.class);
15+
}
16+
}

0 commit comments

Comments
 (0)