Skip to content

Commit bd8c904

Browse files
committed
Added Maestro examples
1 parent 9051a19 commit bd8c904

20 files changed

+1130
-193
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
<monitor.version>1.4.0</monitor.version>
3333
<admin.version>2.0.0</admin.version>
3434
<webforms.version>2.0.0-RC1</webforms.version>
35-
<iam.version>1.0.0-beta.3</iam.version>
35+
<iam.version>1.0.0-beta.4</iam.version>
3636
<swagger-core-version>2.2.22</swagger-core-version>
3737
<jackson-version>2.17.2</jackson-version>
3838
<jersey2.version>3.1.10</jersey2.version>

src/main/java/com/docusign/controller/maestro/examples/AbstractMaestroController.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
import com.docusign.core.controller.AbstractController;
55
import com.docusign.core.model.Session;
66
import com.docusign.core.model.User;
7+
import com.docusign.iam.sdk.IamClient;
8+
import com.fasterxml.jackson.databind.ObjectMapper;
9+
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
710
import org.springframework.stereotype.Controller;
811

912
/**
@@ -24,6 +27,19 @@ public AbstractMaestroController(DSConfiguration config, String exampleName, Use
2427
this.session = session;
2528
}
2629

30+
protected IamClient createAuthenticatedClient(String accessToken) {
31+
return IamClient.builder()
32+
.accessToken(accessToken)
33+
.build();
34+
}
35+
36+
protected String serializeObjectToJson(Object data) throws Exception {
37+
ObjectMapper mapper = new ObjectMapper();
38+
mapper.registerModule(new Jdk8Module());
39+
40+
return mapper.writeValueAsString(data);
41+
}
42+
2743
protected String getExamplePagesPath() {
2844
return AbstractMaestroController.EXAMPLE_PAGES_PATH;
2945
}

src/main/java/com/docusign/controller/maestro/examples/Mae001TriggerWorkflowController.java

Lines changed: 81 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,37 @@
22

33
import com.docusign.DSConfiguration;
44
import com.docusign.common.WorkArguments;
5-
import com.docusign.controller.maestro.services.MaestroMethodsService;
6-
import com.docusign.core.model.DoneExample;
5+
import com.docusign.controller.maestro.services.TriggerWorkflowService;
76
import com.docusign.core.model.Session;
87
import com.docusign.core.model.User;
98
import org.springframework.stereotype.Controller;
109
import org.springframework.ui.ModelMap;
1110
import org.springframework.web.bind.annotation.RequestMapping;
1211

1312
import javax.servlet.http.HttpServletResponse;
13+
import java.util.Optional;
1414

1515
/**
16-
* This example demonstrates how to get all agreements.
16+
* This example demonstrates how to trigger maestro workflow.
1717
*/
1818
@Controller
1919
@RequestMapping("/mae001")
2020
public class Mae001TriggerWorkflowController extends AbstractMaestroController {
21-
private static final String MODEL_TEMPLATE_ID = "templateId";
21+
public static final String EMBED = "pages/maestro/examples/embed";
2222

23-
private static final String MODEL_WORKFLOW_ID = "workflowId";
23+
private static final String MAESTRO_WORKFLOW_CONFIG = "maestro-workflow-definition.json";
2424

25-
private static final String MODEL_PUBLISH_LINK_ID = "publishLink";
25+
public static final String URL = "url";
2626

27-
public static final String WORKFLOW_NAME = "Example workflow - send invite to signer";
27+
private static final String TEMPLATE_ID = "templateId";
28+
29+
private static final String WORKFLOW_ID = "workflowId";
30+
31+
private static final String PUBLISH_LINK = "publishLink";
32+
33+
public static final String WORKFLOW_NAME = "Example workflow - send invite to signer hahaha";
34+
35+
public static final String STATUS = "active";
2836

2937
public Mae001TriggerWorkflowController(DSConfiguration config, Session session, User user) {
3038
super(config, "mae001", user, session);
@@ -33,89 +41,15 @@ public Mae001TriggerWorkflowController(DSConfiguration config, Session session,
3341
@Override
3442
protected void onInitModel(WorkArguments args, ModelMap model) throws Exception {
3543
super.onInitModel(args, model);
36-
//ApiClient apiClient = createApiClient(config.getMaestroBasePath(), user.getAccessToken());
37-
var accountId = session.getAccountId();
38-
var accessToken = user.getAccessToken();
39-
String templateId = session.getTemplateId();
4044

4145
try {
42-
var workflowDefinition = MaestroMethodsService.getMaestroWorkflow(
43-
accessToken,
44-
accountId);
45-
46-
if (workflowDefinition.workflowsListSuccess() != null && workflowDefinition.workflowsListSuccess().isPresent()) {
47-
workflowDefinition.workflowsListSuccess().stream()
48-
.filter(w -> w.data().isPresent()) // ensure data() is present
49-
.flatMap(w -> w.data().get().stream()) // stream each workflow in the list
50-
.filter(w -> w.name().get().equals(WORKFLOW_NAME)) // match by name
51-
.findFirst()
52-
.ifPresent(w -> session.setWorkflowId(w.id().get()));
53-
}
54-
55-
var paused = MaestroMethodsService.PauseMaestroWorkflow(
56-
accessToken,
57-
accountId,
58-
session.getWorkflowId());
59-
60-
var resumed = MaestroMethodsService.ResumeMaestroWorkflow(
61-
accessToken,
62-
accountId,
63-
session.getWorkflowId());
64-
65-
var result = MaestroMethodsService.triggerWorkflowInstance(
66-
accessToken,
67-
accountId,
68-
session.getWorkflowId(),
69-
"a@gmail.com",
70-
"anna",
71-
"an@gmail.com",
72-
"as",
73-
"inst");
74-
75-
/*
76-
if (session.getIsWorkflowPublished()) {
77-
String publishLink = TriggerWorkflowService.publishWorkFlow(
78-
apiClient,
79-
accountId,
80-
session.getWorkflowId());
81-
82-
if (!publishLink.isEmpty()) {
83-
model.addAttribute(MODEL_PUBLISH_LINK_ID, getTextForCodeExampleByApiType().getAdditionalPage()
84-
.get(0).getResultsPageText().replaceFirst("\\{0}", publishLink));
85-
} else {
86-
session.setIsWorkflowPublished(false);
87-
}
88-
}
89-
90-
if (session.getWorkflowId() == null && templateId != null) {
91-
WorkflowManagementApi managementApi = new WorkflowManagementApi(apiClient);
92-
93-
NewOrUpdatedWorkflowDefinitionResponse createWorkflow = CreateWorkflowService.createWorkflowDefinition(
94-
managementApi,
95-
accountId,
96-
templateId);
97-
98-
session.setWorkflowId(createWorkflow.getWorkflowDefinitionId());
99-
100-
String publishLink = TriggerWorkflowService.publishWorkFlow(
101-
apiClient,
102-
accountId,
103-
session.getWorkflowId());
104-
105-
session.setIsWorkflowPublished(true);
106-
model.addAttribute(MODEL_PUBLISH_LINK_ID, getTextForCodeExampleByApiType().getAdditionalPage().get(0)
107-
.getResultsPageText().replaceFirst("\\{0}", publishLink));
108-
}
109-
110-
*/
46+
ensureWorkflowExists(model);
11147
} catch(Exception exception) {
112-
System.out.println(exception.toString());
113-
exception.printStackTrace();
11448
throw exception;
11549
}
11650

117-
model.addAttribute(MODEL_TEMPLATE_ID, templateId);
118-
model.addAttribute(MODEL_WORKFLOW_ID, session.getWorkflowId());
51+
model.addAttribute(TEMPLATE_ID, session.getTemplateId());
52+
model.addAttribute(WORKFLOW_ID, session.getWorkflowId());
11953
}
12054

12155
@Override
@@ -126,19 +60,10 @@ protected Object doWork(
12660
) throws Exception{
12761
var accountId = session.getAccountId();
12862
var accessToken = user.getAccessToken();
63+
var client = createAuthenticatedClient(accessToken);
12964

130-
var workflowDefinition = MaestroMethodsService.PauseMaestroWorkflow(
131-
accessToken,
132-
accountId,
133-
session.getWorkflowId());
134-
135-
var r = MaestroMethodsService.ResumeMaestroWorkflow(
136-
accessToken,
137-
accountId,
138-
session.getWorkflowId());
139-
140-
var result = MaestroMethodsService.triggerWorkflowInstance(
141-
accessToken,
65+
var triggerResponse = TriggerWorkflowService.triggerWorkflowInstance(
66+
client,
14267
accountId,
14368
session.getWorkflowId(),
14469
args.getSignerEmail(),
@@ -147,10 +72,65 @@ protected Object doWork(
14772
args.getCcName(),
14873
args.getInstanceName());
14974

150-
DoneExample.createDefault(getTextForCodeExampleByApiType().ExampleName)
151-
.withMessage(getTextForCodeExampleByApiType().ResultsPageText)
152-
.withJsonObject(result)
153-
.addToModel(model, config);
154-
return DONE_EXAMPLE_PAGE;
75+
triggerResponse.triggerWorkflowSuccess().ifPresent(success -> {
76+
session.setInstanceId(success.instanceId().orElse(null));
77+
model.addAttribute(URL, success.instanceUrl().orElse(""));
78+
});
79+
80+
model.addAttribute(LAUNCHER_TEXTS, config.getCodeExamplesText().SupportingTexts);
81+
model.addAttribute("example", this.getTextForCodeExample());
82+
83+
return EMBED;
84+
}
85+
86+
private void ensureWorkflowExists(ModelMap model) throws Exception {
87+
var accountId = session.getAccountId();
88+
var accessToken = user.getAccessToken();
89+
var templateId = session.getTemplateId();
90+
91+
findActiveWorkflow(accessToken, accountId)
92+
.ifPresent(workflowId -> session.setWorkflowId(workflowId));
93+
94+
if (session.getIsWorkflowPublished()) {
95+
publishAndSetLink(model, accessToken, accountId, session.getWorkflowId());
96+
}
97+
98+
if (session.getWorkflowId() == null && templateId != null) {
99+
var workflowId = TriggerWorkflowService.createWorkflow(accessToken, accountId, templateId, MAESTRO_WORKFLOW_CONFIG);
100+
101+
session.setWorkflowId(workflowId);
102+
session.setIsWorkflowPublished(true);
103+
104+
publishAndSetLink(model, accessToken, accountId, workflowId);
105+
}
106+
}
107+
108+
private Optional<String> findActiveWorkflow(String accessToken, String accountId) throws Exception {
109+
var client = createAuthenticatedClient(accessToken);
110+
var workflowsResponse = TriggerWorkflowService.getMaestroWorkflow(client, accountId);
111+
112+
return workflowsResponse.workflowsListSuccess().stream()
113+
.filter(w -> w.data().isPresent())
114+
.flatMap(w -> w.data().orElseThrow().stream())
115+
.filter(workflow ->
116+
workflow.name().orElseThrow().equals(WORKFLOW_NAME) && workflow.status().orElseThrow().equals(STATUS))
117+
.map(workflow -> workflow.id().orElse(null))
118+
.findFirst();
119+
}
120+
121+
private void publishAndSetLink(ModelMap model, String accessToken, String accountId, String workflowId) throws Exception {
122+
String publishLink = TriggerWorkflowService.publishWorkflow(accessToken, accountId, workflowId);
123+
124+
if (!publishLink.isEmpty()) {
125+
String linkText = getTextForCodeExampleByApiType()
126+
.getAdditionalPage()
127+
.get(0)
128+
.getResultsPageText()
129+
.replaceFirst("\\{0}", publishLink);
130+
131+
model.addAttribute(PUBLISH_LINK, linkText);
132+
} else {
133+
session.setIsWorkflowPublished(false);
134+
}
155135
}
156136
}
Lines changed: 64 additions & 0 deletions
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.PauseWorkflowService;
6+
import com.docusign.core.model.DoneExample;
7+
import com.docusign.core.model.Session;
8+
import com.docusign.core.model.User;
9+
import org.springframework.stereotype.Controller;
10+
import org.springframework.ui.ModelMap;
11+
import org.springframework.web.bind.annotation.RequestMapping;
12+
13+
import javax.servlet.http.HttpServletResponse;
14+
15+
/**
16+
* This example demonstrates how to pause workflow.
17+
*/
18+
@Controller
19+
@RequestMapping("/mae002")
20+
public class Mae002PauseWorkflowController extends AbstractMaestroController {
21+
22+
private static final String MODEL_IS_WORKFLOW_ID_PRESENT = "isWorkflowIdPresent";
23+
24+
public static final String NO_WORKFLOW_AVAILABLE_TO_PAUSE = "No workflow available to pause.";
25+
26+
public Mae002PauseWorkflowController(DSConfiguration config, Session session, User user) {
27+
super(config, "mae002", user, session);
28+
}
29+
30+
@Override
31+
protected void onInitModel(WorkArguments args, ModelMap model) throws Exception {
32+
super.onInitModel(args, model);
33+
model.addAttribute(MODEL_IS_WORKFLOW_ID_PRESENT, session.getWorkflowId() != null );
34+
}
35+
36+
@Override
37+
protected Object doWork(
38+
WorkArguments args,
39+
ModelMap model,
40+
HttpServletResponse response
41+
) throws Exception{
42+
var accountId = session.getAccountId();
43+
var accessToken = user.getAccessToken();
44+
var workflowId = session.getWorkflowId();
45+
var client = createAuthenticatedClient(accessToken);
46+
47+
if (workflowId == null) {
48+
throw new IllegalStateException(NO_WORKFLOW_AVAILABLE_TO_PAUSE);
49+
}
50+
51+
var paused = PauseWorkflowService.PauseMaestroWorkflow(
52+
client,
53+
accountId,
54+
workflowId);
55+
var jsonResponse = serializeObjectToJson(paused.pauseNewWorkflowInstancesSuccess().orElseThrow());
56+
57+
DoneExample.createDefault(getTextForCodeExampleByApiType().ExampleName)
58+
.withMessage(getTextForCodeExampleByApiType().ResultsPageText)
59+
.withJsonObject(jsonResponse)
60+
.addToModel(model, config);
61+
62+
return DONE_EXAMPLE_PAGE;
63+
}
64+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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.ResumeWorkflowService;
6+
import com.docusign.core.model.DoneExample;
7+
import com.docusign.core.model.Session;
8+
import com.docusign.core.model.User;
9+
import org.springframework.stereotype.Controller;
10+
import org.springframework.ui.ModelMap;
11+
import org.springframework.web.bind.annotation.RequestMapping;
12+
13+
import javax.servlet.http.HttpServletResponse;
14+
15+
/**
16+
* This example demonstrates how to resume workflow.
17+
*/
18+
@Controller
19+
@RequestMapping("/mae003")
20+
public class Mae003ResumeWorkflowController extends AbstractMaestroController {
21+
private static final String MODEL_IS_WORKFLOW_ID_PRESENT = "isWorkflowIdPresent";
22+
23+
public static final String NO_WORKFLOW_AVAILABLE_TO_RESUME = "No workflow available to resume.";
24+
25+
public Mae003ResumeWorkflowController(DSConfiguration config, Session session, User user) {
26+
super(config, "mae003", user, session);
27+
}
28+
29+
@Override
30+
protected void onInitModel(WorkArguments args, ModelMap model) throws Exception {
31+
super.onInitModel(args, model);
32+
model.addAttribute(MODEL_IS_WORKFLOW_ID_PRESENT, session.getWorkflowId() != null );
33+
}
34+
35+
@Override
36+
protected Object doWork(
37+
WorkArguments args,
38+
ModelMap model,
39+
HttpServletResponse response
40+
) throws Exception{
41+
var accountId = session.getAccountId();
42+
var accessToken = user.getAccessToken();
43+
var workflowId = session.getWorkflowId();
44+
var client = createAuthenticatedClient(accessToken);
45+
46+
if (workflowId == null) {
47+
throw new IllegalStateException(NO_WORKFLOW_AVAILABLE_TO_RESUME);
48+
}
49+
50+
var paused = ResumeWorkflowService.ResumeMaestroWorkflow(
51+
client,
52+
accountId,
53+
workflowId);
54+
var jsonResponse = serializeObjectToJson(paused.resumeNewWorkflowInstancesSuccess().orElseThrow());
55+
56+
DoneExample.createDefault(getTextForCodeExampleByApiType().ExampleName)
57+
.withMessage(getTextForCodeExampleByApiType().ResultsPageText)
58+
.withJsonObject(jsonResponse)
59+
.addToModel(model, config);
60+
61+
return DONE_EXAMPLE_PAGE;
62+
}
63+
}

0 commit comments

Comments
 (0)