Skip to content

Commit 13c594b

Browse files
authored
Merge pull request #127 from docusign/feature-webforms-code-example
Added web forms code example
2 parents c4efde4 + c89419f commit 13c594b

File tree

16 files changed

+1086
-5
lines changed

16 files changed

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

0 commit comments

Comments
 (0)