Skip to content

Commit da65f00

Browse files
committed
added shared access code example
1 parent 0a21d3e commit da65f00

12 files changed

Lines changed: 377 additions & 6 deletions

File tree

‎pom.xml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<java.version>11</java.version>
2424
<oauth2.version>2.5.6</oauth2.version>
2525
<commonsio.version>2.11.0</commonsio.version>
26-
<esignature.version>4.1.0</esignature.version>
26+
<esignature.version>4.2.0</esignature.version>
2727
<rooms.version>1.1.0</rooms.version>
2828
<click.version> 1.2.2</click.version>
2929
<monitor.version>1.1.0</monitor.version>

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ public class DSConfiguration {
3535

3636
public Boolean isConsentRedirectActivated = false;
3737

38+
private boolean additionalRedirect = false;
39+
40+
private boolean shareAccessExampleScenario = false;
41+
42+
private String principalUserId;
43+
3844
@Value("${DS_TARGET_ACCOUNT_ID}")
3945
private String targetAccountId;
4046

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,7 @@ public class WorkArguments {
8282
private String managerName;
8383
private String jobTitle;
8484
private String salary;
85+
private String agentEmail;
86+
private String agentName;
87+
private String activationCode;
8588
}

‎src/main/java/com/docusign/controller/eSignature/examples/AbstractEsignatureController.java‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.docusign.esign.api.AccountsApi;
66
import com.docusign.esign.api.EnvelopesApi;
77
import com.docusign.esign.api.TemplatesApi;
8+
import com.docusign.esign.api.UsersApi;
89
import com.docusign.esign.client.ApiClient;
910
import com.docusign.esign.client.ApiException;
1011
import com.docusign.esign.client.auth.OAuth;
@@ -42,6 +43,17 @@ protected ApiClient createApiClient(String basePath, String userAccessToken) {
4243
return apiClient;
4344
}
4445

46+
/**
47+
* Gets the information about the currently logged user.
48+
* @param basePath URL to eSignature REST API
49+
* @param userAccessToken user's access token
50+
* @return an instance of the {@link OAuth.UserInfo}
51+
*/
52+
protected OAuth.UserInfo getCurrentUserId(String basePath, String userAccessToken) throws ApiException {
53+
ApiClient apiClient = createApiClient(basePath, userAccessToken);
54+
return apiClient.getUserInfo(userAccessToken);
55+
}
56+
4557
/**
4658
* Creates a new instance of the eSignature EnvelopesApi. This method
4759
* creates an instance of the ApiClient class silently.
@@ -54,6 +66,18 @@ protected EnvelopesApi createEnvelopesApi(String basePath, String userAccessToke
5466
return new EnvelopesApi(apiClient);
5567
}
5668

69+
/**
70+
* Creates a new instance of the eSignature UsersApi. This method
71+
* creates an instance of the ApiClient class silently.
72+
* @param basePath URL to eSignature REST API
73+
* @param userAccessToken user's access token
74+
* @return an instance of the {@link UsersApi}
75+
*/
76+
protected UsersApi createUsersApi(String basePath, String userAccessToken) {
77+
ApiClient apiClient = createApiClient(basePath, userAccessToken);
78+
return new UsersApi(apiClient);
79+
}
80+
5781
/**
5882
* Creates a new instance of the eSignature TemplatesApi. This method
5983
* creates an instance of the ApiClient class silently.
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
package com.docusign.controller.eSignature.examples;
2+
3+
import com.docusign.DSConfiguration;
4+
import com.docusign.common.WorkArguments;
5+
import com.docusign.controller.eSignature.services.SharedAccessService;
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.api.AccountsApi;
10+
import com.docusign.esign.api.EnvelopesApi;
11+
import com.docusign.esign.api.UsersApi;
12+
import com.docusign.esign.client.ApiClient;
13+
import com.docusign.esign.client.ApiException;
14+
import com.docusign.esign.client.auth.OAuth;
15+
import com.docusign.esign.model.EnvelopesInformation;
16+
import com.docusign.esign.model.NewUsersSummary;
17+
import com.docusign.esign.model.UserInformation;
18+
import io.swagger.annotations.Api;
19+
import org.springframework.beans.factory.annotation.Autowired;
20+
import org.springframework.http.MediaType;
21+
import org.springframework.stereotype.Controller;
22+
import org.springframework.ui.ModelMap;
23+
import org.springframework.web.bind.annotation.RequestMapping;
24+
import org.springframework.web.bind.annotation.RequestMethod;
25+
26+
import javax.servlet.http.HttpServletResponse;
27+
28+
import static com.docusign.controller.eSignature.examples.EG043ControllerSharedAccess.EG_043;
29+
30+
@Controller
31+
@RequestMapping(EG_043)
32+
public class EG043ControllerSharedAccess extends AbstractEsignatureController {
33+
public static final String EG_043 = "/eg043";
34+
public static final String ACTIVATE_USER = "/activateUser";
35+
public static final String LOGOUT = "/logout";
36+
public static final String LIST_ENVELOPES = "/listEnvelopes";
37+
public static final String ACT_ON_BEHALF = "X-DocuSign-Act-On-Behalf";
38+
public static final String HOME_PAGE = "/";
39+
private final Session session;
40+
private final User user;
41+
42+
@Autowired
43+
public EG043ControllerSharedAccess(DSConfiguration config, Session session, User user) {
44+
super(config, EG_043);
45+
this.session = session;
46+
this.user = user;
47+
}
48+
49+
@Override
50+
protected Object doWork(WorkArguments args, ModelMap model,
51+
HttpServletResponse response) throws Exception {
52+
String basePath = session.getBasePath();
53+
String accessToken = user.getAccessToken();
54+
55+
UsersApi usersApi = createUsersApi(basePath, accessToken);
56+
57+
UserInformation userInformation = (new SharedAccessService()).checkIfAgentExists(
58+
usersApi,
59+
session.getAccountId(),
60+
args.getAgentEmail()
61+
);
62+
63+
if (userInformation == null) {
64+
NewUsersSummary usersSummary = (new SharedAccessService()).createAgent(
65+
usersApi,
66+
session.getAccountId(),
67+
args.getAgentEmail(),
68+
args.getAgentName(),
69+
args.getActivationCode());
70+
71+
this.session.setCreatedUserId(usersSummary.getNewUsers().get(0).getUserId());
72+
73+
DoneExample.createDefault("Agent user created")
74+
.withMessage(getTextForCodeExampleByApiType().ResultsPageText)
75+
.withJsonObject(usersSummary)
76+
.withRedirect(EG_043 + ACTIVATE_USER)
77+
.addToModel(model, config);
78+
} else {
79+
this.session.setCreatedUserId(userInformation.getUserId());
80+
81+
DoneExample.createDefault("Agent user created")
82+
.withMessage(getTextForCodeExampleByApiType().ResultsPageText)
83+
.withJsonObject(userInformation)
84+
.withRedirect(EG_043 + ACTIVATE_USER)
85+
.addToModel(model, config);
86+
}
87+
88+
return DONE_EXAMPLE_PAGE;
89+
}
90+
91+
@RequestMapping(value = ACTIVATE_USER, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
92+
public Object activateUser(ModelMap model) throws ApiException {
93+
String basePath = session.getBasePath();
94+
String accessToken = user.getAccessToken();
95+
96+
AccountsApi accountsApi = createAccountsApi(basePath, accessToken);
97+
OAuth.UserInfo user = getCurrentUserId(basePath, accessToken);
98+
String userId = user.getSub();
99+
100+
try {
101+
(new SharedAccessService()).activateAgent(
102+
accountsApi,
103+
session.getAccountId(),
104+
userId,
105+
session.getCreatedUserId());
106+
107+
this.config.setPrincipalUserId(userId);
108+
this.config.setShareAccessExampleScenario(true);
109+
this.config.setAdditionalRedirect(true);
110+
111+
DoneExample.createDefault("Authenticate as the agent")
112+
.withMessage(getTextForCodeExampleByApiType().getAdditionalPage().get(0).ResultsPageText)
113+
.withRedirect(LOGOUT)
114+
.addToModel(model, config);
115+
} catch(ApiException exception) {
116+
DoneExample.createDefault("Authenticate as the agent")
117+
.withMessage(getTextForCodeExampleByApiType().getAdditionalPage().get(3).ResultsPageText)
118+
.withRedirect(EG_043 + ACTIVATE_USER)
119+
.addToModel(model, config);
120+
}
121+
122+
return DONE_EXAMPLE_PAGE;
123+
}
124+
125+
@RequestMapping(value = LIST_ENVELOPES, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
126+
public Object listEnvelopes(ModelMap model) throws ApiException {
127+
String basePath = session.getBasePath();
128+
String accessToken = user.getAccessToken();
129+
130+
ApiClient apiClient = createApiClient(basePath, accessToken);
131+
apiClient.addDefaultHeader(ACT_ON_BEHALF, this.config.getPrincipalUserId());
132+
EnvelopesApi envelopesApi = new EnvelopesApi(apiClient);
133+
134+
EnvelopesInformation envelopesInformation = (new SharedAccessService()).getEnvelopes(
135+
envelopesApi,
136+
session.getAccountId());
137+
138+
if(envelopesInformation.getEnvelopes() == null || envelopesInformation.getEnvelopes().isEmpty()){
139+
DoneExample.createDefault("No envelopes in the principal user's account")
140+
.withMessage(getTextForCodeExampleByApiType().getAdditionalPage().get(2).ResultsPageText)
141+
.withRedirect(HOME_PAGE)
142+
.addToModel(model, config);
143+
} else {
144+
DoneExample.createDefault("Principal's envelopes visible in the agent's Shared Access UI")
145+
.withMessage(getTextForCodeExampleByApiType().getAdditionalPage().get(1).ResultsPageText)
146+
.withJson(envelopesInformation.toString())
147+
.withRedirect(HOME_PAGE)
148+
.addToModel(model, config);
149+
}
150+
151+
return DONE_EXAMPLE_PAGE;
152+
}
153+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package com.docusign.controller.eSignature.services;
2+
3+
import com.docusign.esign.api.AccountsApi;
4+
import com.docusign.esign.api.EnvelopesApi;
5+
import com.docusign.esign.api.UsersApi;
6+
import com.docusign.esign.client.ApiException;
7+
import com.docusign.esign.model.*;
8+
9+
import java.time.LocalDate;
10+
import java.time.format.DateTimeFormatter;
11+
12+
public final class SharedAccessService {
13+
14+
private static final int FROM_DATE_OFFSET_DAYS = 10;
15+
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy/MM/dd");
16+
public static final String MANAGE = "manage";
17+
18+
public static UserInformation checkIfAgentExists(UsersApi usersApi, String accountId, String agentEmail) {
19+
UsersApi.CallListOptions callListOptions = usersApi.new CallListOptions();
20+
callListOptions.setEmail(agentEmail);
21+
22+
try {
23+
UserInformationList informationList = usersApi.callList(accountId, callListOptions);
24+
25+
if (Integer.parseInt(informationList.getResultSetSize()) > 0) {
26+
UserInformation userInformation = informationList.getUsers().stream().filter(user -> user.getUserStatus().equals("Active")).findFirst().get();
27+
28+
return userInformation;
29+
}
30+
} catch (ApiException e) {
31+
return null;
32+
}
33+
34+
return null;
35+
}
36+
37+
public static NewUsersSummary createAgent(
38+
UsersApi usersApi,
39+
String accountId,
40+
String agentEmail,
41+
String agentName,
42+
String activation
43+
) throws ApiException {
44+
UserInformation user = new UserInformation();
45+
user.email(agentEmail);
46+
user.userName(agentName);
47+
user.activationAccessCode(activation);
48+
49+
NewUsersDefinition usersDefinition = new NewUsersDefinition();
50+
usersDefinition.addNewUsersItem(user);
51+
52+
return usersApi.create(accountId, usersDefinition);
53+
}
54+
55+
public static void activateAgent(
56+
AccountsApi accountsApi,
57+
String accountId,
58+
String userId,
59+
String createdUserId
60+
) throws ApiException {
61+
AccountsApi.GetAgentUserAuthorizationsOptions options = accountsApi.new GetAgentUserAuthorizationsOptions();
62+
options.setPermissions(MANAGE);
63+
UserAuthorizations userAuthorizations = accountsApi.getAgentUserAuthorizations(accountId, createdUserId, options);
64+
65+
if (userAuthorizations.getAuthorizations() == null || userAuthorizations.getAuthorizations().isEmpty() ) {
66+
AuthorizationUser user = new AuthorizationUser();
67+
user.userId(createdUserId);
68+
user.accountId(accountId);
69+
70+
UserAuthorizationCreateRequest userAuthorizationCreateRequest = new UserAuthorizationCreateRequest();
71+
userAuthorizationCreateRequest.agentUser(user);
72+
userAuthorizationCreateRequest.permission(MANAGE);
73+
74+
accountsApi.createUserAuthorization(accountId, userId, userAuthorizationCreateRequest);
75+
}
76+
}
77+
78+
public static EnvelopesInformation getEnvelopes(
79+
EnvelopesApi envelopesApi,
80+
String accountId
81+
) throws ApiException {
82+
EnvelopesApi.ListStatusChangesOptions options = envelopesApi.new ListStatusChangesOptions();
83+
LocalDate date = LocalDate.now().minusDays(FROM_DATE_OFFSET_DAYS);
84+
options.setFromDate(DATE_FORMATTER.format(date));
85+
86+
return envelopesApi.listStatusChanges(accountId, options);
87+
}
88+
}

‎src/main/java/com/docusign/core/controller/IndexController.java‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,23 @@ public String index(ModelMap model, HttpServletResponse response) throws Excepti
6666

6767
Boolean isCFR = false;
6868

69+
if(this.config.isShareAccessExampleScenario()){
70+
this.config.setShareAccessExampleScenario(false);
71+
this.config.setAdditionalRedirect(true);
72+
73+
response.setStatus(response.SC_MOVED_TEMPORARILY);
74+
response.setHeader("Location", "/ds/mustAuthenticate");
75+
return null;
76+
}
77+
78+
if(this.config.isAdditionalRedirect()){
79+
this.config.setAdditionalRedirect(false);
80+
81+
response.setStatus(response.SC_MOVED_TEMPORARILY);
82+
response.setHeader("Location", "/eg043/listEnvelopes");
83+
return null;
84+
}
85+
6986
if (user.getAccessToken() != null && config.getSelectedApiType().equals(ApiType.ESIGNATURE)) {
7087
try {
7188
isCFR = Utils.isCfr(session.getBasePath(), user.getAccessToken(), session.getAccountId());

‎src/main/java/com/docusign/core/model/DoneExample.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public class DoneExample {
3535
private String title;
3636
private String name;
3737
private String message;
38+
private String redirect;
3839
private String json;
3940
private StackTraceElement[] stackTrace;
4041
private String stackTracePrinted;

‎src/main/java/com/docusign/core/model/Session.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public class Session implements Serializable {
1919
private static final long serialVersionUID = 2695379118371574037L;
2020

2121
private String accountId;
22+
private String createdUserId;
2223
private String accountName;
2324
private String basePath;
2425
private String roomsBasePath;

‎src/main/java/com/docusign/core/model/manifestModels/HelpingTexts.java‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
public class HelpingTexts {
99
public String EmailWontBeShared;
1010

11+
public String SaveAgentActivationCode;
12+
1113
public String PhoneNumberWontBeShared;
1214

1315
public String CCEmailShouldDifferFromSigner;

0 commit comments

Comments
 (0)