Skip to content

Commit 3f391a7

Browse files
annahiletaAaronWDS
andauthored
Added account cloning code example (#117)
* added account cloning code example * fixes after review * cd Snippet markers --------- Co-authored-by: AaronWDS <aaron.wilde@docusign.com>
1 parent aabd6c5 commit 3f391a7

File tree

8 files changed

+241
-4
lines changed

8 files changed

+241
-4
lines changed

pom.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
<swagger-core-version>2.2.8</swagger-core-version>
3535
<jackson-version>2.14.2</jackson-version>
3636
<jersey2.version>3.0.9</jersey2.version>
37-
3837
</properties>
3938

4039

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,9 @@ public class WorkArguments {
8787
private String agentEmail;
8888
private String agentName;
8989
private String activationCode;
90+
private UUID sourceAccountId;
91+
private String targetAccountName;
92+
private String targetAccountFirstName;
93+
private String targetAccountLastName;
94+
private String targetAccountEmail;
9095
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.docusign.controller.admin.examples;
2+
3+
import com.docusign.DSConfiguration;
4+
import com.docusign.admin.api.ProvisionAssetGroupApi;
5+
import com.docusign.admin.model.AssetGroupAccountsResponse;
6+
import com.docusign.admin.model.AssetGroupAccountClone;
7+
import com.docusign.common.WorkArguments;
8+
import com.docusign.controller.admin.services.CloneAccountService;
9+
import com.docusign.core.model.DoneExample;
10+
import com.docusign.core.model.Session;
11+
import com.docusign.core.model.User;
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.util.UUID;
19+
20+
/**
21+
* This example demonstrates how to clone the account.
22+
*/
23+
@Controller
24+
@RequestMapping("/a012")
25+
public class A012CloneAccount extends AbstractAdminController {
26+
27+
@Autowired
28+
public A012CloneAccount(DSConfiguration config, Session session, User user) {
29+
super(config, "a012", user, session);
30+
}
31+
32+
@Override
33+
protected void onInitModel(WorkArguments args, ModelMap model) throws Exception {
34+
super.onInitModel(args, model);
35+
UUID organizationId = this.getOrganizationId(this.user.getAccessToken(), this.session.getBasePath());
36+
ProvisionAssetGroupApi provisionAssetGroupApi = this.createProvisionAssetGroupApi(user.getAccessToken(), session.getBasePath());
37+
38+
AssetGroupAccountsResponse groupAccounts = (new CloneAccountService()).getGroupAccounts(provisionAssetGroupApi, organizationId);
39+
model.addAttribute("groups", groupAccounts.getAssetGroupAccounts());
40+
}
41+
42+
@Override
43+
protected Object doWork(WorkArguments args, ModelMap model, HttpServletResponse response) throws Exception {
44+
String accessToken = this.user.getAccessToken();
45+
String basePath = this.session.getBasePath();
46+
UUID organizationId = this.getOrganizationId(accessToken, basePath);
47+
ProvisionAssetGroupApi provisionAssetGroupApi = this.createProvisionAssetGroupApi(accessToken, basePath);
48+
49+
AssetGroupAccountClone assetGroupAccountClone =(new CloneAccountService()).getClonedAccount(
50+
provisionAssetGroupApi,
51+
organizationId,
52+
args.getSourceAccountId(),
53+
args.getTargetAccountName(),
54+
args.getTargetAccountEmail(),
55+
args.getTargetAccountFirstName(),
56+
args.getTargetAccountLastName());
57+
58+
DoneExample.createDefault(getTextForCodeExampleByApiType().ExampleName)
59+
.withMessage(getTextForCodeExampleByApiType().ResultsPageText)
60+
.withJsonObject(assetGroupAccountClone)
61+
.addToModel(model, config);
62+
63+
return DONE_EXAMPLE_PAGE;
64+
}
65+
}

src/main/java/com/docusign/controller/admin/examples/AbstractAdminController.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,10 +223,24 @@ protected ProductPermissionProfilesApi createProductPermissionProfilesApi(
223223
* creates an instance of the AdminGroupsApi class silently.
224224
* @param accessToken user's access token
225225
* @param basePath basePath to the server
226-
* @return an instance of the {@link AdminGroupsApi}
226+
* @return an instance of the {@link DsGroupsApi}
227227
*/
228228
protected DsGroupsApi createDSGroupsApi(String accessToken, String basePath) {
229229
ApiClient apiClient = createApiClient(accessToken, basePath);
230230
return new DsGroupsApi(apiClient);
231231
}
232+
233+
/**
234+
* Creates a new instance of the ProvisionAssetGroupApi. This method
235+
* creates an instance of the ProvisionAssetGroupApi class silently.
236+
* @param accessToken user's access token
237+
* @param basePath basePath to the server
238+
* @return an instance of the {@link ProvisionAssetGroupApi}
239+
*/
240+
protected ProvisionAssetGroupApi createProvisionAssetGroupApi(String accessToken, String basePath) {
241+
//ds-snippet-start:Admin12Step2
242+
ApiClient apiClient = createApiClient(accessToken, basePath);
243+
return new ProvisionAssetGroupApi(apiClient);
244+
//ds-snippet-end:Admin12Step2
245+
}
232246
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.docusign.controller.admin.services;
2+
3+
import com.docusign.admin.api.ProvisionAssetGroupApi;
4+
import com.docusign.admin.client.ApiException;
5+
import com.docusign.admin.model.AssetGroupAccountClone;
6+
import com.docusign.admin.model.AssetGroupAccountsResponse;
7+
import com.docusign.admin.model.AssetGroupAccountCloneSourceAccount;
8+
import com.docusign.admin.model.AssetGroupAccountCloneTargetAccount;
9+
import com.docusign.admin.model.AssetGroupAccountCloneTargetAccountAdmin;
10+
11+
import java.util.UUID;
12+
13+
public class CloneAccountService {
14+
public AssetGroupAccountsResponse getGroupAccounts(
15+
ProvisionAssetGroupApi provisionAssetGroupApi,
16+
UUID organizationId
17+
) throws ApiException {
18+
19+
//ds-snippet-start:Admin12Step3
20+
ProvisionAssetGroupApi.GetAssetGroupAccountsOptions options = provisionAssetGroupApi.new GetAssetGroupAccountsOptions();
21+
options.setCompliant(true);
22+
return provisionAssetGroupApi.getAssetGroupAccounts(organizationId, options);
23+
//ds-snippet-end:Admin12Step3
24+
}
25+
26+
public AssetGroupAccountClone getClonedAccount(
27+
ProvisionAssetGroupApi provisionAssetGroupApi,
28+
UUID organizationId,
29+
UUID sourceAccountId,
30+
String targetAccountName,
31+
String targetAccountEmail,
32+
String targetAccountFirstName,
33+
String targetAccountLastName
34+
) throws ApiException {
35+
//ds-snippet-start:Admin12Step4
36+
String countryCode = "US";
37+
38+
AssetGroupAccountClone accountData = new AssetGroupAccountClone();
39+
AssetGroupAccountCloneSourceAccount sourceAccount = new AssetGroupAccountCloneSourceAccount();
40+
sourceAccount.setId(sourceAccountId);
41+
42+
AssetGroupAccountCloneTargetAccount targetAccount = new AssetGroupAccountCloneTargetAccount();
43+
targetAccount.setName(targetAccountName);
44+
targetAccount.setCountryCode(countryCode);
45+
46+
AssetGroupAccountCloneTargetAccountAdmin admin = new AssetGroupAccountCloneTargetAccountAdmin();
47+
admin.setEmail(targetAccountEmail);
48+
admin.setFirstName(targetAccountFirstName);
49+
admin.setLastName(targetAccountLastName);
50+
51+
targetAccount.admin(admin);
52+
accountData.setSourceAccount(sourceAccount);
53+
accountData.setTargetAccount(targetAccount);
54+
//ds-snippet-end:Admin12Step4
55+
56+
//ds-snippet-start:Admin12Step5
57+
return provisionAssetGroupApi.cloneAssetGroupAccount(organizationId, accountData);
58+
//ds-snippet-end:Admin12Step5
59+
}
60+
}

src/main/java/com/docusign/core/model/ApiType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ public enum ApiType {
55
ROOMS("Rooms API", new String[]{"signature", "dtr.rooms.read", "dtr.rooms.write", "dtr.documents.read", "dtr.documents.write", "dtr.profile.read", "dtr.profile.write", "dtr.company.read", "dtr.company.write", "room_forms"}),
66
CLICK("Click API", new String[] {"click.manage", "click.send"}),
77
MONITOR("Monitor API", new String[] {"signature", "impersonation"}),
8-
ADMIN("Admin API", new String[] {"user_write", "signature", "impersonation", "group_read", "organization_read", "permission_read", "user_read", "account_read", "domain_read", "identity_provider_read", "user_data_redact"});
8+
ADMIN("Admin API", new String[] {"user_write", "signature", "impersonation", "group_read", "organization_read", "permission_read", "user_read", "account_read", "domain_read", "identity_provider_read", "user_data_redact", "asset_group_account_read", "asset_group_account_clone_write", "asset_group_account_clone_read"});
99

1010
final String value;
1111
final String[] scopes;

src/main/resources/application.example.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"client-authentication-method": "client_secret_basic",
3030
"authorization-grant-type": "authorization_code",
3131
"redirect-uri": "{baseUrl}/login/oauth2/code/acg",
32-
"scope": "user_write, signature, impersonation, group_read, organization_read, permission_read, user_read, account_read, domain_read, identity_provider_read, user_data_redact, click.manage, click.send, dtr.rooms.read, dtr.rooms.write, dtr.documents.read, dtr.documents.write, dtr.profile.read, dtr.profile.write, dtr.company.read, dtr.company.write, room_forms"
32+
"scope": "user_write, signature, impersonation, group_read, organization_read, permission_read, user_read, account_read, domain_read, identity_provider_read, user_data_redact, click.manage, click.send, dtr.rooms.read, dtr.rooms.write, dtr.documents.read, dtr.documents.write, dtr.profile.read, dtr.profile.write, dtr.company.read, dtr.company.write, room_forms, asset_group_account_read, asset_group_account_clone_write, asset_group_account_clone_read"
3333
},
3434
"jwt": {
3535
"client-id": "{INTEGRATION_KEY_JWT}",
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core' %>
2+
<jsp:include page='../../../partials/head.jsp'/>
3+
4+
<c:set var="formNumber" value="0" scope="page" />
5+
<c:set var="sourceAccountIdInputNumber" value="0" scope="page" />
6+
<c:set var="targetAccountNameInputNumber" value="1" scope="page" />
7+
<c:set var="targetAccountFirstNameInputNumber" value="2" scope="page" />
8+
<c:set var="targetAccountLastNameInputNumber" value="3" scope="page" />
9+
<c:set var="targetAccountEmailInputNumber" value="4" scope="page" />
10+
11+
<h4>12. ${example.getExampleName()}</h4>
12+
<p>${example.getExampleDescription()}</p>
13+
14+
<c:if test='${showDoc}'>
15+
<p><a target='_blank' rel="noopener noreferrer" href='${documentation}'>Documentation</a> about this example.</p>
16+
</c:if>
17+
18+
<jsp:include page="../../links_to_api_methods.jsp" />
19+
20+
<p>
21+
${viewSourceFile}
22+
</p>
23+
24+
<form class="eg" method="post" data-busy="form">
25+
<div class="form-group">
26+
<label for="sourceAccountId">
27+
${example.getForms().get(formNumber).getInputs().get(sourceAccountIdInputNumber).getInputName()}
28+
</label>
29+
30+
<select id="sourceAccountId" name="sourceAccountId" class="form-control">
31+
<c:forEach items="${groups}" var="group">
32+
<option value="${group.getAccountId()}">${group.getAccountName()}</option>
33+
</c:forEach>
34+
</select>
35+
</div>
36+
37+
<div class="form-group">
38+
<label for="targetAccountName">
39+
${example.getForms().get(formNumber).getInputs().get(targetAccountNameInputNumber).getInputName()}
40+
</label>
41+
42+
<input type="text"
43+
class="form-control"
44+
id="targetAccountName"
45+
name="targetAccountName"
46+
placeholder="${example.getForms().get(formNumber).getInputs().get(targetAccountNameInputNumber).getInputPlaceholder()}"
47+
required>
48+
</div>
49+
50+
<div class="form-group">
51+
<label for="targetAccountFirstName">
52+
${example.getForms().get(formNumber).getInputs().get(targetAccountFirstNameInputNumber).getInputName()}
53+
</label>
54+
55+
<input type="text"
56+
class="form-control"
57+
id="targetAccountFirstName"
58+
name="targetAccountFirstName"
59+
placeholder="${example.getForms().get(formNumber).getInputs().get(targetAccountFirstNameInputNumber).getInputPlaceholder()}"
60+
required>
61+
</div>
62+
63+
<div class="form-group">
64+
<label for="targetAccountLastName">
65+
${example.getForms().get(formNumber).getInputs().get(targetAccountLastNameInputNumber).getInputName()}
66+
</label>
67+
68+
<input type="text"
69+
class="form-control"
70+
id="targetAccountLastName"
71+
name="targetAccountLastName"
72+
placeholder="${example.getForms().get(formNumber).getInputs().get(targetAccountLastNameInputNumber).getInputPlaceholder()}"
73+
required>
74+
</div>
75+
76+
<div class="form-group">
77+
<label for="targetAccountEmail">
78+
${example.getForms().get(formNumber).getInputs().get(targetAccountEmailInputNumber).getInputName()}
79+
</label>
80+
81+
<input type="email"
82+
class="form-control"
83+
id="targetAccountEmail"
84+
name="targetAccountEmail"
85+
aria-describedby="emailHelp"
86+
placeholder="${example.getForms().get(formNumber).getInputs().get(targetAccountEmailInputNumber).getInputPlaceholder()}"
87+
required>
88+
</div>
89+
90+
<input type="hidden" name="csrf_token" value="${csrfToken}"/>
91+
<button type="submit" class="btn btn-primary">${launcherTexts.getSubmitButton()}</button>
92+
</form>
93+
94+
<jsp:include page='../../../partials/foot.jsp'/>

0 commit comments

Comments
 (0)