Skip to content

Commit 65dc4be

Browse files
authored
Merge pull request #184 from docusign/feature/create-account-example
Feature/create account example
2 parents b3a17d6 + 09cc450 commit 65dc4be

File tree

12 files changed

+3041
-2740
lines changed

12 files changed

+3041
-2740
lines changed

JWTAuth.cs

+2
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

Quick_ACG/Quick_ACG.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
</ItemGroup>
4848

4949
<ItemGroup>
50-
<PackageReference Include="DocuSign.Admin" Version="2.0.0-rc3" />
50+
<PackageReference Include="DocuSign.Admin" Version="2.0.0-rc4" />
5151
<PackageReference Include="DocuSign.eSign.dll" Version="8.0.0-rc2" />
5252
<PackageReference Include="Microsoft.AspNetCore.Session" Version="2.2.0" />
5353
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.18" />

launcher-csharp.Tests/JwtLoginMethodUnitTest.cs

+2-1
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";

launcher-csharp.Tests/launcher-csharp.Tests.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
</ItemGroup>
2525

2626
<ItemGroup>
27-
<PackageReference Include="DocuSign.Admin" Version="2.0.0-rc3" />
27+
<PackageReference Include="DocuSign.Admin" Version="2.0.0-rc4" />
2828
<PackageReference Include="FluentAssertions" Version="6.12.0" />
2929
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
3030
<PackageReference Include="xunit" Version="2.9.0" />
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 CreateAccountData(
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

+1-1
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),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
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+
/// Get all plan items and return the first. Required scopes: organization_sub_account_read
23+
/// </summary>
24+
/// <param name="basePath">BasePath for API calls (URI)</param>
25+
/// <param name="accessToken">Access Token for API call (OAuth)</param>
26+
/// <param name="orgId">DocuSign Organization Id (GUID)</param>
27+
/// <returns>First available OrganizationSubscriptionResponse</returns>
28+
public static OrganizationSubscriptionResponse GetFirstPlanItem(
29+
string basePath,
30+
string accessToken,
31+
Guid? orgId)
32+
{
33+
//ds-snippet-start:Admin13Step2
34+
var docuSignClient = GetConfiguredClient(basePath, accessToken);
35+
var assetGroupApi = new ProvisionAssetGroupApi(docuSignClient);
36+
//ds-snippet-end:Admin13Step2
37+
38+
//ds-snippet-start:Admin13Step3
39+
return assetGroupApi.GetOrganizationPlanItems(orgId).FirstOrDefault();
40+
//ds-snippet-end:Admin13Step3
41+
}
42+
43+
/// <summary>
44+
/// Create an account by subscription id and plan id. Required scopes: organization_sub_account_write
45+
/// </summary>
46+
/// <param name="basePath">BasePath for API calls (URI)</param>
47+
/// <param name="accessToken">Access Token for API call (OAuth)</param>
48+
/// <param name="orgId">DocuSign Organization Id (GUID)</param>
49+
/// <param name="email">User email</param>
50+
/// <param name="firstName">User first name</param>
51+
/// <param name="lastName">User last name</param>
52+
/// <param name="subscriptionId">Subscription Id (string)</param>
53+
/// <param name="planId">Plan Id (GUID)</param>
54+
/// <returns>Result of account creation</returns>
55+
public static SubscriptionProvisionModelAssetGroupWorkResult CreateAccountBySubscription(
56+
string basePath,
57+
string accessToken,
58+
Guid? orgId,
59+
string email,
60+
string firstName,
61+
string lastName,
62+
string subscriptionId,
63+
Guid? planId)
64+
{
65+
var docuSignClient = GetConfiguredClient(basePath, accessToken);
66+
var assetGroupApi = new ProvisionAssetGroupApi(docuSignClient);
67+
68+
//ds-snippet-start:Admin13Step4
69+
var subAccountRequest = BuildSubAccountRequest(email, firstName, lastName, subscriptionId, planId);
70+
//ds-snippet-end:Admin13Step4
71+
72+
//ds-snippet-start:Admin13Step5
73+
return assetGroupApi.CreateAssetGroupAccount(orgId, subAccountRequest);
74+
//ds-snippet-end:Admin13Step5
75+
}
76+
77+
/// <summary>
78+
/// Helper method to configure DocuSign client with authorization headers.
79+
/// </summary>
80+
/// <param name="basePath">BasePath for API calls (URI)</param>
81+
/// <param name="accessToken">Access Token for API call (OAuth)</param>
82+
/// <returns>Configured DocuSignClient</returns>
83+
private static DocuSignClient GetConfiguredClient(string basePath, string accessToken)
84+
{
85+
var docuSignClient = new DocuSignClient(basePath);
86+
docuSignClient.Configuration.DefaultHeader[AuthorizationHeader] = BearerPrefix + accessToken;
87+
return docuSignClient;
88+
}
89+
90+
/// <summary>
91+
/// Helper method to build SubAccountCreateRequest object.
92+
/// </summary>
93+
/// <param name="email">User email</param>
94+
/// <param name="firstName">User first name</param>
95+
/// <param name="lastName">User last name</param>
96+
/// <param name="subscriptionId">Subscription Id (string)</param>
97+
/// <param name="planId">Plan Id (GUID)</param>
98+
/// <returns>Configured SubAccountCreateRequest object</returns>
99+
//ds-snippet-start:Admin13Step4
100+
private static SubAccountCreateRequest BuildSubAccountRequest(
101+
string email,
102+
string firstName,
103+
string lastName,
104+
string subscriptionId,
105+
Guid? planId)
106+
{
107+
return new SubAccountCreateRequest
108+
{
109+
SubscriptionDetails = new SubAccountCreateRequestSubAccountCreationSubscription
110+
{
111+
Id = subscriptionId,
112+
PlanId = planId,
113+
Modules = new List<Guid?>(),
114+
},
115+
TargetAccount = new SubAccountCreateRequestSubAccountCreationTargetAccountDetails
116+
{
117+
Name = DefaultAccountName,
118+
CountryCode = DefaultCountryCode,
119+
Admin = new SubAccountCreateRequestSubAccountCreationTargetAccountAdmin
120+
{
121+
Email = email,
122+
FirstName = firstName,
123+
LastName = lastName,
124+
Locale = SubAccountCreateRequestSubAccountCreationTargetAccountAdmin.LocaleEnum.En,
125+
},
126+
},
127+
};
128+
}
129+
}
130+
131+
//ds-snippet-end:Admin13Step4
132+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
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="CreateAccountData" 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" class="form-control" id="email" name="email" aria-describedby="emailHelp"
32+
placeholder="@ViewBag.CodeExampleText.Forms[formNumber].Inputs[emailInputNumber].InputPlaceholder" required>
33+
</div>
34+
35+
<div class="form-group">
36+
<label for="firstName">
37+
@Html.Raw(ViewBag.CodeExampleText.Forms[formNumber].Inputs[firstNameInputNumber].InputName)
38+
</label>
39+
40+
<input type="text" class="form-control" id="firstName"
41+
placeholder="@ViewBag.CodeExampleText.Forms[formNumber].Inputs[firstNameInputNumber].InputPlaceholder"
42+
name="firstName" required />
43+
</div>
44+
45+
<div class="form-group">
46+
<label for="lastName">
47+
@Html.Raw(ViewBag.CodeExampleText.Forms[formNumber].Inputs[lastNameInputNumber].InputName)
48+
</label>
49+
50+
<input type="text" class="form-control" id="lastName"
51+
placeholder="@ViewBag.CodeExampleText.Forms[formNumber].Inputs[lastNameInputNumber].InputPlaceholder"
52+
name="lastName" required />
53+
</div>
54+
55+
<button type="submit" class="btn btn-primary">@Html.Raw(ViewBag.SupportingTexts.SubmitButton)</button>
56+
</form>

launcher-csharp/Startup.cs

+2
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ public Startup(IConfiguration configuration)
8282
"asset_group_account_read",
8383
"asset_group_account_clone_write",
8484
"asset_group_account_clone_read",
85+
"organization_sub_account_write",
86+
"organization_sub_account_read",
8587
});
8688

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

launcher-csharp/eSignature/Controllers/AccountController.cs

+1-1
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

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@
3636
</ItemGroup>
3737

3838
<ItemGroup>
39-
<PackageReference Include="DocuSign.Admin" Version="2.0.0-rc3" />
40-
<PackageReference Include="DocuSign.Click" Version="2.0.0-rc3" />
39+
<PackageReference Include="DocuSign.Admin" Version="2.0.0-rc4" />
40+
<PackageReference Include="DocuSign.Click" Version="2.0.0-rc1" />
4141
<PackageReference Include="DocuSign.eSign.dll" Version="8.0.0-rc2" />
4242
<PackageReference Include="DocuSign.Monitor" Version="2.0.0-rc3" />
4343
<PackageReference Include="DocuSign.Maestro" Version="1.0.0-rc4" />

0 commit comments

Comments
 (0)