Skip to content

Commit 0875d3b

Browse files
committed
Added create account code example
1 parent d1bf48e commit 0875d3b

File tree

9 files changed

+271
-4
lines changed

9 files changed

+271
-4
lines changed

JWTAuth.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ public static OAuthToken AuthenticateWithJwt(string api, string clientId, string
7575
"asset_group_account_read",
7676
"asset_group_account_clone_write",
7777
"asset_group_account_clone_read",
78+
"organization_sub_account_write",
79+
"organization_sub_account_read",
7880
});
7981
}
8082

launcher-csharp.Tests/JwtLoginMethodUnitTest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ private string BuildConsentUrl(ExamplesApiType apiType, TestConfig testConfig)
9191
{
9292
scopes += "%20user_read%20user_write%20organization_read%20account_read%20group_read%20"
9393
+ "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";
94+
+ "asset_group_account_read%20asset_group_account_clone_write%20asset_group_account_clone_read"
95+
+ "%20organization_sub_account_write%20organization_sub_account_read";
9596
} else if (apiType == ExamplesApiType.WebForms)
9697
{
9798
scopes += "%20webforms_manage";
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
// <copyright file="CreateAccount.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 DocuSign.Admin.Client;
9+
using DocuSign.CodeExamples.Common;
10+
using DocuSign.CodeExamples.Controllers;
11+
using DocuSign.CodeExamples.Models;
12+
using Microsoft.AspNetCore.Mvc;
13+
using Newtonsoft.Json;
14+
15+
[Area("Admin")]
16+
[Route("aeg013")]
17+
public class CreateAccount : EgController
18+
{
19+
public CreateAccount(DsConfiguration config, LauncherTexts launcherTexts, IRequestItemsService requestItemsService)
20+
: base(config, launcherTexts, requestItemsService)
21+
{
22+
this.CodeExampleText = this.GetExampleText(this.EgName, ExamplesApiType.Admin);
23+
this.ViewBag.title = this.CodeExampleText.ExampleName;
24+
}
25+
26+
public override string EgName => "aeg013";
27+
28+
[MustAuthenticate]
29+
[SetViewBag]
30+
[HttpPost]
31+
[ValidateAntiForgeryToken]
32+
public ActionResult CloneAccountData(
33+
string email,
34+
string firstName,
35+
string lastName)
36+
{
37+
try
38+
{
39+
Guid? organizationId = this.RequestItemsService.OrganizationId;
40+
string accessToken = this.RequestItemsService.User.AccessToken;
41+
string basePath = this.RequestItemsService.Session.AdminApiBasePath;
42+
43+
var planItems = DocuSign.Admin.Examples.CreateAccount.GetFirstPlanItem(
44+
basePath,
45+
accessToken,
46+
organizationId);
47+
48+
var createdAccount = DocuSign.Admin.Examples.CreateAccount.CreateAccountBySubscription(
49+
basePath,
50+
accessToken,
51+
organizationId,
52+
email,
53+
firstName,
54+
lastName,
55+
planItems.SubscriptionId,
56+
planItems.PlanId);
57+
58+
this.ViewBag.h1 = this.CodeExampleText.ExampleName;
59+
this.ViewBag.message = this.CodeExampleText.ResultsPageText;
60+
this.ViewBag.Locals.Json = JsonConvert.SerializeObject(createdAccount, Formatting.Indented);
61+
62+
return this.View("example_done");
63+
}
64+
catch (ApiException apiException)
65+
{
66+
this.ViewBag.errorCode = apiException.ErrorCode;
67+
this.ViewBag.errorMessage = apiException.Message;
68+
this.ViewBag.SupportingTexts = this.LauncherTexts.ManifestStructure.SupportingTexts;
69+
70+
return this.View("Error");
71+
}
72+
}
73+
}
74+
}

launcher-csharp/Admin/Controllers/CreateUser.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public ActionResult Create(string email, string firstName, string lastName, stri
4444
try
4545
{
4646
// Call the Admin API to create a new user
47-
var user = DocuSign.CodeExamples.Admin.Examples.CreateUser.CreateNewUser(
47+
var user = Examples.CreateUser.CreateNewUser(
4848
accessToken,
4949
basePath,
5050
Guid.Parse(accountId),
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
// <copyright file="CreateAccount.cs" company="DocuSign">
2+
// Copyright (c) DocuSign. All rights reserved.
3+
// </copyright>
4+
5+
namespace DocuSign.Admin.Examples
6+
{
7+
using System;
8+
using System.Collections.Generic;
9+
using System.Linq;
10+
using DocuSign.Admin.Api;
11+
using DocuSign.Admin.Client;
12+
using DocuSign.Admin.Model;
13+
14+
public class CreateAccount
15+
{
16+
private const string AuthorizationHeader = "Authorization";
17+
private const string BearerPrefix = "Bearer ";
18+
private const string DefaultAccountName = "CreatedThroughAPI";
19+
private const string DefaultCountryCode = "US";
20+
21+
/// <summary>
22+
/// Helper method to configure DocuSign client with authorization headers.
23+
/// </summary>
24+
/// <param name="basePath">BasePath for API calls (URI)</param>
25+
/// <param name="accessToken">Access Token for API call (OAuth)</param>
26+
/// <returns>Configured DocuSignClient</returns>
27+
private static DocuSignClient GetConfiguredClient(string basePath, string accessToken)
28+
{
29+
var docuSignClient = new DocuSignClient(basePath);
30+
docuSignClient.Configuration.DefaultHeader[AuthorizationHeader] = BearerPrefix + accessToken;
31+
return docuSignClient;
32+
}
33+
34+
/// <summary>
35+
/// Get all plan items and return the first. Required scopes: organization_sub_account_read
36+
/// </summary>
37+
/// <param name="basePath">BasePath for API calls (URI)</param>
38+
/// <param name="accessToken">Access Token for API call (OAuth)</param>
39+
/// <param name="orgId">DocuSign Organization Id (GUID)</param>
40+
/// <returns>First available OrganizationSubscriptionResponse</returns>
41+
public static OrganizationSubscriptionResponse GetFirstPlanItem(
42+
string basePath,
43+
string accessToken,
44+
Guid? orgId)
45+
{
46+
var docuSignClient = GetConfiguredClient(basePath, accessToken);
47+
var assetGroupApi = new ProvisionAssetGroupApi(docuSignClient);
48+
49+
return assetGroupApi.GetOrganizationPlanItems(orgId).FirstOrDefault();
50+
}
51+
52+
/// <summary>
53+
/// Create an account by subscription id and plan id. Required scopes: organization_sub_account_write
54+
/// </summary>
55+
/// <param name="basePath">BasePath for API calls (URI)</param>
56+
/// <param name="accessToken">Access Token for API call (OAuth)</param>
57+
/// <param name="orgId">DocuSign Organization Id (GUID)</param>
58+
/// <param name="email">User email</param>
59+
/// <param name="firstName">User first name</param>
60+
/// <param name="lastName">User last name</param>
61+
/// <param name="subscriptionId">Subscription Id (string)</param>
62+
/// <param name="planId">Plan Id (GUID)</param>
63+
/// <returns>Result of account creation</returns>
64+
public static SubscriptionProvisionModelAssetGroupWorkResult CreateAccountBySubscription(
65+
string basePath,
66+
string accessToken,
67+
Guid? orgId,
68+
string email,
69+
string firstName,
70+
string lastName,
71+
string subscriptionId,
72+
Guid? planId)
73+
{
74+
var docuSignClient = GetConfiguredClient(basePath, accessToken);
75+
var assetGroupApi = new ProvisionAssetGroupApi(docuSignClient);
76+
77+
var subAccountRequest = BuildSubAccountRequest(email, firstName, lastName, subscriptionId, planId);
78+
79+
return assetGroupApi.CreateAssetGroupAccount(orgId, subAccountRequest);
80+
}
81+
82+
/// <summary>
83+
/// Helper method to build SubAccountCreateRequest object.
84+
/// </summary>
85+
/// <param name="email">User email</param>
86+
/// <param name="firstName">User first name</param>
87+
/// <param name="lastName">User last name</param>
88+
/// <param name="subscriptionId">Subscription Id (string)</param>
89+
/// <param name="planId">Plan Id (GUID)</param>
90+
/// <returns>Configured SubAccountCreateRequest object</returns>
91+
private static SubAccountCreateRequest BuildSubAccountRequest(
92+
string email,
93+
string firstName,
94+
string lastName,
95+
string subscriptionId,
96+
Guid? planId)
97+
{
98+
return new SubAccountCreateRequest
99+
{
100+
SubscriptionDetails = new SubAccountCreateRequestSubAccountCreationSubscription
101+
{
102+
Id = subscriptionId,
103+
PlanId = planId,
104+
Modules = new List<Guid?>(),
105+
},
106+
TargetAccount = new SubAccountCreateRequestSubAccountCreationTargetAccountDetails
107+
{
108+
Name = DefaultAccountName,
109+
CountryCode = DefaultCountryCode,
110+
Admin = new SubAccountCreateRequestSubAccountCreationTargetAccountAdmin
111+
{
112+
Email = email,
113+
FirstName = firstName,
114+
LastName = lastName,
115+
Locale = SubAccountCreateRequestSubAccountCreationTargetAccountAdmin.LocaleEnum.En,
116+
},
117+
},
118+
};
119+
}
120+
}
121+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
@{
2+
int formNumber = 0;
3+
int emailInputNumber = 0;
4+
int firstNameInputNumber = 1;
5+
int lastNameInputNumber = 2;
6+
}
7+
8+
<h4>@Html.Raw(ViewBag.CodeExampleText.ExampleName)</h4>
9+
<p>
10+
@Html.Raw(ViewBag.CodeExampleText.ExampleDescription)
11+
</p>
12+
13+
14+
<partial name="../../../Views/Shared/LinkToMethodView" model="ViewBag.CodeExampleText" />
15+
16+
<p>
17+
@Html.Raw(
18+
@String.Format(
19+
ViewBag.SupportingTexts.ViewSourceFile,
20+
"<a target='_blank' href=" + @ViewBag.source + ">CreateAccount.cs</a>"
21+
)
22+
)
23+
</p>
24+
25+
<form class="eg" asp-action="CloneAccountData" method="post" data-busy="form">
26+
<div class="form-group">
27+
<label for="email">
28+
@Html.Raw(ViewBag.CodeExampleText.Forms[formNumber].Inputs[emailInputNumber].InputName)
29+
</label>
30+
31+
<input type="email"
32+
class="form-control"
33+
id="email"
34+
name="email"
35+
aria-describedby="emailHelp"
36+
placeholder="@ViewBag.CodeExampleText.Forms[formNumber].Inputs[emailInputNumber].InputPlaceholder"
37+
required>
38+
</div>
39+
40+
<div class="form-group">
41+
<label for="firstName">
42+
@Html.Raw(ViewBag.CodeExampleText.Forms[formNumber].Inputs[firstNameInputNumber].InputName)
43+
</label>
44+
45+
<input type="text"
46+
class="form-control"
47+
id="firstName"
48+
placeholder="@ViewBag.CodeExampleText.Forms[formNumber].Inputs[firstNameInputNumber].InputPlaceholder"
49+
name="firstName"
50+
required />
51+
</div>
52+
53+
<div class="form-group">
54+
<label for="lastName">
55+
@Html.Raw(ViewBag.CodeExampleText.Forms[formNumber].Inputs[lastNameInputNumber].InputName)
56+
</label>
57+
58+
<input type="text"
59+
class="form-control"
60+
id="lastName"
61+
placeholder="@ViewBag.CodeExampleText.Forms[formNumber].Inputs[lastNameInputNumber].InputPlaceholder"
62+
name="lastName"
63+
required />
64+
</div>
65+
66+
<button type="submit" class="btn btn-primary">@Html.Raw(ViewBag.SupportingTexts.SubmitButton)</button>
67+
</form>

launcher-csharp/Startup.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ public Startup(IConfiguration configuration)
7979
"asset_group_account_read",
8080
"asset_group_account_clone_write",
8181
"asset_group_account_clone_read",
82+
"organization_sub_account_write",
83+
"organization_sub_account_read",
8284
});
8385

8486
this.apiTypes.Add(ExamplesApiType.WebForms, new List<string>

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 asset_group_account_read asset_group_account_clone_write asset_group_account_clone_read";
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 organization_sub_account_write organization_sub_account_read";
120120
}
121121
else if (apiType == ExamplesApiType.WebForms)
122122
{

launcher-csharp/launcher-csharp.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
</ItemGroup>
3737

3838
<ItemGroup>
39-
<PackageReference Include="DocuSign.Admin" Version="1.4.0" />
39+
<PackageReference Include="DocuSign.Admin" Version="2.0.0-rc4" />
4040
<PackageReference Include="DocuSign.Click" Version="1.2.2" />
4141
<PackageReference Include="DocuSign.eSign.dll" Version="6.9.0-rc1" />
4242
<PackageReference Include="DocuSign.Monitor" Version="1.1.1" />

0 commit comments

Comments
 (0)