Skip to content

Commit bff52c0

Browse files
committed
added web forms code example
1 parent c4efde4 commit bff52c0

File tree

15 files changed

+1087
-5
lines changed

15 files changed

+1087
-5
lines changed

pom.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@
3131
<click.version> 1.4.0</click.version>
3232
<monitor.version>1.3.0</monitor.version>
3333
<admin.version>1.3.0</admin.version>
34+
<webforms.version>1.0.2-RC11</webforms.version>
3435
<swagger-core-version>2.2.8</swagger-core-version>
3536
<jackson-version>2.14.2</jackson-version>
3637
<jersey2.version>3.0.9</jersey2.version>
3738
</properties>
3839

39-
4040
<dependencies>
4141
<dependency>
4242
<groupId>org.springframework.boot</groupId>
@@ -182,6 +182,12 @@
182182
<classifier>shaded</classifier>
183183
</dependency>
184184

185+
<dependency>
186+
<groupId>com.docusign</groupId>
187+
<artifactId>docusign-webforms-java</artifactId>
188+
<version>${webforms.version}</version>
189+
</dependency>
190+
185191
<dependency>
186192
<groupId>org.springframework.boot</groupId>
187193
<artifactId>spring-boot-autoconfigure</artifactId>

src/main/java/com/docusign/DSConfiguration.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ public class DSConfiguration {
103103
@Value("${DS_ADMIN_BASE_PATH}")
104104
private String adminBasePath;
105105

106+
@Value("${DS_WEBFORMS_BASE_PATH}")
107+
private String webFormsBasePath;
108+
106109
@Value("${CodeExamplesManifest}")
107110
private String codeExamplesManifest;
108111

src/main/java/com/docusign/common/ApiIndex.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ public enum ApiIndex {
66
CLICK("/pages/click/index", "/clickapi", "/c001", "/c"),
77
MONITOR("/pages/monitor/index", "", "/m001", "/m"),
88
ADMIN("/pages/admin/index", "/management", "/a001", "/a"),
9-
CONNECT("/pages/connect/index", "", "/con001", "/con");
9+
CONNECT("/pages/connect/index", "", "/con001", "/con"),
10+
WEBFORMS("/pages/webforms/index", "/restapi", "/web001", "/web");
1011
private final String indexPath;
1112

1213
private final String baseUrlSuffix;
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.docusign.controller.webForms.examples;
2+
3+
import com.docusign.DSConfiguration;
4+
import com.docusign.core.controller.AbstractController;
5+
import com.docusign.core.model.Session;
6+
import com.docusign.core.model.User;
7+
import com.docusign.esign.client.ApiClient;
8+
import com.docusign.esign.client.auth.OAuth;
9+
import org.springframework.http.HttpHeaders;
10+
import org.springframework.stereotype.Controller;
11+
12+
/**
13+
* Abstract base class for all controllers.
14+
*/
15+
@Controller
16+
public abstract class AbstractWebFormsController extends AbstractController {
17+
18+
private static final String EXAMPLE_PAGES_PATH = "pages/webforms/examples/";
19+
20+
protected Session session;
21+
22+
protected User user;
23+
24+
public AbstractWebFormsController(DSConfiguration config, String exampleName) {
25+
super(config, exampleName);
26+
}
27+
28+
/**
29+
* Creates new instance of the Rooms API client.
30+
*
31+
* @param basePath URL to eSignature REST API
32+
* @param userAccessToken user's access token
33+
* @return an instance of the {@link ApiClient}
34+
*/
35+
36+
protected static ApiClient createESignApiClient(String basePath, String userAccessToken) {
37+
ApiClient apiClient = new ApiClient(basePath);
38+
apiClient.addDefaultHeader(HttpHeaders.AUTHORIZATION, BEARER_AUTHENTICATION + userAccessToken);
39+
apiClient.addAuthorization("docusignAccessCode", new OAuth());
40+
return apiClient;
41+
}
42+
43+
protected static com.docusign.webforms.client.ApiClient createWebFormsApiClient(
44+
String basePath,
45+
String userAccessToken
46+
) {
47+
com.docusign.webforms.client.ApiClient apiClient = new com.docusign.webforms.client.ApiClient(basePath);
48+
apiClient.addDefaultHeader(HttpHeaders.AUTHORIZATION, BEARER_AUTHENTICATION + userAccessToken);
49+
apiClient.addAuthorization("docusignAccessCode", new com.docusign.webforms.client.auth.OAuth());
50+
return apiClient;
51+
}
52+
53+
protected String getExamplePagesPath() {
54+
return AbstractWebFormsController.EXAMPLE_PAGES_PATH;
55+
}
56+
}
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package com.docusign.controller.webForms.examples;
2+
3+
import java.io.IOException;
4+
5+
import javax.servlet.http.HttpServletResponse;
6+
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.stereotype.Controller;
9+
import org.springframework.ui.ModelMap;
10+
import org.springframework.web.bind.annotation.RequestMapping;
11+
import org.springframework.web.servlet.view.RedirectView;
12+
13+
import com.docusign.DSConfiguration;
14+
import com.docusign.common.WorkArguments;
15+
import com.docusign.controller.eSignature.services.CreateTemplateService;
16+
import com.docusign.controller.webForms.services.CreateAndEmbedFormService;
17+
import com.docusign.core.model.Session;
18+
import com.docusign.core.model.User;
19+
import com.docusign.esign.client.ApiClient;
20+
import com.docusign.esign.client.ApiException;
21+
import com.docusign.esign.model.EnvelopeTemplate;
22+
import com.docusign.esign.model.EnvelopeTemplateResults;
23+
import com.docusign.esign.model.TemplateSummary;
24+
import com.docusign.webforms.model.WebFormInstance;
25+
import com.docusign.webforms.model.WebFormSummaryList;
26+
27+
@Controller
28+
@RequestMapping("/web001")
29+
public class WEB001ControllerCreateAndEmbedForm extends AbstractWebFormsController {
30+
31+
private static final String TEMPLATE_ID = "templateId";
32+
33+
private static final String TEMPLATE_NAME = "Web Form Example Template";
34+
35+
private static final String DOCUMENT_FILE_NAME = "World_Wide_Corp_Web_Form.pdf";
36+
37+
private static final String WEB_FORM_CONFIG = "web-form-config.json";
38+
39+
public static final String EMBED = "pages/webforms/examples/embed";
40+
41+
public static final String INSTANCE_TOKEN = "instanceToken";
42+
43+
public static final String URL = "url";
44+
45+
public static final String INTEGRATION_KEY = "integrationKey";
46+
47+
@Autowired
48+
public WEB001ControllerCreateAndEmbedForm(DSConfiguration config, Session session, User user) {
49+
super(config, "web001");
50+
this.session = session;
51+
this.user = user;
52+
}
53+
54+
@Override
55+
protected void onInitModel(WorkArguments args, ModelMap model) throws Exception {
56+
super.onInitModel(args, model);
57+
model.addAttribute(TEMPLATE_ID, session.getTemplateId());
58+
}
59+
60+
@Override
61+
protected Object doWork(
62+
WorkArguments args,
63+
ModelMap model,
64+
HttpServletResponse response
65+
) throws ApiException, IOException, com.docusign.webforms.client.ApiException {
66+
if (session.getTemplateId() == null) {
67+
ApiClient eSignApiClient = createESignApiClient(session.getBasePath(), user.getAccessToken());
68+
String accountId = session.getAccountId();
69+
70+
EnvelopeTemplateResults envelopeTemplateResults = CreateTemplateService.searchTemplatesByName(
71+
eSignApiClient,
72+
accountId,
73+
TEMPLATE_NAME);
74+
75+
if (Integer.parseInt(envelopeTemplateResults.getResultSetSize()) > 0) {
76+
EnvelopeTemplate template = envelopeTemplateResults.getEnvelopeTemplates().get(0);
77+
session.setTemplateId(template.getTemplateId());
78+
} else {
79+
session.setTemplateName(TEMPLATE_NAME);
80+
81+
TemplateSummary template = CreateTemplateService.createTemplate(
82+
eSignApiClient,
83+
accountId,
84+
CreateAndEmbedFormService.prepareEnvelopeTemplate(TEMPLATE_NAME, DOCUMENT_FILE_NAME)
85+
);
86+
87+
session.setTemplateId(template.getTemplateId());
88+
}
89+
90+
model.addAttribute(TEMPLATE_ID, session.getTemplateId());
91+
CreateAndEmbedFormService.addTemplateIdToForm(WEB_FORM_CONFIG, session.getTemplateId());
92+
93+
return new RedirectView("web001");
94+
}
95+
96+
var webFormsApiClient = createWebFormsApiClient(
97+
config.getWebFormsBasePath(),
98+
user.getAccessToken()
99+
);
100+
101+
WebFormSummaryList forms = CreateAndEmbedFormService.getForms(
102+
webFormsApiClient,
103+
session.getAccountId(),
104+
TEMPLATE_NAME
105+
);
106+
107+
if (forms.getItems() == null || forms.getItems().size() == 0) {
108+
return new RedirectView("web001");
109+
}
110+
111+
String formId = forms.getItems().get(0).getId();
112+
113+
WebFormInstance form = CreateAndEmbedFormService.createInstance(
114+
webFormsApiClient,
115+
session.getAccountId(),
116+
formId
117+
);
118+
119+
model.addAttribute(LAUNCHER_TEXTS, config.getCodeExamplesText().SupportingTexts);
120+
model.addAttribute(INSTANCE_TOKEN, form.getInstanceToken());
121+
model.addAttribute(URL, form.getFormUrl());
122+
model.addAttribute(INTEGRATION_KEY, config.getUserId());
123+
124+
return EMBED;
125+
}
126+
}
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
package com.docusign.controller.webForms.services;
2+
3+
import com.docusign.controller.eSignature.examples.EnvelopeHelpers;
4+
import com.docusign.esign.model.*;
5+
import com.docusign.webforms.api.FormInstanceManagementApi;
6+
import com.docusign.webforms.api.FormManagementApi;
7+
import com.docusign.webforms.client.ApiClient;
8+
import com.docusign.webforms.client.ApiException;
9+
import com.docusign.webforms.model.CreateInstanceRequestBody;
10+
import com.docusign.webforms.model.WebFormInstance;
11+
import com.docusign.webforms.model.WebFormSummaryList;
12+
import com.docusign.webforms.model.WebFormValues;
13+
import org.apache.commons.lang3.StringUtils;
14+
15+
import java.io.IOException;
16+
import java.net.URISyntaxException;
17+
import java.nio.file.Files;
18+
import java.nio.file.Paths;
19+
import java.util.List;
20+
import java.util.Map;
21+
import java.util.Objects;
22+
23+
public final class CreateAndEmbedFormService {
24+
public static WebFormSummaryList getForms(
25+
ApiClient apiClient,
26+
String userAccessToken,
27+
String search
28+
) throws ApiException {
29+
FormManagementApi formManagementApi = new FormManagementApi(apiClient);
30+
var option = formManagementApi.new ListFormsOptions();
31+
option.setSearch(search);
32+
33+
return formManagementApi.listForms(userAccessToken, option);
34+
}
35+
36+
public static void addTemplateIdToForm(String fileName, String templateId) {
37+
String targetString = "template-id";
38+
39+
try {
40+
ClassLoader rawPath = Thread.currentThread().getContextClassLoader();
41+
String rootDir = Paths.get(Objects.requireNonNull(rawPath.getResource("")).toURI()).toString();
42+
rootDir = StringUtils.remove(rootDir, "target\\classes");
43+
rootDir = StringUtils.remove(rootDir, "file:/");
44+
rootDir = StringUtils.replace(rootDir, "\\", "/");
45+
46+
String saveFilePath = rootDir + "src/main/resources/" + fileName;
47+
48+
String fileContent = new String(Files.readAllBytes(Paths.get(saveFilePath)));
49+
String modifiedContent = fileContent.replace(targetString, templateId);
50+
51+
Files.write(Paths.get(saveFilePath), modifiedContent.getBytes());
52+
} catch (IOException | URISyntaxException ex) {
53+
System.out.println("An error occurred: " + ex.getMessage());
54+
}
55+
}
56+
57+
public static WebFormInstance createInstance(
58+
ApiClient apiClient,
59+
String accountId,
60+
String formId
61+
) throws ApiException {
62+
String clientUserId = "1234-5678-abcd-ijkl";
63+
64+
FormInstanceManagementApi formManagementApi = new FormInstanceManagementApi(apiClient);
65+
WebFormValues formValues = new WebFormValues();
66+
67+
formValues.putAll(Map.of(
68+
"PhoneNumber", "555-555-5555",
69+
"Yes", new String[]{ "Yes" },
70+
"Company", "Tally",
71+
"JobTitle", "Programmer Writer"
72+
));
73+
74+
CreateInstanceRequestBody options = new CreateInstanceRequestBody()
75+
.clientUserId(clientUserId)
76+
.formValues(formValues)
77+
.expirationOffset(3600);
78+
79+
return formManagementApi.createInstance(accountId, formId, options);
80+
}
81+
82+
public static EnvelopeTemplate prepareEnvelopeTemplate(String templateName, String documentPdf) throws IOException {
83+
Document document = EnvelopeHelpers.createDocumentFromFile(
84+
documentPdf,
85+
"World_Wide_Web_Form",
86+
"1"
87+
);
88+
89+
Signer signer = new Signer()
90+
.roleName("signer")
91+
.recipientId("1")
92+
.routingOrder("1");
93+
94+
signer.tabs(new Tabs()
95+
.checkboxTabs(List.of(
96+
new Checkbox()
97+
.documentId("1")
98+
.tabLabel("Yes")
99+
.anchorString("/SMS/")
100+
.anchorUnits("pixels")
101+
.anchorXOffset("20")
102+
.anchorYOffset("10")
103+
))
104+
.signHereTabs(List.of(
105+
new SignHere()
106+
.documentId("1")
107+
.tabLabel("Signature")
108+
.anchorString("/SignHere/")
109+
.anchorUnits("pixels")
110+
.anchorXOffset("20")
111+
.anchorYOffset("10")
112+
))
113+
.textTabs(List.of(
114+
new Text()
115+
.documentId("1")
116+
.tabLabel("FullName")
117+
.anchorString("/FullName/")
118+
.anchorUnits("pixels")
119+
.anchorXOffset("20")
120+
.anchorYOffset("10"),
121+
new Text()
122+
.documentId("1")
123+
.tabLabel("PhoneNumber")
124+
.anchorString("/PhoneNumber/")
125+
.anchorUnits("pixels")
126+
.anchorXOffset("20")
127+
.anchorYOffset("10"),
128+
new Text()
129+
.documentId("1")
130+
.tabLabel("Company")
131+
.anchorString("/Company/")
132+
.anchorUnits("pixels")
133+
.anchorXOffset("20")
134+
.anchorYOffset("10"),
135+
new Text()
136+
.documentId("1")
137+
.tabLabel("JobTitle")
138+
.anchorString("/Title/")
139+
.anchorUnits("pixels")
140+
.anchorXOffset("20")
141+
.anchorYOffset("10")
142+
))
143+
.dateSignedTabs(List.of(
144+
new DateSigned()
145+
.documentId("1")
146+
.tabLabel("DateSigned")
147+
.anchorString("/Date/")
148+
.anchorUnits("pixels")
149+
.anchorXOffset("20")
150+
.anchorYOffset("10")
151+
))
152+
);
153+
154+
Recipients recipients = new Recipients()
155+
.signers(List.of(signer));
156+
157+
return new EnvelopeTemplate()
158+
.description("Example template created via the API")
159+
.name(templateName)
160+
.shared("false")
161+
.documents(List.of(document))
162+
.emailSubject("Please sign this document")
163+
.recipients(recipients)
164+
.status("created");
165+
}
166+
}

0 commit comments

Comments
 (0)