Skip to content

Commit 53c30b3

Browse files
authored
Merge pull request #133 from docusign/feature/add-maestro-examples
Prepared Maestro examples
2 parents 6a3ba8a + 8e5acd3 commit 53c30b3

22 files changed

+1410
-9
lines changed

pom.xml

+9-2
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,13 @@
2626
<oauth2.version>2.5.6</oauth2.version>
2727
<commonsio.version>2.11.0</commonsio.version>
2828

29-
<esignature.version>4.4.0</esignature.version>
29+
<esignature.version>4.5.0</esignature.version>
3030
<rooms.version>1.4.3</rooms.version>
3131
<click.version> 1.4.0</click.version>
3232
<monitor.version>1.3.0</monitor.version>
3333
<admin.version>1.3.0</admin.version>
3434
<webforms.version>1.0.2-RC12</webforms.version>
35+
<maestro.version>1.0.0-RC1</maestro.version>
3536
<swagger-core-version>2.2.8</swagger-core-version>
3637
<jackson-version>2.14.2</jackson-version>
3738
<jersey2.version>3.0.9</jersey2.version>
@@ -105,7 +106,7 @@
105106
<dependency>
106107
<groupId>jakarta.ws.rs</groupId>
107108
<artifactId>jakarta.ws.rs-api</artifactId>
108-
<version>3.1.0</version>
109+
<version>2.1.6</version>
109110
</dependency>
110111

111112
<dependency>
@@ -168,6 +169,12 @@
168169
<classifier>shaded</classifier>
169170
</dependency>
170171

172+
<dependency>
173+
<groupId>com.docusign</groupId>
174+
<artifactId>docusign-maestro-java</artifactId>
175+
<version>${maestro.version}</version>
176+
</dependency>
177+
171178
<dependency>
172179
<groupId>com.docusign</groupId>
173180
<artifactId>docusign-monitor-java</artifactId>

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

+5
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ public class DSConfiguration {
106106
@Value("${DS_WEBFORMS_BASE_PATH}")
107107
private String webFormsBasePath;
108108

109+
@Value("${DS_MAESTRO_BASE_PATH}")
110+
private String maestroBasePath;
111+
109112
@Value("${CodeExamplesManifest}")
110113
private String codeExamplesManifest;
111114

@@ -126,6 +129,8 @@ public String getBaseUrl(ApiIndex apiIndex, OAuth.Account oauthAccount) {
126129
return monitorBasePath;
127130
} else if (ApiIndex.ADMIN.equals(apiIndex)) {
128131
return adminBasePath;
132+
} else if (ApiIndex.MAESTRO.equals(apiIndex)) {
133+
return maestroBasePath;
129134
}
130135

131136
return oauthAccount.getBaseUri();

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

+2
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ public enum ApiIndex {
44
ESIGNATURE("/pages/esignature/index", "/restapi", "/eg001", "/eg"),
55
ROOMS("/pages/rooms/index", "/restapi", "/r001", "/r"),
66
CLICK("/pages/click/index", "/clickapi", "/c001", "/c"),
7+
MAESTRO("/pages/maestro/index", "", "/mae001", "/mae"),
78
MONITOR("/pages/monitor/index", "", "/m001", "/m"),
89
ADMIN("/pages/admin/index", "/management", "/a001", "/a"),
910
CONNECT("/pages/connect/index", "", "/con001", "/con"),
1011
WEBFORMS("/pages/webforms/index", "/restapi", "/web001", "/web");
12+
1113
private final String indexPath;
1214

1315
private final String baseUrlSuffix;

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

+2
Original file line numberDiff line numberDiff line change
@@ -175,4 +175,6 @@ public class WorkArguments {
175175
private String hmacSecret;
176176

177177
private String jsonPayload;
178+
179+
private String instanceName;
178180
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.docusign.controller.maestro.examples;
2+
3+
import com.docusign.DSConfiguration;
4+
import com.docusign.maestro.client.ApiClient;
5+
import com.docusign.core.controller.AbstractController;
6+
import com.docusign.core.model.Session;
7+
import com.docusign.core.model.User;
8+
import org.springframework.http.HttpHeaders;
9+
import org.springframework.stereotype.Controller;
10+
11+
/**
12+
* Abstract base class for all Maestro controllers.
13+
*/
14+
@Controller
15+
public abstract class AbstractMaestroController extends AbstractController {
16+
17+
private static final String EXAMPLE_PAGES_PATH = "pages/maestro/examples/";
18+
19+
protected final Session session;
20+
21+
protected final User user;
22+
23+
public AbstractMaestroController(DSConfiguration config, String exampleName, Session session, User user) {
24+
super(config, exampleName);
25+
this.session = session;
26+
this.user = user;
27+
}
28+
29+
/**
30+
* Creates new instance of the Maestro API client.
31+
*
32+
* @param basePath URL to Maestro REST API
33+
* @param userAccessToken user's access token
34+
* @return an instance of the {@link ApiClient}
35+
*/
36+
protected static ApiClient createApiClient(String basePath, String userAccessToken) {
37+
ApiClient apiClient = new ApiClient(basePath);
38+
apiClient.addDefaultHeader(HttpHeaders.AUTHORIZATION, BEARER_AUTHENTICATION + userAccessToken);
39+
return apiClient;
40+
}
41+
42+
protected String getExamplePagesPath() {
43+
return AbstractMaestroController.EXAMPLE_PAGES_PATH;
44+
}
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
package com.docusign.controller.maestro.examples;
2+
3+
import com.docusign.DSConfiguration;
4+
import com.docusign.common.WorkArguments;
5+
import com.docusign.controller.maestro.services.CreateWorkflowService;
6+
import com.docusign.controller.maestro.services.TriggerWorkflowService;
7+
import com.docusign.core.model.DoneExample;
8+
import com.docusign.core.model.Session;
9+
import com.docusign.core.model.User;
10+
import com.docusign.maestro.client.ApiException;
11+
import com.docusign.maestro.api.WorkflowManagementApi;
12+
import com.docusign.maestro.client.ApiClient;
13+
import com.docusign.maestro.model.NewOrUpdatedWorkflowDefinitionResponse;
14+
import com.docusign.maestro.model.WorkflowDefinitionList;
15+
import com.docusign.maestro.model.WorkflowDefinitionMetadata;
16+
import org.springframework.beans.factory.annotation.Autowired;
17+
import org.springframework.stereotype.Controller;
18+
import org.springframework.ui.ModelMap;
19+
import org.springframework.web.bind.annotation.RequestMapping;
20+
21+
import javax.servlet.http.HttpServletResponse;
22+
import java.io.IOException;
23+
import java.net.URISyntaxException;
24+
import java.security.InvalidKeyException;
25+
import java.security.NoSuchAlgorithmException;
26+
import java.util.Optional;
27+
28+
@Controller
29+
@RequestMapping("/mae001")
30+
public class EG001ControllerTriggerWorkflow extends AbstractMaestroController {
31+
32+
private static final String MODEL_TEMPLATE_ID = "templateId";
33+
34+
private static final String MODEL_WORKFLOW_ID = "workflowId";
35+
36+
private static final String MODEL_PUBLISH_LINK_ID = "publishLink";
37+
38+
public static final String WORKFLOW_NAME = "Example workflow - send invite to signer";
39+
40+
@Autowired
41+
public EG001ControllerTriggerWorkflow(DSConfiguration config, Session session, User user) {
42+
super(config, "mae001", session, user);
43+
}
44+
45+
@Override
46+
protected void onInitModel(WorkArguments args, ModelMap model) throws Exception {
47+
super.onInitModel(args, model);
48+
ApiClient apiClient = createApiClient(config.getMaestroBasePath(), user.getAccessToken());
49+
String accountId = session.getAccountId();
50+
String templateId = session.getTemplateId();
51+
52+
try {
53+
WorkflowDefinitionList workflowDefinition = TriggerWorkflowService.getWorkflowDefinitions(
54+
apiClient,
55+
accountId);
56+
57+
if (workflowDefinition.getValue() != null && !workflowDefinition.getValue().isEmpty()) {
58+
Optional<WorkflowDefinitionMetadata> workflow = workflowDefinition
59+
.getValue()
60+
.stream()
61+
.filter(x -> x.getName().equals(WORKFLOW_NAME))
62+
.min((x, y) -> y.getLastUpdatedDate().compareTo(x.getLastUpdatedDate()));
63+
64+
workflow.ifPresent(workflowDefinitionMetadata -> session.setWorkflowId(workflowDefinitionMetadata.getId()));
65+
}
66+
67+
if (session.getIsWorkflowPublished()) {
68+
String publishLink = TriggerWorkflowService.publishWorkFlow(
69+
apiClient,
70+
accountId,
71+
session.getWorkflowId());
72+
73+
if (!publishLink.isEmpty()) {
74+
model.addAttribute(MODEL_PUBLISH_LINK_ID, getTextForCodeExampleByApiType().getAdditionalPage()
75+
.get(0).getResultsPageText().replaceFirst("\\{0}", publishLink));
76+
} else {
77+
session.setIsWorkflowPublished(false);
78+
}
79+
}
80+
81+
if (session.getWorkflowId() == null && templateId != null) {
82+
WorkflowManagementApi managementApi = new WorkflowManagementApi(apiClient);
83+
84+
NewOrUpdatedWorkflowDefinitionResponse createWorkflow = CreateWorkflowService.createWorkflowDefinition(
85+
managementApi,
86+
accountId,
87+
templateId);
88+
89+
session.setWorkflowId(createWorkflow.getWorkflowDefinitionId());
90+
91+
String publishLink = TriggerWorkflowService.publishWorkFlow(
92+
apiClient,
93+
accountId,
94+
session.getWorkflowId());
95+
96+
session.setIsWorkflowPublished(true);
97+
model.addAttribute(MODEL_PUBLISH_LINK_ID, getTextForCodeExampleByApiType().getAdditionalPage().get(0)
98+
.getResultsPageText().replaceFirst("\\{0}", publishLink));
99+
}
100+
} catch(ApiException exception) {
101+
if(exception.getCode() == 403) {
102+
model.addAttribute(MODEL_PUBLISH_LINK_ID, config.getCodeExamplesText().SupportingTexts.ContactSupportToEnableFeature
103+
.replaceFirst("\\{0}", "Maestro"));
104+
} else {
105+
throw exception;
106+
}
107+
}
108+
109+
model.addAttribute(MODEL_TEMPLATE_ID, templateId);
110+
model.addAttribute(MODEL_WORKFLOW_ID, session.getWorkflowId());
111+
}
112+
113+
@Override
114+
protected Object doWork(
115+
WorkArguments args,
116+
ModelMap model,
117+
HttpServletResponse response
118+
) throws ApiException, IOException, NoSuchAlgorithmException, InvalidKeyException, URISyntaxException {
119+
//ds-snippet-start:Maestro1Step2
120+
ApiClient apiClient = createApiClient(config.getMaestroBasePath(), user.getAccessToken());
121+
//ds-snippet-end:Maestro1Step2
122+
String accountId = session.getAccountId();
123+
124+
//ds-snippet-start:Maestro1Step3
125+
var workflow = TriggerWorkflowService.getWorkflowDefinition(
126+
apiClient,
127+
accountId,
128+
session.getWorkflowId());
129+
//ds-snippet-end:Maestro1Step3
130+
131+
var result = TriggerWorkflowService.triggerWorkflow(
132+
apiClient,
133+
accountId,
134+
workflow.getTriggerUrl(),
135+
args.getSignerEmail(),
136+
args.getSignerName(),
137+
args.getCcEmail(),
138+
args.getCcName(),
139+
args.getInstanceName());
140+
141+
session.setInstanceId(result.getInstanceId());
142+
143+
DoneExample.createDefault(getTextForCodeExampleByApiType().ExampleName)
144+
.withMessage(getTextForCodeExampleByApiType().ResultsPageText)
145+
.withJsonObject(result)
146+
.addToModel(model, config);
147+
return DONE_EXAMPLE_PAGE;
148+
}
149+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.docusign.controller.maestro.examples;
2+
3+
import com.docusign.DSConfiguration;
4+
import com.docusign.common.WorkArguments;
5+
import com.docusign.controller.maestro.services.CancelWorkflowInstanceService;
6+
import com.docusign.core.model.DoneExample;
7+
import com.docusign.core.model.Session;
8+
import com.docusign.core.model.User;
9+
import com.docusign.esign.client.ApiException;
10+
import com.docusign.maestro.client.ApiClient;
11+
import com.docusign.maestro.model.CancelResponse;
12+
import org.springframework.beans.factory.annotation.Autowired;
13+
import org.springframework.stereotype.Controller;
14+
import org.springframework.ui.ModelMap;
15+
import org.springframework.web.bind.annotation.RequestMapping;
16+
17+
import javax.servlet.http.HttpServletResponse;
18+
import java.io.IOException;
19+
import java.security.InvalidKeyException;
20+
import java.security.NoSuchAlgorithmException;
21+
22+
@Controller
23+
@RequestMapping("/mae002")
24+
public class EG002ControllerCancelWorkflow extends AbstractMaestroController {
25+
26+
private static final String MODEL_WORKFLOW_ID = "workflowId";
27+
28+
private static final String MODEL_INSTANCE_ID = "instanceId";
29+
30+
@Autowired
31+
public EG002ControllerCancelWorkflow(DSConfiguration config, Session session, User user) {
32+
super(config, "mae002", session, user);
33+
}
34+
35+
@Override
36+
protected void onInitModel(WorkArguments args, ModelMap model) throws Exception {
37+
super.onInitModel(args, model);
38+
model.addAttribute(MODEL_WORKFLOW_ID, session.getWorkflowId());
39+
model.addAttribute(MODEL_INSTANCE_ID, session.getInstanceId());
40+
}
41+
42+
@Override
43+
protected Object doWork(
44+
WorkArguments args,
45+
ModelMap model,
46+
HttpServletResponse response
47+
) throws ApiException, IOException, NoSuchAlgorithmException, InvalidKeyException, com.docusign.maestro.client.ApiException {
48+
//ds-snippet-start:Maestro2Step2
49+
ApiClient apiClient = createApiClient(config.getMaestroBasePath(), user.getAccessToken());
50+
//ds-snippet-end:Maestro2Step2
51+
52+
CancelResponse cancelResponse = CancelWorkflowInstanceService.cancelWorkflowInstance(
53+
apiClient,
54+
session.getAccountId(),
55+
session.getInstanceId());
56+
57+
DoneExample.createDefault(getTextForCodeExampleByApiType().ExampleName)
58+
.withMessage(getTextForCodeExampleByApiType().ResultsPageText
59+
.replaceFirst("\\{0}", session.getInstanceId()))
60+
.withJsonObject(cancelResponse)
61+
.addToModel(model, config);
62+
return DONE_EXAMPLE_PAGE;
63+
}
64+
}

0 commit comments

Comments
 (0)