From d95cb00570085b51d33b58576393255262016dda Mon Sep 17 00:00:00 2001 From: 4apkis Date: Fri, 24 Dec 2021 13:57:10 +0200 Subject: [PATCH 01/10] Implemented some of V2 features: webhook management and prefill documents --- .../java/com/signnow/library/SNClient.java | 12 ++++-- .../com/signnow/library/dto/Document.java | 22 +++++++++++ .../java/com/signnow/library/dto/Webhook.java | 37 +++++++++++++++++++ .../signnow/library/facades/Documents.java | 4 ++ .../library/facades/ServiceProvider.java | 2 + .../com/signnow/library/facades/Webhooks.java | 10 +++++ .../library/services/DocumentsService.java | 11 ++++++ .../library/services/WebhookService.java | 34 +++++++++++++++++ 8 files changed, 128 insertions(+), 4 deletions(-) create mode 100644 client-lib/src/main/java/com/signnow/library/dto/Webhook.java create mode 100644 client-lib/src/main/java/com/signnow/library/facades/Webhooks.java create mode 100644 client-lib/src/main/java/com/signnow/library/services/WebhookService.java diff --git a/client-lib/src/main/java/com/signnow/library/SNClient.java b/client-lib/src/main/java/com/signnow/library/SNClient.java index ebbc099..5b9ad4c 100644 --- a/client-lib/src/main/java/com/signnow/library/SNClient.java +++ b/client-lib/src/main/java/com/signnow/library/SNClient.java @@ -5,13 +5,11 @@ import com.signnow.library.dto.User; import com.signnow.library.exceptions.SNApiException; import com.signnow.library.exceptions.SNException; -import com.signnow.library.facades.DocumentGroups; -import com.signnow.library.facades.Documents; -import com.signnow.library.facades.ServiceProvider; -import com.signnow.library.facades.Templates; +import com.signnow.library.facades.*; import com.signnow.library.services.DocumentGroupsService; import com.signnow.library.services.DocumentsService; import com.signnow.library.services.TemplatesService; +import com.signnow.library.services.WebhookService; import javax.ws.rs.client.Entity; import javax.ws.rs.client.Invocation; @@ -36,6 +34,7 @@ public class SNClient implements ServiceProvider { private WebTarget apiWebTarget; private Documents documentsService = new DocumentsService(this); private Templates templatesService = new TemplatesService(this); + private Webhooks webhooksService = new WebhookService(this); private DocumentGroups documentGroupsService = new DocumentGroupsService(this); protected SNClient(WebTarget apiWebTarget, User user) { @@ -61,6 +60,11 @@ public Templates templatesService() { return templatesService; } + @Override + public Webhooks webhooksService() { + return webhooksService; + } + @Override public DocumentGroups documentGroupsService() { return documentGroupsService; diff --git a/client-lib/src/main/java/com/signnow/library/dto/Document.java b/client-lib/src/main/java/com/signnow/library/dto/Document.java index b442028..ec30bcd 100644 --- a/client-lib/src/main/java/com/signnow/library/dto/Document.java +++ b/client-lib/src/main/java/com/signnow/library/dto/Document.java @@ -127,6 +127,14 @@ public String toString() { } } + public static class PrefillTextRequest { + public final List fields; + + public PrefillTextRequest(List fields) { + this.fields = fields; + } + } + public static class FieldsUpdateRequest { public final List fields; @@ -135,6 +143,20 @@ public FieldsUpdateRequest(List fields) { } } + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class FieldText { + @JsonProperty("field_name") + public String fieldName; + @JsonProperty("prefilled_text") + public String prefilledText; + + public FieldText(String name, String prefill) { + this.fieldName = name; + this.prefilledText = prefill; + } + } + + @JsonInclude(JsonInclude.Include.NON_NULL) public static class Field { public int x; diff --git a/client-lib/src/main/java/com/signnow/library/dto/Webhook.java b/client-lib/src/main/java/com/signnow/library/dto/Webhook.java new file mode 100644 index 0000000..a11115d --- /dev/null +++ b/client-lib/src/main/java/com/signnow/library/dto/Webhook.java @@ -0,0 +1,37 @@ +package com.signnow.library.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Map; + +public class Webhook { + public static class CreateRequest { + @JsonProperty("event") + public final String event; + @JsonProperty("entity_id") + public final String entityId; + @JsonProperty("action") + public final String action = "callback"; + @JsonProperty("attributes") + public final Attributes attributes; + + public CreateRequest(String event, String entityId, String callback, Map headers) { + this.event = event; + this.entityId = entityId; + this.attributes = new Attributes(callback, headers); + } + } + + static class Attributes { + @JsonProperty("callback") + public final String callback; + + @JsonProperty("headers") + public final Map headers; + + Attributes(String callback, Map headers) { + this.callback = callback; + this.headers = headers; + } + } +} diff --git a/client-lib/src/main/java/com/signnow/library/facades/Documents.java b/client-lib/src/main/java/com/signnow/library/facades/Documents.java index a1a6539..3ff4827 100644 --- a/client-lib/src/main/java/com/signnow/library/facades/Documents.java +++ b/client-lib/src/main/java/com/signnow/library/facades/Documents.java @@ -24,9 +24,13 @@ public interface Documents { void updateDocumentFields(String documentId, List request) throws SNException; + void prefillText(String documentId, List request) throws SNException; + + Document getDocument(String documentId) throws SNException; void deleteDocument(String documentId) throws SNException; String getDownloadLink(String documentId) throws SNException; + } diff --git a/client-lib/src/main/java/com/signnow/library/facades/ServiceProvider.java b/client-lib/src/main/java/com/signnow/library/facades/ServiceProvider.java index 0e979cb..2edf25c 100644 --- a/client-lib/src/main/java/com/signnow/library/facades/ServiceProvider.java +++ b/client-lib/src/main/java/com/signnow/library/facades/ServiceProvider.java @@ -6,4 +6,6 @@ public interface ServiceProvider { Templates templatesService(); DocumentGroups documentGroupsService(); + + Webhooks webhooksService(); } diff --git a/client-lib/src/main/java/com/signnow/library/facades/Webhooks.java b/client-lib/src/main/java/com/signnow/library/facades/Webhooks.java new file mode 100644 index 0000000..b790b4e --- /dev/null +++ b/client-lib/src/main/java/com/signnow/library/facades/Webhooks.java @@ -0,0 +1,10 @@ +package com.signnow.library.facades; + +import com.signnow.library.exceptions.SNException; + +import java.util.Map; + +public interface Webhooks { + void add(String event, String entityId, String callback, Map headers) throws SNException; + void delete(String webhookId) throws SNException; +} diff --git a/client-lib/src/main/java/com/signnow/library/services/DocumentsService.java b/client-lib/src/main/java/com/signnow/library/services/DocumentsService.java index 551f64f..12d7407 100644 --- a/client-lib/src/main/java/com/signnow/library/services/DocumentsService.java +++ b/client-lib/src/main/java/com/signnow/library/services/DocumentsService.java @@ -72,6 +72,16 @@ public void sendDocumentSignInvite(String documentId, Document.SigningInviteWith ); } + @Override + public void prefillText(String documentId, List request) throws SNException { + client.put( + "/v2/documents/{documentId}/prefill-texts", + Collections.singletonMap("documentId", documentId), + new Document.PrefillTextRequest(request), + String.class + ); + } + @Override public void updateDocumentFields(String documentId, List request) throws SNException { client.put( @@ -109,4 +119,5 @@ public String getDownloadLink(String documentId) throws SNException { Document.DocumentDownloadLink.class ).link; } + } diff --git a/client-lib/src/main/java/com/signnow/library/services/WebhookService.java b/client-lib/src/main/java/com/signnow/library/services/WebhookService.java new file mode 100644 index 0000000..142bda8 --- /dev/null +++ b/client-lib/src/main/java/com/signnow/library/services/WebhookService.java @@ -0,0 +1,34 @@ +package com.signnow.library.services; + +import com.signnow.library.SNClient; +import com.signnow.library.dto.Webhook; +import com.signnow.library.exceptions.SNException; +import com.signnow.library.facades.Webhooks; + +import java.util.Collections; +import java.util.Map; + +public class WebhookService extends ApiService implements Webhooks { + public WebhookService(SNClient client) { + super(client); + } + + @Override + public void add(String event, String entityId, String callback, Map headers) throws SNException { + client.post( + "/api/v2/events", + null, + new Webhook.CreateRequest(event, entityId, callback, headers), + String.class + ); + } + + @Override + public void delete(String eventSubscriptionId) throws SNException { + client.delete( + "/api/v2/events/{eventSubscriptionId}", + Collections.singletonMap("eventSubscriptionId", eventSubscriptionId), + String.class + ); + } +} From fb61fe2cde910c86fe1d2b27e3d9f22c5550ea80 Mon Sep 17 00:00:00 2001 From: 4apkis Date: Fri, 24 Dec 2021 14:08:30 +0200 Subject: [PATCH 02/10] Export to github packages for Operations project --- client-lib/pom.xml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/client-lib/pom.xml b/client-lib/pom.xml index 0550326..aceedb4 100644 --- a/client-lib/pom.xml +++ b/client-lib/pom.xml @@ -5,7 +5,7 @@ com.signnow api-client-lib - 1.0.0-SNAPSHOT + 1.0.2 jar @@ -94,4 +94,13 @@ + + + + github + Darwin + https://maven.pkg.github.com/SSDevelopment/DarwinOperations + + + From 464b0818f8ea5ebc4d5bb07536a0b0d6371cabb7 Mon Sep 17 00:00:00 2001 From: ndovhiitrach Date: Fri, 4 Mar 2022 18:22:28 +0200 Subject: [PATCH 03/10] embedded invite --- .../com/signnow/library/dto/Document.java | 63 ++++++++++++++++++- .../signnow/library/facades/Documents.java | 5 +- .../library/services/DocumentsService.java | 22 +++++++ 3 files changed, 87 insertions(+), 3 deletions(-) diff --git a/client-lib/src/main/java/com/signnow/library/dto/Document.java b/client-lib/src/main/java/com/signnow/library/dto/Document.java index ec30bcd..aaf75b1 100644 --- a/client-lib/src/main/java/com/signnow/library/dto/Document.java +++ b/client-lib/src/main/java/com/signnow/library/dto/Document.java @@ -2,8 +2,7 @@ import com.fasterxml.jackson.annotation.*; -import java.util.ArrayList; -import java.util.List; +import java.util.*; @JsonIgnoreProperties(ignoreUnknown = true) public class Document extends GenericId { @@ -197,4 +196,64 @@ public static class DocumentDownloadLink { public String link; } + /*------------------------Embedded invites------------------------*/ + public static class SigningEmbeddedInviteRequest { + public final List invites = new ArrayList<>(); + + public SigningEmbeddedInviteRequest(EmbeddedInvite... invite) { + this.invites.addAll(Arrays.asList(invite)); + } + } + + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class EmbeddedInvite { + public String email; + public String role_id = ""; + public String role; + public int order = 1; + @JsonProperty("auth_method") + public String authMethod = "none"; + + public EmbeddedInvite(String email, String role) { + this.email = email; + this.role = role; + } + } + + public static class SigningEmbeddedInviteResponse { + public final List data = new ArrayList<>(); + } + + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class InviteResponseData { + public final String id; + public final String email; + @JsonProperty("role_id") + public final String roleId; + public final int order; + public final String status; + + public InviteResponseData(String id, String email, String roleId, int order, String status) { + this.id = id; + this.email = email; + this.roleId = roleId; + this.order = order; + this.status = status; + } + } + + public static class GettingEmbeddedInviteLinkRequest { + @JsonProperty("link_expiration") + public int linkExpiration = 45; + @JsonProperty("auth_method") + public String authMethod = "none"; + } + + public static class GettingEmbeddedInviteLinkResponse { + public final Map data = new HashMap<>(); + + public String getLink() { + return data.get("link"); + } + } } diff --git a/client-lib/src/main/java/com/signnow/library/facades/Documents.java b/client-lib/src/main/java/com/signnow/library/facades/Documents.java index 3ff4827..218e023 100644 --- a/client-lib/src/main/java/com/signnow/library/facades/Documents.java +++ b/client-lib/src/main/java/com/signnow/library/facades/Documents.java @@ -22,11 +22,14 @@ public interface Documents { void sendDocumentSignInvite(String documentId, Document.SigningInviteWithRolesRequest request) throws SNException; + Document.SigningEmbeddedInviteResponse createDocumentEmbeddedSignInvite(String documentId, Document.SigningEmbeddedInviteRequest request) throws SNException; + + String getDocumentEmbeddedSignInviteLink(String documentId, String inviteId, Document.GettingEmbeddedInviteLinkRequest request) throws SNException; + void updateDocumentFields(String documentId, List request) throws SNException; void prefillText(String documentId, List request) throws SNException; - Document getDocument(String documentId) throws SNException; void deleteDocument(String documentId) throws SNException; diff --git a/client-lib/src/main/java/com/signnow/library/services/DocumentsService.java b/client-lib/src/main/java/com/signnow/library/services/DocumentsService.java index 12d7407..8c28880 100644 --- a/client-lib/src/main/java/com/signnow/library/services/DocumentsService.java +++ b/client-lib/src/main/java/com/signnow/library/services/DocumentsService.java @@ -14,7 +14,9 @@ import javax.ws.rs.core.Response; import java.io.InputStream; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class DocumentsService extends ApiService implements Documents { public DocumentsService(SNClient client) { @@ -72,6 +74,26 @@ public void sendDocumentSignInvite(String documentId, Document.SigningInviteWith ); } + @Override + public Document.SigningEmbeddedInviteResponse createDocumentEmbeddedSignInvite(String documentId, Document.SigningEmbeddedInviteRequest request) throws SNException { + return client.post( + "/v2/documents/{document_id}/embedded-invites", + Collections.singletonMap("document_id", documentId), + request, + Document.SigningEmbeddedInviteResponse.class); + } + + @Override + public String getDocumentEmbeddedSignInviteLink(String documentId, String inviteId, Document.GettingEmbeddedInviteLinkRequest request) throws SNException { + Map params = new HashMap<>(); + params.put("document_id", documentId); + params.put("fieldInviteUniqueId", inviteId); + Document.GettingEmbeddedInviteLinkResponse response = client.post( + "/v2/documents/{document_id}/embedded-invites/{fieldInviteUniqueId}/link", + params, request, Document.GettingEmbeddedInviteLinkResponse.class); + return response.getLink(); + } + @Override public void prefillText(String documentId, List request) throws SNException { client.put( From dc3acfd2f8d050202a159c0e469f372f01699aa8 Mon Sep 17 00:00:00 2001 From: ndovhiitrach Date: Tue, 8 Mar 2022 15:59:56 +0200 Subject: [PATCH 04/10] raise version --- client-lib/pom.xml | 2 +- .../main/java/com/signnow/library/dto/Document.java | 10 +++++----- .../java/com/signnow/library/facades/Documents.java | 4 ++-- .../com/signnow/library/services/DocumentsService.java | 10 +++++----- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/client-lib/pom.xml b/client-lib/pom.xml index aceedb4..e168ccc 100644 --- a/client-lib/pom.xml +++ b/client-lib/pom.xml @@ -5,7 +5,7 @@ com.signnow api-client-lib - 1.0.2 + 1.0.3 jar diff --git a/client-lib/src/main/java/com/signnow/library/dto/Document.java b/client-lib/src/main/java/com/signnow/library/dto/Document.java index aaf75b1..10f8e88 100644 --- a/client-lib/src/main/java/com/signnow/library/dto/Document.java +++ b/client-lib/src/main/java/com/signnow/library/dto/Document.java @@ -197,10 +197,10 @@ public static class DocumentDownloadLink { } /*------------------------Embedded invites------------------------*/ - public static class SigningEmbeddedInviteRequest { + public static class EmbeddedSigningInviteRequest { public final List invites = new ArrayList<>(); - public SigningEmbeddedInviteRequest(EmbeddedInvite... invite) { + public EmbeddedSigningInviteRequest(EmbeddedInvite... invite) { this.invites.addAll(Arrays.asList(invite)); } } @@ -220,7 +220,7 @@ public EmbeddedInvite(String email, String role) { } } - public static class SigningEmbeddedInviteResponse { + public static class EmbeddedSigningInviteResponse { public final List data = new ArrayList<>(); } @@ -242,14 +242,14 @@ public InviteResponseData(String id, String email, String roleId, int order, Str } } - public static class GettingEmbeddedInviteLinkRequest { + public static class EmbeddedInviteLinkRequest { @JsonProperty("link_expiration") public int linkExpiration = 45; @JsonProperty("auth_method") public String authMethod = "none"; } - public static class GettingEmbeddedInviteLinkResponse { + public static class EmbeddedInviteLinkResponse { public final Map data = new HashMap<>(); public String getLink() { diff --git a/client-lib/src/main/java/com/signnow/library/facades/Documents.java b/client-lib/src/main/java/com/signnow/library/facades/Documents.java index 218e023..3e2550c 100644 --- a/client-lib/src/main/java/com/signnow/library/facades/Documents.java +++ b/client-lib/src/main/java/com/signnow/library/facades/Documents.java @@ -22,9 +22,9 @@ public interface Documents { void sendDocumentSignInvite(String documentId, Document.SigningInviteWithRolesRequest request) throws SNException; - Document.SigningEmbeddedInviteResponse createDocumentEmbeddedSignInvite(String documentId, Document.SigningEmbeddedInviteRequest request) throws SNException; + Document.EmbeddedSigningInviteResponse createDocumentEmbeddedSignInvite(String documentId, Document.EmbeddedSigningInviteRequest request) throws SNException; - String getDocumentEmbeddedSignInviteLink(String documentId, String inviteId, Document.GettingEmbeddedInviteLinkRequest request) throws SNException; + String getDocumentEmbeddedSignInviteLink(String documentId, String inviteId, Document.EmbeddedInviteLinkRequest request) throws SNException; void updateDocumentFields(String documentId, List request) throws SNException; diff --git a/client-lib/src/main/java/com/signnow/library/services/DocumentsService.java b/client-lib/src/main/java/com/signnow/library/services/DocumentsService.java index 8c28880..e50b0a0 100644 --- a/client-lib/src/main/java/com/signnow/library/services/DocumentsService.java +++ b/client-lib/src/main/java/com/signnow/library/services/DocumentsService.java @@ -75,22 +75,22 @@ public void sendDocumentSignInvite(String documentId, Document.SigningInviteWith } @Override - public Document.SigningEmbeddedInviteResponse createDocumentEmbeddedSignInvite(String documentId, Document.SigningEmbeddedInviteRequest request) throws SNException { + public Document.EmbeddedSigningInviteResponse createDocumentEmbeddedSignInvite(String documentId, Document.EmbeddedSigningInviteRequest request) throws SNException { return client.post( "/v2/documents/{document_id}/embedded-invites", Collections.singletonMap("document_id", documentId), request, - Document.SigningEmbeddedInviteResponse.class); + Document.EmbeddedSigningInviteResponse.class); } @Override - public String getDocumentEmbeddedSignInviteLink(String documentId, String inviteId, Document.GettingEmbeddedInviteLinkRequest request) throws SNException { + public String getDocumentEmbeddedSignInviteLink(String documentId, String inviteId, Document.EmbeddedInviteLinkRequest request) throws SNException { Map params = new HashMap<>(); params.put("document_id", documentId); params.put("fieldInviteUniqueId", inviteId); - Document.GettingEmbeddedInviteLinkResponse response = client.post( + Document.EmbeddedInviteLinkResponse response = client.post( "/v2/documents/{document_id}/embedded-invites/{fieldInviteUniqueId}/link", - params, request, Document.GettingEmbeddedInviteLinkResponse.class); + params, request, Document.EmbeddedInviteLinkResponse.class); return response.getLink(); } From 454b0374ade9d799e48d38498b0da755a80e4fd6 Mon Sep 17 00:00:00 2001 From: ndovhiitrach Date: Wed, 9 Mar 2022 14:08:00 +0200 Subject: [PATCH 05/10] remove empty role_id --- client-lib/src/main/java/com/signnow/library/dto/Document.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client-lib/src/main/java/com/signnow/library/dto/Document.java b/client-lib/src/main/java/com/signnow/library/dto/Document.java index 10f8e88..be7546d 100644 --- a/client-lib/src/main/java/com/signnow/library/dto/Document.java +++ b/client-lib/src/main/java/com/signnow/library/dto/Document.java @@ -208,7 +208,7 @@ public EmbeddedSigningInviteRequest(EmbeddedInvite... invite) { @JsonInclude(JsonInclude.Include.NON_NULL) public static class EmbeddedInvite { public String email; - public String role_id = ""; + public String role_id; public String role; public int order = 1; @JsonProperty("auth_method") From 90892869d23a0c5635de6819411a61bbc1de09ba Mon Sep 17 00:00:00 2001 From: ndovhiitrach Date: Wed, 9 Mar 2022 14:09:35 +0200 Subject: [PATCH 06/10] raise version --- client-lib/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client-lib/pom.xml b/client-lib/pom.xml index e168ccc..db68044 100644 --- a/client-lib/pom.xml +++ b/client-lib/pom.xml @@ -5,7 +5,7 @@ com.signnow api-client-lib - 1.0.3 + 1.0.4 jar From 9dc65f4e9e5f9989b94aab70c0a1f37b6cb9f447 Mon Sep 17 00:00:00 2001 From: ndovhiitrach Date: Wed, 9 Mar 2022 14:30:34 +0200 Subject: [PATCH 07/10] tune response data --- client-lib/pom.xml | 2 +- .../com/signnow/library/dto/Document.java | 22 ++++++------------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/client-lib/pom.xml b/client-lib/pom.xml index db68044..36bce63 100644 --- a/client-lib/pom.xml +++ b/client-lib/pom.xml @@ -5,7 +5,7 @@ com.signnow api-client-lib - 1.0.4 + 1.0.5 jar diff --git a/client-lib/src/main/java/com/signnow/library/dto/Document.java b/client-lib/src/main/java/com/signnow/library/dto/Document.java index be7546d..93b5993 100644 --- a/client-lib/src/main/java/com/signnow/library/dto/Document.java +++ b/client-lib/src/main/java/com/signnow/library/dto/Document.java @@ -221,25 +221,17 @@ public EmbeddedInvite(String email, String role) { } public static class EmbeddedSigningInviteResponse { - public final List data = new ArrayList<>(); + public List data = new ArrayList<>(); } @JsonInclude(JsonInclude.Include.NON_NULL) public static class InviteResponseData { - public final String id; - public final String email; + public String id; + public String email; @JsonProperty("role_id") - public final String roleId; - public final int order; - public final String status; - - public InviteResponseData(String id, String email, String roleId, int order, String status) { - this.id = id; - this.email = email; - this.roleId = roleId; - this.order = order; - this.status = status; - } + public String roleId; + public int order; + public String status; } public static class EmbeddedInviteLinkRequest { @@ -250,7 +242,7 @@ public static class EmbeddedInviteLinkRequest { } public static class EmbeddedInviteLinkResponse { - public final Map data = new HashMap<>(); + public Map data = new HashMap<>(); public String getLink() { return data.get("link"); From 8d4cd33f33dd8ac16f15f0dd0a819e4d61d74e43 Mon Sep 17 00:00:00 2001 From: VitaliiSkuratovskyi <98324362+VitaliiSkuratovskyi@users.noreply.github.com> Date: Fri, 3 Jun 2022 16:08:54 +0300 Subject: [PATCH 08/10] Add fields to Document (#1) * Update document. Add fields to Document. * Update version Co-authored-by: Vitalii Skuratovskyi --- client-lib/pom.xml | 2 +- .../com/signnow/library/dto/Document.java | 46 ++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/client-lib/pom.xml b/client-lib/pom.xml index 36bce63..1528d0a 100644 --- a/client-lib/pom.xml +++ b/client-lib/pom.xml @@ -5,7 +5,7 @@ com.signnow api-client-lib - 1.0.5 + 1.0.6 jar diff --git a/client-lib/src/main/java/com/signnow/library/dto/Document.java b/client-lib/src/main/java/com/signnow/library/dto/Document.java index 93b5993..780af8b 100644 --- a/client-lib/src/main/java/com/signnow/library/dto/Document.java +++ b/client-lib/src/main/java/com/signnow/library/dto/Document.java @@ -27,6 +27,8 @@ public class Document extends GenericId { * Free form invites info */ public List requests; + @JsonProperty("fields") + public List fields; public static class SigningLinkRequest { @JsonProperty("document_id") @@ -155,7 +157,6 @@ public FieldText(String name, String prefill) { } } - @JsonInclude(JsonInclude.Include.NON_NULL) public static class Field { public int x; @@ -176,6 +177,49 @@ public String getType() { } } + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class FieldMetadata { + public String id; + public String type; + @JsonProperty("role_id") + public String roleId; + public String role; + public String originator; + public String fulfiller; + @JsonProperty("json_attributes") + public Attributes attributes; + @JsonProperty("field_request_id") + public String fieldRequestId; + @JsonProperty("element_id") + public String elementId; + @JsonProperty("field_request_canceled") + public boolean fieldRequestCanceled; + @JsonProperty("template_field_id") + public String templateFieldId; + @JsonProperty("field_id") + public String fieldId; + + public String getType() { + return type.toString(); + } + + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Attributes { + @JsonProperty("page_number") + public String pageNumber; + public int x; + public int y; + public int width; + public int height; + public boolean required; + public String name; + public String label; + @JsonProperty("prefilled_text") + public String prefilledText; + } + } + @JsonIgnoreProperties(ignoreUnknown = true) public static class FieldInvite extends GenericId { public String status; From de6c5266c0318c300bffad6329a8511fa2792497 Mon Sep 17 00:00:00 2001 From: Vitalii Skuratovskyi <98324362+VitaliiSkuratovskyi@users.noreply.github.com> Date: Tue, 4 Aug 2026 10:57:36 +0300 Subject: [PATCH 09/10] Add embedded invite enhancements: roles, field invite state, delete endpoint (#2) --- .gitignore | 1 + client-lib/pom.xml | 2 +- .../com/signnow/library/dto/Document.java | 41 ++++++++++++++++++- .../signnow/library/facades/Documents.java | 2 + .../library/services/DocumentsService.java | 9 ++++ .../services/DocumentsServiceTest.java | 9 ++++ 6 files changed, 62 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index ef86395..0e743b2 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ dependency-reduced-pom.xml mem*.db README.html +/CLAUDE.md diff --git a/client-lib/pom.xml b/client-lib/pom.xml index 1528d0a..7525f2f 100644 --- a/client-lib/pom.xml +++ b/client-lib/pom.xml @@ -5,7 +5,7 @@ com.signnow api-client-lib - 1.0.6 + 1.0.7 jar diff --git a/client-lib/src/main/java/com/signnow/library/dto/Document.java b/client-lib/src/main/java/com/signnow/library/dto/Document.java index 780af8b..409b987 100644 --- a/client-lib/src/main/java/com/signnow/library/dto/Document.java +++ b/client-lib/src/main/java/com/signnow/library/dto/Document.java @@ -29,6 +29,7 @@ public class Document extends GenericId { public List requests; @JsonProperty("fields") public List fields; + public List roles; public static class SigningLinkRequest { @JsonProperty("document_id") @@ -225,6 +226,22 @@ public static class FieldInvite extends GenericId { public String status; public String email; public String role; + @JsonProperty("role_id") + public String roleId; + @JsonProperty("is_embedded") + public Boolean isEmbedded; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Role { + @JsonProperty("unique_id") + public String uniqueId; + /** + * SignNow returns this number as a string, same as {@link Document#pageCount} + */ + @JsonProperty("signing_order") + public String signingOrder; + public String name; } @JsonIgnoreProperties(ignoreUnknown = true) @@ -257,11 +274,33 @@ public static class EmbeddedInvite { public int order = 1; @JsonProperty("auth_method") public String authMethod = "none"; - + @JsonProperty("first_name") + public String firstName; + @JsonProperty("last_name") + public String lastName; + public String language; + + /** + * @param email signer email + * @param role role NAME (e.g. "Signer 1"), not the role id. To create an invite + * by role id use {@link #forRoleId(String, String)}. + */ public EmbeddedInvite(String email, String role) { this.email = email; this.role = role; } + + /** + * Creates an invite addressed by role id (the {@code unique_id} of a {@link Role}). + * + * @param email signer email + * @param roleId role id from {@link Document#roles} ({@link Role#uniqueId}) + */ + public static EmbeddedInvite forRoleId(String email, String roleId) { + EmbeddedInvite invite = new EmbeddedInvite(email, null); + invite.role_id = roleId; + return invite; + } } public static class EmbeddedSigningInviteResponse { diff --git a/client-lib/src/main/java/com/signnow/library/facades/Documents.java b/client-lib/src/main/java/com/signnow/library/facades/Documents.java index 3e2550c..b496375 100644 --- a/client-lib/src/main/java/com/signnow/library/facades/Documents.java +++ b/client-lib/src/main/java/com/signnow/library/facades/Documents.java @@ -26,6 +26,8 @@ public interface Documents { String getDocumentEmbeddedSignInviteLink(String documentId, String inviteId, Document.EmbeddedInviteLinkRequest request) throws SNException; + void deleteDocumentEmbeddedSignInvite(String documentId) throws SNException; + void updateDocumentFields(String documentId, List request) throws SNException; void prefillText(String documentId, List request) throws SNException; diff --git a/client-lib/src/main/java/com/signnow/library/services/DocumentsService.java b/client-lib/src/main/java/com/signnow/library/services/DocumentsService.java index e50b0a0..8465a2a 100644 --- a/client-lib/src/main/java/com/signnow/library/services/DocumentsService.java +++ b/client-lib/src/main/java/com/signnow/library/services/DocumentsService.java @@ -94,6 +94,15 @@ public String getDocumentEmbeddedSignInviteLink(String documentId, String invite return response.getLink(); } + @Override + public void deleteDocumentEmbeddedSignInvite(String documentId) throws SNException { + client.delete( + "/v2/documents/{document_id}/embedded-invites", + Collections.singletonMap("document_id", documentId), + String.class + ); + } + @Override public void prefillText(String documentId, List request) throws SNException { client.put( diff --git a/client-lib/src/test/java/com/signnow/library/services/DocumentsServiceTest.java b/client-lib/src/test/java/com/signnow/library/services/DocumentsServiceTest.java index 0ba6b08..5247fab 100644 --- a/client-lib/src/test/java/com/signnow/library/services/DocumentsServiceTest.java +++ b/client-lib/src/test/java/com/signnow/library/services/DocumentsServiceTest.java @@ -146,6 +146,15 @@ void deleteDocument() throws SNException { verify(clientMock, times(1)).delete(anyString(), anyMap(), any()); } + @Test + void deleteDocumentEmbeddedSignInvite() throws SNException { + when(clientMock.delete(anyString(), anyMap(), any())).thenReturn(null); + + service.deleteDocumentEmbeddedSignInvite("1"); + + verify(clientMock, times(1)).delete(anyString(), anyMap(), any()); + } + @Test void getDownloadLink() throws SNException { when(clientMock.post(anyString() From 62f6dfe5052dda6f4fb5f8ab336bb6471d078744 Mon Sep 17 00:00:00 2001 From: Vitalii Skuratovskyi <98324362+VitaliiSkuratovskyi@users.noreply.github.com> Date: Wed, 5 Aug 2026 16:13:04 +0300 Subject: [PATCH 10/10] feature/TECH-3959 Embedding Group Invites Additions (#3) --- client-lib/pom.xml | 2 +- .../signnow/library/dto/DocumentGroup.java | 145 ++++++++++++++++++ .../library/facades/DocumentGroups.java | 8 + .../services/DocumentGroupsService.java | 39 +++++ .../library/services/WebhookService.java | 1 + ...tGroupEmbeddedInviteSerializationTest.java | 110 +++++++++++++ .../services/DocumentGroupsServiceTest.java | 62 ++++++++ 7 files changed, 366 insertions(+), 1 deletion(-) create mode 100644 client-lib/src/test/java/com/signnow/library/dto/DocumentGroupEmbeddedInviteSerializationTest.java diff --git a/client-lib/pom.xml b/client-lib/pom.xml index 7525f2f..9fdb659 100644 --- a/client-lib/pom.xml +++ b/client-lib/pom.xml @@ -5,7 +5,7 @@ com.signnow api-client-lib - 1.0.7 + 1.0.8 jar diff --git a/client-lib/src/main/java/com/signnow/library/dto/DocumentGroup.java b/client-lib/src/main/java/com/signnow/library/dto/DocumentGroup.java index 33f4af0..e7a69e7 100644 --- a/client-lib/src/main/java/com/signnow/library/dto/DocumentGroup.java +++ b/client-lib/src/main/java/com/signnow/library/dto/DocumentGroup.java @@ -1,11 +1,15 @@ package com.signnow.library.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSetter; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; @JsonIgnoreProperties(ignoreUnknown = true) public class DocumentGroup extends GenericId { @@ -57,4 +61,145 @@ public static class DocumentGroupsListResponce { @JsonProperty("document_group_total_count") public Integer totalCount; } + + /*------------------------Embedded group invites------------------------*/ + + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class EmbeddedGroupInviteRequest { + public final List invites; + /** + * When true the signer gets one merged signing session for the whole group + */ + @JsonProperty("sign_as_merged") + public Boolean signAsMerged = Boolean.TRUE; + + public EmbeddedGroupInviteRequest(EmbeddedGroupInviteStep... steps) { + this.invites = new ArrayList<>(Arrays.asList(steps)); + } + } + + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class EmbeddedGroupInviteStep { + public final int order; + public final List signers; + + public EmbeddedGroupInviteStep(int order, EmbeddedGroupInviteSigner... signers) { + this.order = order; + this.signers = new ArrayList<>(Arrays.asList(signers)); + } + } + + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class EmbeddedGroupInviteSigner { + public String email; + @JsonProperty("auth_method") + public String authMethod = "none"; + @JsonProperty("first_name") + public String firstName; + @JsonProperty("last_name") + public String lastName; + public String language; + public final List documents; + + public EmbeddedGroupInviteSigner(String email, EmbeddedGroupInviteDocument... documents) { + this.email = email; + this.documents = new ArrayList<>(Arrays.asList(documents)); + } + } + + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class EmbeddedGroupInviteDocument { + public final String id; + public String action = "sign"; + public final String role; + + /** + * @param documentId id of a document belonging to the group + * @param role role NAME (e.g. "Signer 1", as listed in {@link DocumentInfo#roles}), + * NOT a role id — unlike the per-document embedded invite API + */ + public EmbeddedGroupInviteDocument(String documentId, String role) { + this.id = documentId; + this.role = role; + } + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class EmbeddedGroupInviteResponse { + public InviteData data; + + public String getId() { + return data != null ? data.id : null; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class InviteData { + public String id; + } + } + + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class EmbeddedGroupInviteLinkRequest { + /** + * Identifies the signer the link is minted for (unlike the per-document link + * mint, which addresses the signer in the URL) + */ + public String email; + @JsonProperty("auth_method") + public String authMethod = "none"; + @JsonProperty("link_expiration") + public Integer linkExpiration = 45; + + public EmbeddedGroupInviteLinkRequest(String email) { + this.email = email; + } + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class EmbeddedGroupInviteLinkResponse { + public Map data = new HashMap<>(); + + public String getLink() { + return data.get("link"); + } + } + + /*------------------------Document group info v2------------------------*/ + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class DocumentGroupV2Response { + public DocumentGroupV2Info data; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class DocumentGroupV2Info { + public String id; + public String name; + @JsonProperty("invite_id") + public String inviteId; + @JsonProperty("pending_step_id") + public String pendingStepId; + public String state; + @JsonProperty("last_invite_id") + public String lastInviteId; + public List documents = new ArrayList<>(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class DocumentGroupV2Document { + public String id; + public List roles = new ArrayList<>(); + @JsonProperty("document_name") + public String documentName; + @JsonProperty("field_invites") + public List fieldInvites = new ArrayList<>(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class DocumentGroupV2FieldInvite { + public String id; + public String status; + @JsonProperty("signer_email") + public String signerEmail; + } } diff --git a/client-lib/src/main/java/com/signnow/library/facades/DocumentGroups.java b/client-lib/src/main/java/com/signnow/library/facades/DocumentGroups.java index 5a2a35d..45280fb 100644 --- a/client-lib/src/main/java/com/signnow/library/facades/DocumentGroups.java +++ b/client-lib/src/main/java/com/signnow/library/facades/DocumentGroups.java @@ -21,4 +21,12 @@ public interface DocumentGroups { String createDocumentGroupInvite(String documentGroupId, GroupInvite groupInvite) throws SNException; void resendInvites(String documentGroupId, String inviteId, String email) throws SNException; + + DocumentGroup.EmbeddedGroupInviteResponse createDocumentGroupEmbeddedInvite(String documentGroupId, DocumentGroup.EmbeddedGroupInviteRequest request) throws SNException; + + String getDocumentGroupEmbeddedInviteLink(String documentGroupId, String embeddedInviteId, DocumentGroup.EmbeddedGroupInviteLinkRequest request) throws SNException; + + DocumentGroup.DocumentGroupV2Response getDocumentGroupV2(String documentGroupId) throws SNException; + + void deleteDocumentGroupEmbeddedInvite(String documentGroupId) throws SNException; } diff --git a/client-lib/src/main/java/com/signnow/library/services/DocumentGroupsService.java b/client-lib/src/main/java/com/signnow/library/services/DocumentGroupsService.java index 971c601..c50c71f 100644 --- a/client-lib/src/main/java/com/signnow/library/services/DocumentGroupsService.java +++ b/client-lib/src/main/java/com/signnow/library/services/DocumentGroupsService.java @@ -91,4 +91,43 @@ public void resendInvites(String documentGroupId, String inviteId, String email) GenericId.class ); } + + @Override + public DocumentGroup.EmbeddedGroupInviteResponse createDocumentGroupEmbeddedInvite(String documentGroupId, DocumentGroup.EmbeddedGroupInviteRequest request) throws SNException { + return client.post( + "/v2/document-groups/{document_group_id}/embedded-invites", + Collections.singletonMap("document_group_id", documentGroupId), + request, + DocumentGroup.EmbeddedGroupInviteResponse.class + ); + } + + @Override + public String getDocumentGroupEmbeddedInviteLink(String documentGroupId, String embeddedInviteId, DocumentGroup.EmbeddedGroupInviteLinkRequest request) throws SNException { + Map params = new HashMap<>(); + params.put("document_group_id", documentGroupId); + params.put("embedded_invite_id", embeddedInviteId); + DocumentGroup.EmbeddedGroupInviteLinkResponse response = client.post( + "/v2/document-groups/{document_group_id}/embedded-invites/{embedded_invite_id}/link", + params, request, DocumentGroup.EmbeddedGroupInviteLinkResponse.class); + return response.getLink(); + } + + @Override + public DocumentGroup.DocumentGroupV2Response getDocumentGroupV2(String documentGroupId) throws SNException { + return client.get( + "/v2/document-groups/{document_group_id}", + Collections.singletonMap("document_group_id", documentGroupId), + DocumentGroup.DocumentGroupV2Response.class + ); + } + + @Override + public void deleteDocumentGroupEmbeddedInvite(String documentGroupId) throws SNException { + client.delete( + "/v2/document-groups/{document_group_id}/embedded-invites", + Collections.singletonMap("document_group_id", documentGroupId), + String.class + ); + } } diff --git a/client-lib/src/main/java/com/signnow/library/services/WebhookService.java b/client-lib/src/main/java/com/signnow/library/services/WebhookService.java index 142bda8..4931ae2 100644 --- a/client-lib/src/main/java/com/signnow/library/services/WebhookService.java +++ b/client-lib/src/main/java/com/signnow/library/services/WebhookService.java @@ -9,6 +9,7 @@ import java.util.Map; public class WebhookService extends ApiService implements Webhooks { + public WebhookService(SNClient client) { super(client); } diff --git a/client-lib/src/test/java/com/signnow/library/dto/DocumentGroupEmbeddedInviteSerializationTest.java b/client-lib/src/test/java/com/signnow/library/dto/DocumentGroupEmbeddedInviteSerializationTest.java new file mode 100644 index 0000000..66e01e6 --- /dev/null +++ b/client-lib/src/test/java/com/signnow/library/dto/DocumentGroupEmbeddedInviteSerializationTest.java @@ -0,0 +1,110 @@ +package com.signnow.library.dto; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Wire-format tests for the embedded group invite DTOs: request bodies must carry + * the exact snake_case keys with nulls omitted, responses must tolerate unknown keys + * (the mapper below fails on unknown properties, like the client's Jackson provider). + */ +class DocumentGroupEmbeddedInviteSerializationTest { + private final ObjectMapper mapper = new ObjectMapper(); + + @Test + void createRequestSerializesExactKeys() throws Exception { + DocumentGroup.EmbeddedGroupInviteDocument document = + new DocumentGroup.EmbeddedGroupInviteDocument("doc123", "Signer 1"); + DocumentGroup.EmbeddedGroupInviteSigner signer = + new DocumentGroup.EmbeddedGroupInviteSigner("signer@example.com", document); + signer.firstName = "John"; + signer.lastName = "Doe"; + signer.language = "en"; + DocumentGroup.EmbeddedGroupInviteRequest request = new DocumentGroup.EmbeddedGroupInviteRequest( + new DocumentGroup.EmbeddedGroupInviteStep(1, signer)); + + JsonNode actual = mapper.readTree(mapper.writeValueAsString(request)); + JsonNode expected = mapper.readTree("{" + + "\"invites\":[{\"order\":1,\"signers\":[{" + + "\"email\":\"signer@example.com\",\"auth_method\":\"none\"," + + "\"first_name\":\"John\",\"last_name\":\"Doe\",\"language\":\"en\"," + + "\"documents\":[{\"id\":\"doc123\",\"action\":\"sign\",\"role\":\"Signer 1\"}]" + + "}]}]," + + "\"sign_as_merged\":true}"); + + assertEquals(expected, actual); + } + + @Test + void createRequestOmitsNullOptionalFields() throws Exception { + DocumentGroup.EmbeddedGroupInviteRequest request = new DocumentGroup.EmbeddedGroupInviteRequest( + new DocumentGroup.EmbeddedGroupInviteStep(1, + new DocumentGroup.EmbeddedGroupInviteSigner("signer@example.com", + new DocumentGroup.EmbeddedGroupInviteDocument("doc123", "Signer 1")))); + + JsonNode signer = mapper.readTree(mapper.writeValueAsString(request)) + .get("invites").get(0).get("signers").get(0); + + assertFalse(signer.has("first_name")); + assertFalse(signer.has("last_name")); + assertFalse(signer.has("language")); + } + + @Test + void linkRequestSerializesExactKeys() throws Exception { + DocumentGroup.EmbeddedGroupInviteLinkRequest request = + new DocumentGroup.EmbeddedGroupInviteLinkRequest("signer@example.com"); + + JsonNode actual = mapper.readTree(mapper.writeValueAsString(request)); + JsonNode expected = mapper.readTree( + "{\"email\":\"signer@example.com\",\"auth_method\":\"none\",\"link_expiration\":45}"); + + assertEquals(expected, actual); + } + + @Test + void createResponseToleratesUnknownKeys() throws Exception { + DocumentGroup.EmbeddedGroupInviteResponse response = mapper.readValue( + "{\"data\":{\"id\":\"invite123\",\"unexpected\":\"x\"},\"extra\":1}", + DocumentGroup.EmbeddedGroupInviteResponse.class); + + assertEquals("invite123", response.getId()); + } + + @Test + void linkResponseToleratesUnknownKeys() throws Exception { + DocumentGroup.EmbeddedGroupInviteLinkResponse response = mapper.readValue( + "{\"data\":{\"link\":\"https://example.com/sign\"},\"extra\":\"x\"}", + DocumentGroup.EmbeddedGroupInviteLinkResponse.class); + + assertEquals("https://example.com/sign", response.getLink()); + } + + @Test + void groupInfoV2ResponseToleratesUnknownKeys() throws Exception { + DocumentGroup.DocumentGroupV2Response response = mapper.readValue("{\"data\":{" + + "\"id\":\"group123\",\"name\":\"Bundle\",\"created\":1712233114," + + "\"invite_id\":null,\"pending_step_id\":\"step1\",\"state\":\"pending\"," + + "\"last_invite_id\":\"inv1\",\"folder_id\":\"f1\"," + + "\"documents\":[{\"id\":\"doc1\",\"roles\":[\"Signer 1\"]," + + "\"document_name\":\"Contract\",\"updated\":1712233114," + + "\"field_invites\":[{\"id\":\"fi1\",\"status\":\"pending\"," + + "\"signer_email\":\"signer@example.com\",\"created\":1712233114}]}]," + + "\"freeform_invite\":{\"id\":null,\"last_id\":null}}}", + DocumentGroup.DocumentGroupV2Response.class); + + assertEquals("group123", response.data.id); + assertNull(response.data.inviteId); + assertEquals("pending", response.data.state); + assertEquals("doc1", response.data.documents.get(0).id); + assertTrue(response.data.documents.get(0).roles.contains("Signer 1")); + assertEquals("pending", response.data.documents.get(0).fieldInvites.get(0).status); + assertEquals("signer@example.com", response.data.documents.get(0).fieldInvites.get(0).signerEmail); + } +} diff --git a/client-lib/src/test/java/com/signnow/library/services/DocumentGroupsServiceTest.java b/client-lib/src/test/java/com/signnow/library/services/DocumentGroupsServiceTest.java index ab4b9aa..4b8c9f0 100644 --- a/client-lib/src/test/java/com/signnow/library/services/DocumentGroupsServiceTest.java +++ b/client-lib/src/test/java/com/signnow/library/services/DocumentGroupsServiceTest.java @@ -118,6 +118,68 @@ void createDocumentGroupInvite() throws SNException { , eq(GenericId.class)); } + @Test + void createDocumentGroupEmbeddedInvite() throws SNException { + DocumentGroup.EmbeddedGroupInviteRequest requestMock = mock(DocumentGroup.EmbeddedGroupInviteRequest.class); + final String path = "/v2/document-groups/{document_group_id}/embedded-invites"; + when(clientMock.post(eq(path) + , anyMap() + , eq(requestMock) + , eq(DocumentGroup.EmbeddedGroupInviteResponse.class)) + ).thenReturn(new DocumentGroup.EmbeddedGroupInviteResponse()); + + service.createDocumentGroupEmbeddedInvite("1", requestMock); + + verify(clientMock, times(1)).post( + eq(path) + , anyMap() + , eq(requestMock) + , eq(DocumentGroup.EmbeddedGroupInviteResponse.class)); + } + + @Test + void getDocumentGroupEmbeddedInviteLink() throws SNException { + DocumentGroup.EmbeddedGroupInviteLinkRequest request = new DocumentGroup.EmbeddedGroupInviteLinkRequest("signer@example.com"); + DocumentGroup.EmbeddedGroupInviteLinkResponse response = new DocumentGroup.EmbeddedGroupInviteLinkResponse(); + response.data.put("link", "https://link"); + final String path = "/v2/document-groups/{document_group_id}/embedded-invites/{embedded_invite_id}/link"; + when(clientMock.post(eq(path) + , anyMap() + , eq(request) + , eq(DocumentGroup.EmbeddedGroupInviteLinkResponse.class)) + ).thenReturn(response); + + String link = service.getDocumentGroupEmbeddedInviteLink("1", "2", request); + + assertEquals("https://link", link); + verify(clientMock, times(1)).post( + eq(path) + , anyMap() + , eq(request) + , eq(DocumentGroup.EmbeddedGroupInviteLinkResponse.class)); + } + + @Test + void getDocumentGroupV2() throws SNException { + final String path = "/v2/document-groups/{document_group_id}"; + when(clientMock.get(eq(path), anyMap(), eq(DocumentGroup.DocumentGroupV2Response.class))) + .thenReturn(new DocumentGroup.DocumentGroupV2Response()); + + service.getDocumentGroupV2("1"); + + verify(clientMock, times(1)).get(eq(path), anyMap(), eq(DocumentGroup.DocumentGroupV2Response.class)); + } + + @Test + void deleteDocumentGroupEmbeddedInvite() throws SNException { + final String path = "/v2/document-groups/{document_group_id}/embedded-invites"; + when(clientMock.delete(eq(path), anyMap(), eq(String.class))).thenReturn("{}"); + + service.deleteDocumentGroupEmbeddedInvite("1"); + + verify(clientMock, times(1)).delete(eq(path), anyMap(), eq(String.class)); + } + @Test void resendInvites() throws SNException { final String path = "/documentgroup/{documentGroupId}/groupinvite/{inviteId}/resendinvites";