Skip to content

Commit 9a2a900

Browse files
committed
added clone account code example
1 parent ad9966b commit 9a2a900

File tree

7 files changed

+266
-2
lines changed

7 files changed

+266
-2
lines changed

JWTAuth.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ public static OAuthToken AuthenticateWithJWT(string api, string clientId, string
7272
"identity_provider_read",
7373
"domain_read",
7474
"user_data_redact",
75+
"asset_group_account_read",
76+
"asset_group_account_clone_write",
77+
"asset_group_account_clone_read",
7578
});
7679
}
7780

launcher-csharp.Tests/JwtLoginMethodUnitTest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ private string BuildConsentUrl(ExamplesAPIType apiType, TestConfig _testConfig)
9090
else if (apiType == ExamplesAPIType.Admin)
9191
{
9292
scopes += "%20user_read%20user_write%20organization_read%20account_read%20group_read%20"
93-
+ "permission_read%20identity_provider_read%20domain_read%20user_data_redact";
93+
+ "permission_read%20identity_provider_read%20domain_read%20user_data_redact%20"
94+
+ "asset_group_account_read%20asset_group_account_clone_write%20asset_group_account_clone_read";
9495
}
9596

9697
string caret = "";
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// <copyright file="CloneAccount.cs" company="DocuSign">
2+
// Copyright (c) DocuSign. All rights reserved.
3+
// </copyright>
4+
5+
namespace DocuSign.CodeExamples.Admin.Controllers
6+
{
7+
using System;
8+
using System.Linq;
9+
using DocuSign.Admin.Client;
10+
using DocuSign.Admin.Model;
11+
using DocuSign.CodeExamples.Common;
12+
using DocuSign.CodeExamples.Controllers;
13+
using DocuSign.CodeExamples.Models;
14+
using Microsoft.AspNetCore.Mvc;
15+
using Newtonsoft.Json;
16+
17+
[Area("Admin")]
18+
[Route("aeg012")]
19+
public class CloneAccount : EgController
20+
{
21+
public CloneAccount(DSConfiguration config, LauncherTexts launcherTexts, IRequestItemsService requestItemsService)
22+
: base(config, launcherTexts, requestItemsService)
23+
{
24+
this.CodeExampleText = this.GetExampleText(EgName, ExamplesAPIType.Admin);
25+
this.ViewBag.title = this.CodeExampleText.ExampleName;
26+
}
27+
28+
public override string EgName => "aeg012";
29+
30+
[MustAuthenticate]
31+
[HttpGet]
32+
public override IActionResult Get()
33+
{
34+
IActionResult actionResult = base.Get();
35+
if (this.RequestItemsService.EgName == this.EgName)
36+
{
37+
return actionResult;
38+
}
39+
40+
Guid? organizationId = this.RequestItemsService.OrganizationId;
41+
string accessToken = this.RequestItemsService.User.AccessToken;
42+
string basePath = this.RequestItemsService.Session.AdminApiBasePath;
43+
44+
AssetGroupAccountsResponse accounts = DocuSign.Admin.Examples.CloneAccount.GetGroupAccounts(basePath, accessToken, organizationId);
45+
this.ViewBag.Accounts = accounts.AssetGroupAccounts.ToList();
46+
47+
return this.View(this.EgName, this);
48+
}
49+
50+
[MustAuthenticate]
51+
[SetViewBag]
52+
[HttpPost]
53+
[ValidateAntiForgeryToken]
54+
public ActionResult CloneAccountData(
55+
Guid? sourceAccountId,
56+
string targetAccountName,
57+
string targetAccountFirstName,
58+
string targetAccountLastName,
59+
string targetAccountEmail)
60+
{
61+
try
62+
{
63+
Guid? organizationId = this.RequestItemsService.OrganizationId;
64+
string accessToken = this.RequestItemsService.User.AccessToken;
65+
string basePath = this.RequestItemsService.Session.AdminApiBasePath;
66+
67+
AssetGroupAccountClone response = DocuSign.Admin.Examples.CloneAccount.CloneGroupAccount(
68+
basePath,
69+
accessToken,
70+
organizationId,
71+
sourceAccountId,
72+
targetAccountName,
73+
targetAccountFirstName,
74+
targetAccountLastName,
75+
targetAccountEmail);
76+
77+
this.ViewBag.h1 = this.CodeExampleText.ExampleName;
78+
this.ViewBag.message = this.CodeExampleText.ResultsPageText;
79+
this.ViewBag.Locals.Json = JsonConvert.SerializeObject(response, Formatting.Indented);
80+
81+
return this.View("example_done");
82+
}
83+
catch (ApiException apiException)
84+
{
85+
this.ViewBag.errorCode = apiException.ErrorCode;
86+
this.ViewBag.errorMessage = apiException.Message;
87+
this.ViewBag.SupportingTexts = this.LauncherTexts.ManifestStructure.SupportingTexts;
88+
89+
return this.View("Error");
90+
}
91+
}
92+
}
93+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// <copyright file="CloneAccount.cs" company="DocuSign">
2+
// Copyright (c) DocuSign. All rights reserved.
3+
// </copyright>
4+
5+
namespace DocuSign.Admin.Examples
6+
{
7+
using System;
8+
using DocuSign.Admin.Api;
9+
using DocuSign.Admin.Client;
10+
using DocuSign.Admin.Model;
11+
12+
public class CloneAccount
13+
{
14+
private static readonly string AuthorizationHeader = "Authorization";
15+
private static readonly string Bearer = "Bearer ";
16+
17+
/// <summary>
18+
/// Get all accounts in asset groups for the organization. Required scopes: asset_group_account_read
19+
/// </summary>
20+
/// <param name="basePath">BasePath for API calls (URI)</param>
21+
/// <param name="accessToken">Access Token for API call (OAuth)</param>
22+
/// <param name="orgId">DocuSign Organization Id (GUID)</param>
23+
/// <returns>AssetGroupAccountsResponse</returns>
24+
public static AssetGroupAccountsResponse GetGroupAccounts(string basePath, string accessToken, Guid? orgId)
25+
{
26+
DocuSignClient docuSignClient = new DocuSignClient(basePath);
27+
docuSignClient.Configuration.DefaultHeader.Add(AuthorizationHeader, Bearer + accessToken);
28+
29+
ProvisionAssetGroupApi assetGroupApi = new ProvisionAssetGroupApi(docuSignClient);
30+
ProvisionAssetGroupApi.GetAssetGroupAccountsOptions options = new ProvisionAssetGroupApi.GetAssetGroupAccountsOptions
31+
{
32+
compliant = true,
33+
};
34+
35+
return assetGroupApi.GetAssetGroupAccounts(orgId, options);
36+
}
37+
38+
/// <summary>
39+
/// Clones an existing DocuSign account to a new DocuSign account.
40+
/// </summary>
41+
/// <param name="basePath">BasePath for API calls (URI)</param>
42+
/// <param name="accessToken">Access Token for API call (OAuth)</param>
43+
/// <param name="orgId">DocuSign Organization Id (GUID)</param>
44+
/// <param name="sourceAccountId">Source account Id (GUID)</param>
45+
/// <param name="targetAccountName">Target account name (string)</param>
46+
/// <param name="targetAccountFirstName">Target account first name (string)</param>
47+
/// <param name="targetAccountLastName">Target account last name (string)</param>
48+
/// <param name="targetAccountEmail">Target account email (string)</param>
49+
/// <returns>AssetGroupAccountClone</returns>
50+
public static AssetGroupAccountClone CloneGroupAccount(
51+
string basePath,
52+
string accessToken,
53+
Guid? orgId,
54+
Guid? sourceAccountId,
55+
string targetAccountName,
56+
string targetAccountFirstName,
57+
string targetAccountLastName,
58+
string targetAccountEmail)
59+
{
60+
var docuSignClient = new DocuSignClient(basePath);
61+
docuSignClient.Configuration.DefaultHeader.Add(AuthorizationHeader, Bearer + accessToken);
62+
63+
string countryCode = "US";
64+
var accountData = new AssetGroupAccountClone
65+
{
66+
SourceAccount = new AssetGroupAccountCloneSourceAccount
67+
{
68+
Id = sourceAccountId,
69+
},
70+
TargetAccount = new AssetGroupAccountCloneTargetAccount
71+
{
72+
Name = targetAccountName,
73+
Admin = new AssetGroupAccountCloneTargetAccountAdmin
74+
{
75+
FirstName = targetAccountFirstName,
76+
LastName = targetAccountLastName,
77+
Email = targetAccountEmail,
78+
},
79+
CountryCode = countryCode,
80+
},
81+
};
82+
83+
var assetGroupApi = new ProvisionAssetGroupApi(docuSignClient);
84+
return assetGroupApi.CloneAssetGroupAccount(orgId, accountData);
85+
}
86+
}
87+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
@{
2+
int formNumber = 0;
3+
int sourceAccountIdInputNumber = 0;
4+
int targetAccountNameInputNumber = 1;
5+
int targetAccountFirstNameInputNumber = 2;
6+
int targetAccountLastNameInputNumber = 3;
7+
int targetAccountEmailInputNumber = 4;
8+
}
9+
10+
<h4>@Html.Raw(ViewBag.CodeExampleText.ExampleName)</h4>
11+
<p>
12+
@Html.Raw(ViewBag.CodeExampleText.ExampleDescription)
13+
</p>
14+
15+
16+
<partial name="../../../Views/Shared/LinkToMethodView" model="ViewBag.CodeExampleText" />
17+
18+
<p>
19+
@Html.Raw(
20+
@String.Format(
21+
ViewBag.SupportingTexts.ViewSourceFile,
22+
"<a target='_blank' href=" + @ViewBag.source + ">CloneAccount.cs</a>"
23+
)
24+
)
25+
</p>
26+
27+
<form class="eg" asp-action="CloneAccountData" method="post" data-busy="form">
28+
<div class="form-group">
29+
<label for="sourceAccountId">
30+
@Html.Raw(ViewBag.CodeExampleText.Forms[formNumber].Inputs[sourceAccountIdInputNumber].InputName)
31+
</label>
32+
33+
@Html.DropDownList(
34+
"sourceAccountId",
35+
new SelectList(ViewBag.Accounts, "AccountId", "AccountName"),
36+
new { @class = "form-control" }
37+
)
38+
</div>
39+
40+
<div class="form-group">
41+
<label for="targetAccountName">
42+
@Html.Raw(ViewBag.CodeExampleText.Forms[formNumber].Inputs[targetAccountNameInputNumber].InputName)
43+
</label>
44+
45+
<input type="text" class="form-control" id="targetAccountName" name="targetAccountName"
46+
placeholder="@ViewBag.CodeExampleText.Forms[formNumber].Inputs[targetAccountNameInputNumber].InputPlaceholder" required>
47+
</div>
48+
49+
<div class="form-group">
50+
<label for="targetAccountFirstName">
51+
@Html.Raw(ViewBag.CodeExampleText.Forms[formNumber].Inputs[targetAccountFirstNameInputNumber].InputName)
52+
</label>
53+
54+
<input type="text" class="form-control" id="targetAccountFirstName" name="targetAccountFirstName"
55+
placeholder="@ViewBag.CodeExampleText.Forms[formNumber].Inputs[targetAccountFirstNameInputNumber].InputPlaceholder" required>
56+
</div>
57+
58+
<div class="form-group">
59+
<label for="targetAccountLastName">
60+
@Html.Raw(ViewBag.CodeExampleText.Forms[formNumber].Inputs[targetAccountLastNameInputNumber].InputName)
61+
</label>
62+
63+
<input type="text" class="form-control" id="targetAccountLastName" name="targetAccountLastName"
64+
placeholder="@ViewBag.CodeExampleText.Forms[formNumber].Inputs[targetAccountLastNameInputNumber].InputPlaceholder" required>
65+
</div>
66+
67+
<div class="form-group">
68+
<label for="targetAccountEmail">
69+
@Html.Raw(ViewBag.CodeExampleText.Forms[formNumber].Inputs[targetAccountEmailInputNumber].InputName)
70+
</label>
71+
72+
<input type="email" class="form-control" id="targetAccountEmail" name="targetAccountEmail"
73+
aria-describedby="emailHelp" placeholder="@ViewBag.CodeExampleText.Forms[formNumber].Inputs[targetAccountEmailInputNumber].InputPlaceholder" required>
74+
</div>
75+
76+
<button type="submit" class="btn btn-primary">@Html.Raw(ViewBag.SupportingTexts.SubmitButton)</button>
77+
</form>

launcher-csharp/Startup.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ public Startup(IConfiguration configuration)
7272
"permission_read",
7373
"identity_provider_read",
7474
"user_data_redact",
75+
"asset_group_account_read",
76+
"asset_group_account_clone_write",
77+
"asset_group_account_clone_read",
7578
});
7679
}
7780

launcher-csharp/eSignature/Controllers/AccountController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ private string BuildConsentURL()
116116
}
117117
else if (apiType == ExamplesAPIType.Admin)
118118
{
119-
scopes += " user_read user_write organization_read account_read group_read permission_read identity_provider_read domain_read user_data_redact";
119+
scopes += " user_read user_write organization_read account_read group_read permission_read identity_provider_read domain_read user_data_redact asset_group_account_read asset_group_account_clone_write asset_group_account_clone_read";
120120
}
121121

122122
return this.Configuration["DocuSign:AuthorizationEndpoint"] + "?response_type=code" +

0 commit comments

Comments
 (0)