Skip to content

Commit c4bea36

Browse files
authored
Merge pull request #12 from signnow/v3.5.2
Release v3.5.2
2 parents cae3199 + c613d6e commit c4bea36

69 files changed

Lines changed: 2237 additions & 357 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ SIGNNOW_API_HOST=https://api.signnow.com
77
SIGNNOW_API_BASIC_TOKEN=c2lnbk5vdyBBUEkgc2FtcGxlIEFwcCB2MS4wCg==
88
SIGNNOW_API_USERNAME=user@signnow.com
99
SIGNNOW_API_PASSWORD=coolest_pazzw0rd
10+
SIGNNOW_API_TIMEOUT=30
1011

1112
# Absolute or relative (starts with .) path to the directory
1213
# where the downloaded files will be stored (make sure you have write permissions to this directory)

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,5 @@
77
.env.backup
88
.env.production
99
.env.development
10+
examples/signnow-example.properties
11+
examples/files/bulk_real.csv

Makefile

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.PHONY: mock-up mock-stop mock-restart test tests
1+
.PHONY: mock-up mock-stop mock-restart test tests example examples
22

33
.SILENT: ; # no need for @
44
.ONESHELL: ; # recipes execute in same shell
@@ -34,3 +34,15 @@ test:
3434
# Run all the tests
3535
tests:
3636
mvn test
37+
38+
# Run an example from examples/ directory
39+
# Examples:
40+
# make example E=DocumentGetExample
41+
# make examples
42+
example:
43+
@if [ -z "$(E)" ]; then echo "Usage: make example E=ExampleClassName"; exit 1; fi
44+
./examples/bin/run $(E)
45+
46+
# Run all examples
47+
examples:
48+
./examples/bin/run all

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# signNow API Java SDK
2-
## v3.5.1
2+
## v3.5.2
33

44
[![Java Version](https://img.shields.io/badge/codebase-java--11-yellowgreen)](https://www.java.com/)
55

examples/AuthCheckExample.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,10 @@
66

77
public class AuthCheckExample {
88
public static void main(String[] args) {
9-
10-
// Set your actual input data here
11-
// Note: following values are dummy, just for example
12-
//----------------------------------------------------
13-
// if it is empty or null, a new Bearer token will be created automatically
14-
String bearerToken = "";
15-
9+
// Fill in your actual data in examples/signnow-example.properties before running
10+
//---------------------------------------------------
11+
SignNowExampleData data = new SignNowExampleData();
12+
String bearerToken = data.getBearerToken();
1613
try {
1714
ApiClient client = SdkFactory.createApiClientWithBearerToken(bearerToken);
1815
TokenGetResponse response = (TokenGetResponse) client.send(new TokenGetRequest()).getResponse();

examples/BulkInviteExample.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,29 @@
77

88
public class BulkInviteExample {
99
public static void main(String[] args) {
10+
// Fill in your actual data in examples/signnow-example.properties before running
1011

11-
// Set your actual input data here
12-
// Note: following values are dummy, just for example
1312
// Details: https://docs.signnow.com/docs/signnow/template/operations/create-a-template-bulkinvite
1413
//----------------------------------------------------
15-
// if it is empty or null, a new Bearer token will be created automatically
16-
String bearerToken = "";
14+
SignNowExampleData data = new SignNowExampleData();
15+
String bearerToken = data.getBearerToken();
1716
// CSV file containing information for each invite in the bulk
1817
// Example: Signer 1|user@signnow.com,Contract_0_Jack
1918
// "Signer 1" - signing role, must present in the template
2019
// "user@signnow.com" - signer email related for the signing role
2120
// "Contract_0_Jack" - contains 3 parts: "Contract" - document name, 0 - line/invite number,
2221
// "Jack" - signer name
23-
String csvFilePath = "/your/path/to/data.csv";
22+
String csvFilePath = data.getBulkInviteCsvFilePath();
2423
// The template from which a new document will be cloned for each invite in the bulk.
2524
// The template must have at least one field assigned the same signing role that exists in your csv file
2625
// (i.e. "Signer 1")
2726
// Look at TemplateExample.java to find out how to create a template.
2827
// Look at FieldInviteExample.java to find out how to add a field to document or template.
29-
String templateId = "e2e913db4ba9815a31c8a28a196b7df96fe1cc46";
28+
String templateId = data.getBulkInviteTemplateId();
3029
// The folder to store documents cloned from the template.
31-
String folderId = "3073f8da73b9a5328f95ccc55a912e3f46da2d94";
30+
String folderId = data.getBulkInviteFolderId();
3231
String documentNameClonedFromTemplate = "test_bulk_invite";
32+
// Set your actual input data here, or use these as examples
3333
String bulkInviteSubject = "email subject for all signers from CSV";
3434
String bulkInviteMessage = "email message for all signers from CSV";
3535

examples/DocumentGetExample.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,11 @@
66

77
public class DocumentGetExample {
88
public static void main(String[] args) {
9-
10-
// Set your actual input data here
11-
// Note: following values are dummy, just for example
9+
// Fill in your actual data in examples/signnow-example.properties before running
1210
//----------------------------------------------------
13-
// if it is not specified here, a new Bearer token will be created automatically
14-
String bearerToken = "";
15-
String documentId = "05fbed799231d85cf3471121ecd6a4221f9c5610";
11+
SignNowExampleData data = new SignNowExampleData();
12+
String bearerToken = data.getBearerToken();
13+
String documentId = data.getDocumentId();
1614

1715
try {
1816
ApiClient client = SdkFactory.createApiClientWithBearerToken(bearerToken);
@@ -22,6 +20,19 @@ public static void main(String[] args) {
2220
System.out.println("Document ID: " + response.getId());
2321
System.out.println("Document Name: " + response.getDocumentName());
2422
System.out.println("Document Owner: " + response.getUserId());
23+
24+
// These fields are available when using ?include=field_invites query parameter
25+
if (response.getGeneralExpirationDays() != null) {
26+
System.out.println("General Expiration Days: " + response.getGeneralExpirationDays());
27+
}
28+
if (response.getGeneralReminder() != null) {
29+
System.out.println("General Reminder - After: " + response.getGeneralReminder().getRemindAfter()
30+
+ ", Before: " + response.getGeneralReminder().getRemindBefore()
31+
+ ", Repeat: " + response.getGeneralReminder().getRemindRepeat());
32+
}
33+
if (response.getOrderType() != null) {
34+
System.out.println("Order Type: " + response.getOrderType());
35+
}
2536
} catch (SignNowApiException e) {
2637
System.out.println("ERROR: " + e.getMessage());
2738
}

examples/DocumentGroupInviteExample.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,17 @@
1919

2020
public class DocumentGroupInviteExample {
2121
public static void main(String[] args) {
22-
23-
// Set your actual input data here
24-
// Note: following values are dummy, just for example
22+
// Fill in your actual data in examples/signnow-example.properties before running
2523
//----------------------------------------------------
26-
// if it is not specified here, a new Bearer token will be created automatically
27-
String bearerToken = "";
24+
SignNowExampleData data = new SignNowExampleData();
25+
String bearerToken = data.getBearerToken();
26+
String pathToDocument = data.getPathToDocument();
27+
String signerRole = data.getDocumentGroupInviteSignerRole();
28+
String signerEmail = data.getDocumentGroupInviteSignerEmail();
29+
// Set your actual input data here, or use these as examples
2830
String groupName = "Test Document Group";
29-
String signerRole = "Signer";
30-
String signerEmail = "signer@signnow.com";
3131
String subject = "Please sign these documents";
3232
String message = "Hello, please sign these documents";
33-
String pathToDocument = "/your/path/to/document.pdf";
3433

3534
try {
3635
ApiClient client = SdkFactory.createApiClientWithBearerToken(bearerToken);
@@ -103,6 +102,18 @@ public static void main(String[] args) {
103102
GroupInvitePostResponse inviteResponse = (GroupInvitePostResponse) client.send(inviteRequest).getResponse();
104103

105104
System.out.println("Document Group: " + docGroupResponse.getId());
105+
// These fields are available when using ?include=reminder query parameter
106+
if (docGroupResponse.getGeneralExpirationDays() != null) {
107+
System.out.println("General Expiration Days: " + docGroupResponse.getGeneralExpirationDays());
108+
}
109+
if (docGroupResponse.getGeneralReminder() != null) {
110+
System.out.println("General Reminder - After: " + docGroupResponse.getGeneralReminder().getRemindAfter()
111+
+ ", Before: " + docGroupResponse.getGeneralReminder().getRemindBefore()
112+
+ ", Repeat: " + docGroupResponse.getGeneralReminder().getRemindRepeat());
113+
}
114+
if (docGroupResponse.getOrderType() != null) {
115+
System.out.println("Order Type: " + docGroupResponse.getOrderType());
116+
}
106117
System.out.println("Document Group invite: " + inviteResponse.getId());
107118
} catch (SignNowApiException e) {
108119
System.out.println("ERROR: " + e.getMessage());
Lines changed: 122 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,152 @@
1-
import com.fasterxml.jackson.core.JsonProcessingException;
2-
import com.fasterxml.jackson.databind.ObjectMapper;
1+
import com.signnow.api.document.request.DocumentPostRequest;
2+
import com.signnow.api.document.request.DocumentPutRequest;
3+
import com.signnow.api.document.request.data.Field;
4+
import com.signnow.api.document.request.data.FieldCollection;
5+
import com.signnow.api.document.response.DocumentPostResponse;
6+
import com.signnow.api.documentgroup.request.DocumentGroupGetRequest;
7+
import com.signnow.api.documentgroup.request.DocumentGroupPostRequest;
8+
import com.signnow.api.documentgroup.request.data.DocumentIdCollection;
9+
import com.signnow.api.documentgroup.response.DocumentGroupGetResponse;
10+
import com.signnow.api.documentgroup.response.DocumentGroupPostResponse;
311
import com.signnow.api.documentgroup.request.DocumentGroupRecipientsGetRequest;
412
import com.signnow.api.documentgroup.request.DocumentGroupRecipientsPutRequest;
513
import com.signnow.api.documentgroup.request.data.CcCollection;
14+
import com.signnow.api.documentgroup.request.data.GeneralReminder;
15+
import com.signnow.api.documentgroup.request.data.recipient.Attribute;
16+
import com.signnow.api.documentgroup.request.data.recipient.Document;
17+
import com.signnow.api.documentgroup.request.data.recipient.DocumentCollection;
618
import com.signnow.api.documentgroup.request.data.recipient.Recipient;
719
import com.signnow.api.documentgroup.request.data.recipient.RecipientCollection;
820
import com.signnow.api.documentgroup.response.DocumentGroupRecipientsGetResponse;
921
import com.signnow.api.documentgroup.response.DocumentGroupRecipientsPutResponse;
1022
import com.signnow.core.ApiClient;
1123
import com.signnow.core.exception.SignNowApiException;
1224
import com.signnow.core.factory.SdkFactory;
25+
import java.io.File;
1326

1427
public class DocumentGroupRecipientsExample {
1528
public static void main(String[] args) {
16-
// Set your actual input data here
17-
// Note: following values are dummy, just for example
18-
// ----------------------------------------------------
19-
// if it is not specified here, a new Bearer token will be created automatically
20-
String bearerToken = "";
21-
String documentGroupId = "5d66ca4accdd4ab28f8b2c71001093b5cb3bcb8a";
29+
// Fill in your actual data in examples/signnow-example.properties before running
30+
SignNowExampleData data = new SignNowExampleData();
31+
String bearerToken = data.getBearerToken();
32+
String pathToDocument = data.getPathToDocument();
33+
String firstRecipientRole = data.getFirstRecipientRole();
34+
String secondRecipientRole = data.getSecondRecipientRole();
35+
String signAction = data.getSignAction();
36+
String viewAction = data.getViewAction();
37+
// Set your actual input data here, or use these as examples
38+
String groupName = "Test Document Group Recipients Example";
39+
String recipientOrder = "recipient_order"; // at_the_same_time, recipient_order, advanced_order
40+
int expirationDays = 31;
2241

2342
try {
2443
ApiClient client = SdkFactory.createApiClientWithBearerToken(bearerToken);
2544

26-
// Get recipient
27-
DocumentGroupRecipientsGetRequest request = new DocumentGroupRecipientsGetRequest()
28-
.withDocumentGroupId(documentGroupId);
29-
DocumentGroupRecipientsGetResponse response = (DocumentGroupRecipientsGetResponse) client.send(request)
30-
.getResponse();
45+
// Precondition:
46+
// the document group contains 2 documents both with a field assigned a signer role
47+
//----------------------------------------------------
48+
// Step 1: Upload two documents to become a document group
49+
DocumentPostRequest request = new DocumentPostRequest(new File(pathToDocument));
50+
DocumentPostResponse response = (DocumentPostResponse) client.send(request).getResponse();
51+
String documentId1 = response.getId();
52+
// Step 2: Add fields with roles to the 1st document
53+
FieldCollection fields = new FieldCollection();
54+
fields.add(
55+
new Field(205, 18, 122, 12, "text", 0, true, firstRecipientRole, "text_field1", "Reason to sign"));
56+
DocumentPutRequest putRequest1 = new DocumentPutRequest(fields);
57+
putRequest1.withDocumentId(documentId1);
58+
client.send(putRequest1);
59+
// Step 3: Upload 2nd document
60+
DocumentPostRequest request2 = new DocumentPostRequest(new File(pathToDocument));
61+
DocumentPostResponse response2 = (DocumentPostResponse) client.send(request2).getResponse();
62+
String documentId2 = response2.getId();
63+
// Step 4: Add fields and roles to the 2nd document
64+
FieldCollection fields2 = new FieldCollection();
65+
fields2.add(
66+
new Field(220, 24, 142, 14, "text", 0, true, secondRecipientRole, "text_field2", "My reason"));
67+
DocumentPutRequest putRequest2 = new DocumentPutRequest(fields2);
68+
putRequest2.withDocumentId(documentId2);
69+
client.send(putRequest2);
70+
// Step 5: Create document group
71+
DocumentIdCollection documentIds = new DocumentIdCollection();
72+
documentIds.add(documentId1);
73+
documentIds.add(documentId2);
74+
DocumentGroupPostRequest groupRequest = new DocumentGroupPostRequest(documentIds, groupName);
75+
DocumentGroupPostResponse groupResponse =
76+
(DocumentGroupPostResponse) client.send(groupRequest).getResponse();
77+
String documentGroupId = groupResponse.getId();
3178

32-
// Convert to request model and replace email
33-
RecipientCollection recipientCollection = new RecipientCollection();
34-
for (com.signnow.api.documentgroup.response.data.data.Recipient responseRecipient : response.getData()
35-
.getRecipients()) {
36-
Recipient reqRecipient = convertRecipient(responseRecipient);
37-
if (reqRecipient == null) continue;
38-
39-
System.out.println("Original name: " + responseRecipient.getName());
40-
System.out.println("Original email: " + responseRecipient.getEmail());
79+
// PUT /v2/document-groups/{document_group_id}/recipients
80+
DocumentCollection docs1 = new DocumentCollection();
81+
// Signer recipient: should review and sign the document
82+
docs1.add(new Document(documentId1, firstRecipientRole, signAction));
83+
Attribute signerAttribute = Attribute.signer(false, true, false, "Please sign", "Signing request", null, null, null);
84+
Recipient recipient1 = new Recipient("John Doe", "john.doe@example.com", 1, docs1, null, signerAttribute);
4185

42-
if (reqRecipient.getName().equals("Recipient 1")) {
43-
// Replace email
44-
Recipient updated = new Recipient(
45-
reqRecipient.getName(),
46-
"new.email@example.com",
47-
reqRecipient.getOrder(),
48-
reqRecipient.getDocuments(),
49-
reqRecipient.getEmailGroup(),
50-
reqRecipient.getAttributes());
51-
recipientCollection.add(updated);
52-
} else {
53-
recipientCollection.add(reqRecipient);
54-
}
55-
}
86+
DocumentCollection docs2 = new DocumentCollection();
87+
// Viewer recipient: no signature, only view the document
88+
docs2.add(new Document(documentId2, secondRecipientRole, viewAction));
89+
Attribute viewerAttribute = Attribute.viewer("Please review", "Document review", false, null, null, null, null);
90+
Recipient recipient2 = new Recipient("Jane Smith", "jane.smith@example.com", 2, docs2, null, viewerAttribute);
91+
92+
RecipientCollection recipients = new RecipientCollection();
93+
recipients.add(recipient1);
94+
recipients.add(recipient2);
95+
96+
GeneralReminder generalReminder = new GeneralReminder(1, 5, 3);
5697

57-
// Send PUT request
5898
DocumentGroupRecipientsPutRequest putRequest = new DocumentGroupRecipientsPutRequest(
59-
recipientCollection,
60-
new CcCollection()).withDocumentGroupId(documentGroupId);
99+
recipients,
100+
new CcCollection(),
101+
expirationDays,
102+
generalReminder,
103+
recipientOrder
104+
).withDocumentGroupId(documentGroupId);
61105

62106
DocumentGroupRecipientsPutResponse putResponse = (DocumentGroupRecipientsPutResponse) client.send(putRequest)
63107
.getResponse();
64-
System.out.println("Updated email: " + putResponse.getData().getRecipients().get(0).getEmail());
108+
System.out.println("==== PUT ====");
109+
System.out.println("Updated recipients:");
110+
putResponse.getData().getRecipients().forEach(r -> {
111+
System.out.println(" Name: " + r.getName() + ", Email: " + r.getEmail());
112+
});
113+
if (putResponse.getData().getGeneralExpirationDays() != null) {
114+
System.out.println("General Expiration Days: " + putResponse.getData().getGeneralExpirationDays());
115+
}
116+
if (putResponse.getData().getGeneralReminder() != null) {
117+
com.signnow.api.documentgroup.response.data.data.GeneralReminder responseReminder = putResponse.getData().getGeneralReminder();
118+
System.out.println("General Reminder - After: " + responseReminder.getRemindAfter()
119+
+ ", Before: " + responseReminder.getRemindBefore()
120+
+ ", Repeat: " + responseReminder.getRemindRepeat());
121+
}
122+
if (putResponse.getData().getOrderType() != null) {
123+
System.out.println("Order Type: " + putResponse.getData().getOrderType());
124+
}
65125

126+
// GET /v2/document-groups/{document_group_id}/recipients
127+
System.out.println("==== GET ====");
128+
DocumentGroupRecipientsGetRequest getRequest = new DocumentGroupRecipientsGetRequest()
129+
.withDocumentGroupId(documentGroupId);
130+
DocumentGroupRecipientsGetResponse getResponse = (DocumentGroupRecipientsGetResponse) client.send(getRequest)
131+
.getResponse();
132+
System.out.println("Recipients:");
133+
getResponse.getData().getRecipients().forEach(r -> {
134+
System.out.println(" Name: " + r.getName() + ", Email: " + r.getEmail());
135+
});
136+
if (getResponse.getData().getGeneralExpirationDays() != null) {
137+
System.out.println("General Expiration Days: " + getResponse.getData().getGeneralExpirationDays());
138+
}
139+
if (getResponse.getData().getGeneralReminder() != null) {
140+
com.signnow.api.documentgroup.response.data.data.GeneralReminder responseReminder = getResponse.getData().getGeneralReminder();
141+
System.out.println("General Reminder - After: " + responseReminder.getRemindAfter()
142+
+ ", Before: " + responseReminder.getRemindBefore()
143+
+ ", Repeat: " + responseReminder.getRemindRepeat());
144+
}
145+
if (getResponse.getData().getOrderType() != null) {
146+
System.out.println("Order Type: " + getResponse.getData().getOrderType());
147+
}
66148
} catch (SignNowApiException e) {
67149
System.out.println("ERROR: " + e.getMessage());
68150
}
69151
}
70-
71-
private static Recipient convertRecipient(
72-
com.signnow.api.documentgroup.response.data.data.Recipient responseRecipient) {
73-
ObjectMapper mapper = new ObjectMapper();
74-
try {
75-
String json = mapper.writeValueAsString(responseRecipient);
76-
Recipient recipient = mapper.readValue(json, Recipient.class);
77-
78-
return new Recipient(
79-
recipient.getName(),
80-
recipient.getEmail(),
81-
recipient.getOrder(),
82-
recipient.getDocuments(),
83-
recipient.getEmailGroup(),
84-
recipient.getAttributes());
85-
86-
} catch (JsonProcessingException e) {
87-
e.printStackTrace();
88-
return null;
89-
}
90-
}
91152
}

0 commit comments

Comments
 (0)