diff --git a/src/main/java/com/coveo/pushapiclient/BatchUpdate.java b/src/main/java/com/coveo/pushapiclient/BatchUpdate.java new file mode 100644 index 00000000..abeb0e63 --- /dev/null +++ b/src/main/java/com/coveo/pushapiclient/BatchUpdate.java @@ -0,0 +1,14 @@ +package com.coveo.pushapiclient; + +import com.google.gson.JsonObject; + +import java.util.List; + +public record BatchUpdate(List addOrUpdate, List delete) { + public BatchUpdateRecord marshal() { + return new BatchUpdateRecord( + this.addOrUpdate.stream().map(documentBuilder -> documentBuilder.marshalJsonObject()).toArray(JsonObject[]::new), + this.delete.stream().map(documentBuilder -> documentBuilder.marshalJsonObject()).toArray(JsonObject[]::new) + ); + } +} diff --git a/src/main/java/com/coveo/pushapiclient/BatchUpdateRecord.java b/src/main/java/com/coveo/pushapiclient/BatchUpdateRecord.java new file mode 100644 index 00000000..e2d0031b --- /dev/null +++ b/src/main/java/com/coveo/pushapiclient/BatchUpdateRecord.java @@ -0,0 +1,6 @@ +package com.coveo.pushapiclient; + +import com.google.gson.JsonObject; + +public record BatchUpdateRecord(JsonObject[] addOrUpdate, JsonObject[] delete) { +} diff --git a/src/main/java/com/coveo/pushapiclient/DocumentBuilder.java b/src/main/java/com/coveo/pushapiclient/DocumentBuilder.java index 4d95aeab..e384b041 100644 --- a/src/main/java/com/coveo/pushapiclient/DocumentBuilder.java +++ b/src/main/java/com/coveo/pushapiclient/DocumentBuilder.java @@ -152,13 +152,17 @@ public DocumentBuilder withAllowAnonymousUsers(Boolean allowAnonymous) { } public String marshal() { + return this.marshalJsonObject().toString(); + } + + public JsonObject marshalJsonObject() { JsonObject jsonDocument = new Gson().toJsonTree(this.document).getAsJsonObject(); this.document.metadata.forEach((key, value) -> { jsonDocument.add(key, new Gson().toJsonTree(value)); }); jsonDocument.remove("metadata"); - return jsonDocument.toString(); - + jsonDocument.addProperty("documentId", this.document.uri); + return jsonDocument; } private String dateFormat(DateTime dt) { diff --git a/src/main/java/com/coveo/pushapiclient/FileContainer.java b/src/main/java/com/coveo/pushapiclient/FileContainer.java new file mode 100644 index 00000000..4d07bdee --- /dev/null +++ b/src/main/java/com/coveo/pushapiclient/FileContainer.java @@ -0,0 +1,9 @@ +package com.coveo.pushapiclient; + +import java.util.Map; + +public class FileContainer { + public String uploadUri; + public String fileId; + public Map requiredHeaders; +} diff --git a/src/main/java/com/coveo/pushapiclient/PlatformClient.java b/src/main/java/com/coveo/pushapiclient/PlatformClient.java index 3f6535ef..5261a22a 100644 --- a/src/main/java/com/coveo/pushapiclient/PlatformClient.java +++ b/src/main/java/com/coveo/pushapiclient/PlatformClient.java @@ -130,16 +130,47 @@ public void deleteDocument(String sourceId, String documentId, Boolean deleteChi // TODO } - public void createFileContainer() { - // TODO + public HttpResponse createFileContainer() throws IOException, InterruptedException { + String[] headers = this.getHeaders(this.getAuthorizationHeader(), this.getContentTypeApplicationJSONHeader()); + URI uri = URI.create(this.getBasePushURL() + "/files"); + + HttpRequest request = HttpRequest.newBuilder() + .headers(headers) + .uri(uri) + .POST(HttpRequest.BodyPublishers.ofString("")) + .build(); + + return this.httpClient.send(request, HttpResponse.BodyHandlers.ofString()); } - public void uploadContentToFileContainer(String sourceId, Object fileContainer) { - // TODO + public HttpResponse uploadContentToFileContainer(String sourceId, FileContainer fileContainer, BatchUpdateRecord batchUpdate) throws IOException, InterruptedException { + String[] headers = fileContainer.requiredHeaders.entrySet() + .stream() + .flatMap(entry -> Stream.of(entry.getKey(), entry.getValue())) + .toArray(String[]::new); + URI uri = URI.create(fileContainer.uploadUri); + + + HttpRequest request = HttpRequest.newBuilder() + .headers(headers) + .uri(uri) + .PUT(HttpRequest.BodyPublishers.ofString(new Gson().toJson(batchUpdate))) + .build(); + + return this.httpClient.send(request, HttpResponse.BodyHandlers.ofString()); } - public void pushFileContainerContent(String sourceId, Object fileContainer) { - // TODO + public HttpResponse pushFileContainerContent(String sourceId, FileContainer fileContainer) throws IOException, InterruptedException { + String[] headers = this.getHeaders(this.getAuthorizationHeader(), this.getContentTypeApplicationJSONHeader()); + URI uri = URI.create(this.getBasePushURL() + String.format("/sources/%s/documents/batch?fileId=%s", sourceId, fileContainer.fileId)); + + HttpRequest request = HttpRequest.newBuilder() + .headers(headers) + .uri(uri) + .PUT(HttpRequest.BodyPublishers.ofString("")) + .build(); + + return this.httpClient.send(request, HttpResponse.BodyHandlers.ofString()); } private String getBaseSourceURL() { diff --git a/src/main/java/com/coveo/pushapiclient/Source.java b/src/main/java/com/coveo/pushapiclient/Source.java index 84813148..4adbb5b3 100644 --- a/src/main/java/com/coveo/pushapiclient/Source.java +++ b/src/main/java/com/coveo/pushapiclient/Source.java @@ -1,5 +1,7 @@ package com.coveo.pushapiclient; +import com.google.gson.Gson; + import java.io.IOException; import java.net.http.HttpResponse; @@ -37,4 +39,11 @@ public HttpResponse manageSecurityIdentities(String securityProviderId, public HttpResponse addOrUpdateDocument(String sourceId, DocumentBuilder docBuilder) throws IOException, InterruptedException { return this.platformClient.pushDocument(sourceId, docBuilder.marshal(), docBuilder.getDocument().uri); } + + public HttpResponse batchUpdateDocuments(String sourceId, BatchUpdate batchUpdate) throws IOException, InterruptedException { + HttpResponse resFileContainer = this.platformClient.createFileContainer(); + FileContainer fileContainer = new Gson().fromJson(resFileContainer.body(), FileContainer.class); + this.platformClient.uploadContentToFileContainer(sourceId, fileContainer, batchUpdate.marshal()); + return this.platformClient.pushFileContainerContent(sourceId, fileContainer); + } } diff --git a/src/main/java/com/coveo/testlocally/TestingLocally.java b/src/main/java/com/coveo/testlocally/TestingLocally.java index d21b5d25..d0d60318 100644 --- a/src/main/java/com/coveo/testlocally/TestingLocally.java +++ b/src/main/java/com/coveo/testlocally/TestingLocally.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.net.http.HttpResponse; +import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -35,19 +36,30 @@ public static void testPushDocument(String sourceId, Source source) { put("my_field_3", 1234); put("my_field_4", new String[]{"a", "b", "c"}); }}); - DocumentBuilder docWithSecurity = new DocumentBuilder("https://perdu.com/2", "the title 2") + DocumentBuilder docWithSecurity = new DocumentBuilder("https://perdu.com/2", "the title 2") .withData("this is searchable also") .withAllowAnonymousUsers(false) .withAllowedPermissions(new UserSecurityIdentityBuilder("olamothe@coveo.com")) .withDeniedPermissions(new UserSecurityIdentityBuilder(new String[]{"lbompart@coveo.com", "ylakhdar@coveo.com"})); + ArrayList docToAdd = new ArrayList<>(); + ArrayList docToRemove = new ArrayList<>(); + for (int i = 0; i < 10; i++) { + docToAdd.add(new DocumentBuilder(String.format("https://perdu.com/%s", i), String.format("the title %s", i)).withData(String.format("this is searchable %s", i))); + } + for (int i = 10; i < 20; i++) { + docToRemove.add(new DocumentBuilder(String.format("https://perdu.com/%s", i), String.format("the title %s", i)).withData(String.format("this is searchable %s", i))); + } + try { source.addOrUpdateDocument(sourceId, simpleDoc); source.addOrUpdateDocument(sourceId, docWithMetadata); + source.batchUpdateDocuments(sourceId, new BatchUpdate(docToAdd, docToRemove)); source.addOrUpdateDocument(sourceId, docWithSecurity); } catch (IOException | InterruptedException e) { System.out.println(e); } + } public static void testManageIdentities(Source source) {