Skip to content

Commit 0f2b242

Browse files
committed
Add AbstractVssApi, get/put/list api handlers
1 parent ff4b5fc commit 0f2b242

File tree

7 files changed

+175
-0
lines changed

7 files changed

+175
-0
lines changed

app/build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ version '1.0'
3333
dependencies {
3434
implementation "com.google.protobuf:protobuf-java:$protobufVersion"
3535

36+
implementation('org.glassfish.jersey.containers:jersey-container-servlet:3.1.0')
37+
3638
//jOOQ & Postgres impl deps
3739
implementation "org.jooq:jooq:$jooqVersion"
3840
implementation "org.jooq:jooq-meta:$jooqVersion"
@@ -42,6 +44,9 @@ dependencies {
4244

4345
implementation "com.google.inject:guice:$guiceVersion"
4446

47+
compileOnly 'org.projectlombok:lombok:1.18.24'
48+
annotationProcessor 'org.projectlombok:lombok:1.18.24'
49+
4550
testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"
4651
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
4752
testImplementation "org.hamcrest:hamcrest-library:2.2"
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.vss;
2+
3+
import jakarta.ws.rs.ApplicationPath;
4+
import org.glassfish.jersey.server.ResourceConfig;
5+
6+
@ApplicationPath("/")
7+
public class VSSApplication extends ResourceConfig {
8+
public VSSApplication() {
9+
}
10+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package org.vss.api;
2+
3+
import com.google.protobuf.GeneratedMessageV3;
4+
import com.google.protobuf.InvalidProtocolBufferException;
5+
import jakarta.inject.Inject;
6+
import jakarta.ws.rs.core.Response;
7+
import org.vss.ErrorCode;
8+
import org.vss.ErrorResponse;
9+
import org.vss.KVStore;
10+
import org.vss.exception.ConflictException;
11+
12+
public abstract class AbstractVssApi {
13+
final KVStore kvStore;
14+
15+
@Inject
16+
public AbstractVssApi(KVStore kvStore) {
17+
this.kvStore = kvStore;
18+
}
19+
20+
Response toResponse(GeneratedMessageV3 protoResponse) {
21+
22+
return Response
23+
.status(Response.Status.OK)
24+
.entity(protoResponse.toByteArray())
25+
.build();
26+
}
27+
28+
Response toErrorResponse(Exception e) {
29+
ErrorCode errorCode;
30+
if (e instanceof ConflictException) {
31+
errorCode = ErrorCode.CONFLICT_EXCEPTION;
32+
} else if (e instanceof IllegalArgumentException
33+
|| e instanceof InvalidProtocolBufferException) {
34+
errorCode = ErrorCode.INVALID_REQUEST_EXCEPTION;
35+
} else {
36+
errorCode = ErrorCode.INTERNAL_SERVER_EXCEPTION;
37+
}
38+
39+
ErrorResponse errorResponse = ErrorResponse.newBuilder()
40+
.setErrorCode(errorCode)
41+
.setMessage(e.getMessage())
42+
.build();
43+
44+
return Response.status(errorCode.getNumber())
45+
.entity(errorResponse.toByteArray())
46+
.build();
47+
}
48+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.vss.api;
2+
3+
import jakarta.inject.Inject;
4+
import jakarta.ws.rs.POST;
5+
import jakarta.ws.rs.Path;
6+
import jakarta.ws.rs.Produces;
7+
import jakarta.ws.rs.core.MediaType;
8+
import jakarta.ws.rs.core.Response;
9+
import lombok.extern.slf4j.Slf4j;
10+
import org.vss.GetObjectRequest;
11+
import org.vss.GetObjectResponse;
12+
import org.vss.KVStore;
13+
14+
@Path(VssApiEndpoint.GET_OBJECT)
15+
@Slf4j
16+
public class GetObjectApi extends AbstractVssApi {
17+
18+
@Inject
19+
public GetObjectApi(KVStore kvstore) {
20+
super(kvstore);
21+
}
22+
23+
@POST
24+
@Produces(MediaType.APPLICATION_OCTET_STREAM)
25+
public Response execute(byte[] payload) {
26+
try {
27+
GetObjectRequest request = GetObjectRequest.parseFrom(payload);
28+
GetObjectResponse response = kvStore.get(request);
29+
return toResponse(response);
30+
} catch (Exception e) {
31+
log.error("Exception in GetObjectApi: ", e);
32+
return toErrorResponse(e);
33+
}
34+
}
35+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.vss.api;
2+
3+
import jakarta.inject.Inject;
4+
import jakarta.ws.rs.POST;
5+
import jakarta.ws.rs.Path;
6+
import jakarta.ws.rs.Produces;
7+
import jakarta.ws.rs.core.MediaType;
8+
import jakarta.ws.rs.core.Response;
9+
import lombok.extern.slf4j.Slf4j;
10+
import org.vss.KVStore;
11+
import org.vss.ListKeyVersionsRequest;
12+
import org.vss.ListKeyVersionsResponse;
13+
14+
@Path(VssApiEndpoint.LIST_KEY_VERSIONS)
15+
@Slf4j
16+
public class ListKeyVersionsApi extends AbstractVssApi {
17+
18+
@Inject
19+
public ListKeyVersionsApi(KVStore kvStore) {
20+
super(kvStore);
21+
}
22+
23+
@POST
24+
@Produces(MediaType.APPLICATION_OCTET_STREAM)
25+
public Response execute(byte[] payload) {
26+
try {
27+
ListKeyVersionsRequest request = ListKeyVersionsRequest.parseFrom(payload);
28+
ListKeyVersionsResponse response = kvStore.listKeyVersions(request);
29+
return toResponse(response);
30+
} catch (Exception e) {
31+
log.error("Exception in ListKeyVersionsApi: ", e);
32+
return toErrorResponse(e);
33+
}
34+
}
35+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.vss.api;
2+
3+
import jakarta.inject.Inject;
4+
import jakarta.ws.rs.POST;
5+
import jakarta.ws.rs.Path;
6+
import jakarta.ws.rs.Produces;
7+
import jakarta.ws.rs.core.MediaType;
8+
import jakarta.ws.rs.core.Response;
9+
import lombok.extern.slf4j.Slf4j;
10+
import org.vss.KVStore;
11+
import org.vss.PutObjectRequest;
12+
import org.vss.PutObjectResponse;
13+
14+
@Path(VssApiEndpoint.PUT_OBJECTS)
15+
@Slf4j
16+
public class PutObjectsApi extends AbstractVssApi {
17+
18+
@Inject
19+
public PutObjectsApi(KVStore kvStore) {
20+
super(kvStore);
21+
}
22+
23+
@POST
24+
@Produces(MediaType.APPLICATION_OCTET_STREAM)
25+
public Response execute(byte[] payload) {
26+
try {
27+
PutObjectRequest putObjectRequest = PutObjectRequest.parseFrom(payload);
28+
PutObjectResponse response = kvStore.put(putObjectRequest);
29+
return toResponse(response);
30+
} catch (Exception e) {
31+
log.error("Exception in PutObjectsApi: ", e);
32+
return toErrorResponse(e);
33+
}
34+
}
35+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.vss.api;
2+
3+
public class VssApiEndpoint {
4+
public static final String GET_OBJECT = "/getObject";
5+
public static final String PUT_OBJECTS = "/putObjects";
6+
public static final String LIST_KEY_VERSIONS = "/listKeyVersions";
7+
}

0 commit comments

Comments
 (0)