From 0351a323c4d5e618d3ca5cb15015cb2ec938ce02 Mon Sep 17 00:00:00 2001 From: Vitalii Skuratovskyi Date: Mon, 3 Aug 2026 20:13:06 +0300 Subject: [PATCH] Add embedded invite enhancements: roles, field invite state, delete endpoint --- .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()