Skip to content

Commit 69a774f

Browse files
authored
Merge pull request #201 from docusign/added-IAM-SDK-example
Added Navigator and Connected Fields examples
2 parents b4f3155 + 5a11fd8 commit 69a774f

File tree

22 files changed

+497
-231
lines changed

22 files changed

+497
-231
lines changed

ExamplesAPIType.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,13 @@ public enum ExamplesApiType
5454
/// Notary API
5555
/// </summary>
5656
[Description("neg")]
57-
Notary = 7
57+
Notary = 7,
58+
59+
/// <summary>
60+
/// Navigator
61+
/// </summary>")]
62+
[Description("nav")]
63+
Navigator = 8,
5864
}
5965

6066
public static class ExamplesApiTypeExtensions

ExamplesApiTypeExtensions.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,23 +50,23 @@ public enum ExamplesApiType
5050
[Description("web")]
5151
WebForms = 6,
5252

53-
/// <summary>
54-
/// Maestro API
55-
/// </summary>
56-
[Description("mae")]
57-
Maestro = 7,
58-
5953
/// <summary>
6054
/// Notary API
6155
/// </summary>
6256
[Description("neg")]
63-
Notary = 8,
57+
Notary = 7,
6458

6559
/// <summary>
6660
/// Connected Fields
6761
/// </summary>")]
6862
[Description("cf")]
69-
ConnectedFields = 9,
63+
ConnectedFields = 8,
64+
65+
/// <summary>
66+
/// Navigator
67+
/// </summary>")]
68+
[Description("nav")]
69+
Navigator = 9,
7070
}
7171

7272
public static class ExamplesApiTypeExtensions

JWTAuth.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,11 @@ public static OAuthToken AuthenticateWithJwt(string api, string clientId, string
8787
scopes.Add("webforms_instance_read");
8888
}
8989

90+
if (apiType == ExamplesApiType.Navigator)
91+
{
92+
scopes.Add("adm_store_unified_repo_read");
93+
}
94+
9095
return docuSignClient.RequestJWTUserToken(
9196
clientId,
9297
impersonatedUserId,

launcher-csharp/Common/IRequestItemsService.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
namespace DocuSign.CodeExamples
66
{
77
using System;
8+
using System.Collections.Generic;
89
using DocuSign.CodeExamples.Models;
10+
using Docusign.IAM.SDK.Models.Components;
911
using Microsoft.Extensions.Configuration;
1012

1113
public interface IRequestItemsService
@@ -24,7 +26,7 @@ public interface IRequestItemsService
2426

2527
string EnvelopeId { get; set; }
2628

27-
public string ExtensionApps { get; set; }
29+
public List<TabInfo> ExtensionApps { get; set; }
2830

2931
public string DocumentId { get; set; }
3032

launcher-csharp/Common/RequestItemsService.cs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,21 @@
55
namespace DocuSign.CodeExamples.Common
66
{
77
using System;
8+
using System.Collections.Generic;
89
using System.Linq;
910
using System.Security.Claims;
1011
using DocuSign.CodeExamples.Models;
1112
using DocuSign.eSign.Client;
13+
using DocuSign.eSign.Client.Auth;
14+
using Docusign.IAM.SDK.Models.Components;
1215
using Microsoft.AspNetCore.Http;
1316
using Microsoft.Extensions.Caching.Memory;
1417
using Microsoft.Extensions.Configuration;
1518
using static DocuSign.eSign.Client.Auth.OAuth;
16-
using static DocuSign.eSign.Client.Auth.OAuth.UserInfo;
1719

1820
public class RequestItemsService : IRequestItemsService
1921
{
20-
private static Account account;
22+
private static OAuth.UserInfo.Account account;
2123

2224
private static Guid? organizationId;
2325

@@ -110,7 +112,7 @@ public string AuthenticatedUserEmail
110112
if (authenticatedUserEmail == null)
111113
{
112114
DocuSignClient.SetOAuthBasePath(this.Configuration["DocuSignJWT:AuthServer"]);
113-
UserInfo userInfo = DocuSignClient.GetUserInfo(this.User?.AccessToken);
115+
OAuth.UserInfo userInfo = DocuSignClient.GetUserInfo(this.User?.AccessToken);
114116

115117
authenticatedUserEmail = userInfo.Email;
116118
}
@@ -130,9 +132,9 @@ public string EnvelopeId
130132
set => this.cache.Set(this.GetKey("EnvelopeId"), value);
131133
}
132134

133-
public string ExtensionApps
135+
public List<TabInfo> ExtensionApps
134136
{
135-
get => this.cache.Get<string>(this.GetKey("ExtensionApps"));
137+
get => this.cache.Get<List<TabInfo>>(this.GetKey("ExtensionApps"));
136138
set => this.cache.Set(this.GetKey("ExtensionApps"), value);
137139
}
138140

@@ -287,10 +289,6 @@ public string IdentifyApiOfCodeExample(string eg)
287289
{
288290
currentApiType = ExamplesApiType.Connect.ToString();
289291
}
290-
else if (eg.Contains(ExamplesApiType.Maestro.ToKeywordString()))
291-
{
292-
currentApiType = ExamplesApiType.Maestro.ToString();
293-
}
294292
else if (eg.Contains(ExamplesApiType.WebForms.ToKeywordString()))
295293
{
296294
currentApiType = ExamplesApiType.WebForms.ToString();
@@ -303,6 +301,10 @@ public string IdentifyApiOfCodeExample(string eg)
303301
{
304302
currentApiType = ExamplesApiType.ConnectedFields.ToString();
305303
}
304+
else if (eg.Contains(ExamplesApiType.Navigator.ToKeywordString()))
305+
{
306+
currentApiType = ExamplesApiType.Navigator.ToString();
307+
}
306308
else
307309
{
308310
currentApiType = ExamplesApiType.ESignature.ToString();
@@ -316,10 +318,10 @@ private string GetKey(string key)
316318
return string.Format("{0}_{1}", this.id, key);
317319
}
318320

319-
private Account GetAccountInfo(OAuthToken authToken)
321+
private OAuth.UserInfo.Account GetAccountInfo(OAuthToken authToken)
320322
{
321323
DocuSignClient.SetOAuthBasePath(this.Configuration["DocuSignJWT:AuthServer"]);
322-
UserInfo userInfo = DocuSignClient.GetUserInfo(authToken.access_token);
324+
OAuth.UserInfo userInfo = DocuSignClient.GetUserInfo(authToken.access_token);
323325
var accounts = userInfo.Accounts;
324326

325327
var targetAccountIdString = this.Configuration["DocuSign:TargetAccountId"];

launcher-csharp/ConnectedFields/Controllers/Eg001SetConnectedFieldsController.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ namespace DocuSign.CodeExamples.Controllers
99
using DocuSign.CodeExamples.Examples;
1010
using DocuSign.CodeExamples.Models;
1111
using Microsoft.AspNetCore.Mvc;
12-
using Newtonsoft.Json;
13-
using Newtonsoft.Json.Linq;
1412

1513
[Area("ConnectedFields")]
1614
[Route("cf001")]
@@ -39,13 +37,15 @@ public override IActionResult Get()
3937

4038
string accessToken = this.RequestItemsService.User.AccessToken;
4139
string accountId = this.RequestItemsService.Session.AccountId;
40+
var basePath = this.RequestItemsService.Session.IamBasePath;
41+
var connectedFields = SetConnectedFields.GetConnectedFieldsTabGroupsAsync(
42+
basePath,
43+
accountId,
44+
accessToken).Result;
45+
var filteredConnectedFields = SetConnectedFields.FilterData(connectedFields);
4246

43-
object extensionApps = SetConnectedFields.GetConnectedFieldsTabGroupsAsync(accountId, accessToken).Result;
44-
object filteredExtensionApps = SetConnectedFields.FilterData((JArray)extensionApps);
45-
var extensionAppsString = JsonConvert.SerializeObject(filteredExtensionApps);
46-
47-
this.ViewBag.ExtensionApps = extensionAppsString;
48-
this.RequestItemsService.ExtensionApps = extensionAppsString;
47+
this.ViewBag.ExtensionApps = filteredConnectedFields;
48+
this.RequestItemsService.ExtensionApps = filteredConnectedFields;
4949

5050
return this.View(this.EgName, this);
5151
}
@@ -61,8 +61,8 @@ public IActionResult Create(string signerEmail, string signerName, string appId)
6161
return this.Redirect("/ds/mustAuthenticate");
6262
}
6363

64-
JArray extensionApp = JArray.Parse(this.RequestItemsService.ExtensionApps);
65-
JObject selectedApp = extensionApp.FirstOrDefault(app => (string)app["appId"] == appId) as JObject;
64+
var extensionApp = this.RequestItemsService.ExtensionApps;
65+
var selectedApp = extensionApp.FirstOrDefault(tab => tab.AppId == appId);
6666

6767
string accessToken = this.RequestItemsService.User.AccessToken;
6868
string basePath = this.RequestItemsService.Session.BasePath + "/restapi";

launcher-csharp/ConnectedFields/Examples/SetConnectedFields.cs

Lines changed: 39 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -7,87 +7,43 @@ namespace DocuSign.CodeExamples.Examples
77
using System;
88
using System.Collections.Generic;
99
using System.Linq;
10-
using System.Net.Http;
1110
using System.Threading.Tasks;
1211
using DocuSign.eSign.Api;
1312
using DocuSign.eSign.Client;
1413
using DocuSign.eSign.Model;
15-
using Newtonsoft.Json;
16-
using Newtonsoft.Json.Linq;
14+
using Docusign.IAM.SDK;
15+
using TabInfo = Docusign.IAM.SDK.Models.Components.TabInfo;
1716

1817
public static class SetConnectedFields
1918
{
20-
private static readonly HttpClient Client = new HttpClient();
21-
22-
public static async Task<object> GetConnectedFieldsTabGroupsAsync(string accountId, string accessToken)
19+
public static async Task<List<TabInfo>> GetConnectedFieldsTabGroupsAsync(string basePath, string accountId, string accessToken)
2320
{
2421
//ds-snippet-start:ConnectedFields1Step3
25-
var url = $"https://api-d.docusign.com/v1/accounts/{accountId}/connected-fields/tab-groups";
26-
27-
var requestMessage = new HttpRequestMessage(HttpMethod.Get, url);
22+
var client = CreateAuthenticatedClient(basePath, accessToken);
23+
return await client.ConnectedFields.TabInfo.GetConnectedFieldsTabGroupsAsync(accountId);
2824
//ds-snippet-end:ConnectedFields1Step3
29-
30-
//ds-snippet-start:ConnectedFields1Step2
31-
requestMessage.Headers.Add("Authorization", $"Bearer {accessToken}");
32-
requestMessage.Headers.Add("Accept", "application/json");
33-
//ds-snippet-end:ConnectedFields1Step2
34-
35-
try
36-
{
37-
//ds-snippet-start:ConnectedFields1Step3
38-
var response = await Client.SendAsync(requestMessage);
39-
response.EnsureSuccessStatusCode();
40-
41-
var body = await response.Content.ReadAsStringAsync();
42-
var data = JsonConvert.DeserializeObject<object>(body);
43-
44-
return data;
45-
//ds-snippet-end:ConnectedFields1Step3
46-
}
47-
catch (HttpRequestException e)
48-
{
49-
throw new Exception($"DocuSign API Request failed: {e.Message}");
50-
}
5125
}
5226

53-
public static JArray FilterData(JArray data)
27+
//ds-snippet-start:ConnectedFields1Step4
28+
public static List<TabInfo> FilterData(List<TabInfo> connectedFields)
5429
{
55-
//ds-snippet-start:ConnectedFields1Step4
56-
var filteredData = data.Where(item =>
57-
{
58-
var tabs = item["tabs"] as JArray;
59-
if (tabs == null)
60-
{
61-
return false;
62-
}
63-
64-
foreach (var tab in tabs)
65-
{
66-
var extensionData = tab["extensionData"];
67-
var tabLabel = tab["tabLabel"]?.ToString();
68-
69-
if ((extensionData != null && extensionData["actionContract"]?.ToString().Contains("Verify") == true) ||
70-
(tabLabel != null && tabLabel.Contains("connecteddata")))
71-
{
72-
return true;
73-
}
74-
}
75-
76-
return false;
77-
}).ToList();
78-
//ds-snippet-end:ConnectedFields1Step4
79-
80-
return new JArray(filteredData);
30+
return connectedFields
31+
.Where(group => group.Tabs.Any(tab =>
32+
tab.ExtensionData?.ActionContract?.Contains("Verify") == true ||
33+
tab.TabLabel.Contains("connecteddata")))
34+
.ToList();
8135
}
8236

37+
//ds-snippet-end:ConnectedFields1Step4
38+
8339
public static string SendEnvelopeViaEmail(
8440
string basePath,
8541
string accessToken,
8642
string accountId,
8743
string signerEmail,
8844
string signerName,
8945
string docPdf,
90-
JObject selectedApp)
46+
TabInfo selectedApp)
9147
{
9248
//ds-snippet-start:ConnectedFields1Step6
9349
EnvelopeDefinition envelopeDefinition = MakeEnvelope(signerEmail, signerName, docPdf, selectedApp);
@@ -105,11 +61,8 @@ public static EnvelopeDefinition MakeEnvelope(
10561
string signerEmail,
10662
string signerName,
10763
string docPdf,
108-
JObject selectedApp)
64+
TabInfo selectedApp)
10965
{
110-
var appId = selectedApp["appId"]?.ToString() ?? string.Empty;
111-
JArray tabLabels = (JArray)selectedApp["tabs"];
112-
11366
EnvelopeDefinition envelopeDefinition = new EnvelopeDefinition();
11467
envelopeDefinition.EmailSubject = "Please sign this document set";
11568
envelopeDefinition.Status = "sent";
@@ -147,32 +100,24 @@ public static EnvelopeDefinition MakeEnvelope(
147100
},
148101
};
149102

150-
foreach (var tab in tabLabels)
103+
foreach (var tab in selectedApp.Tabs)
151104
{
152-
var connectionKey = tab["extensionData"]["connectionInstances"] != null ?
153-
tab["extensionData"]["connectionInstances"][0]?["connectionKey"]?.ToString() : string.Empty;
154-
var connectionValue = tab["extensionData"]["connectionInstances"] != null ?
155-
tab["extensionData"]["connectionInstances"][0]?["connectionValue"]?.ToString() : string.Empty;
156-
var extensionGroupId = tab["extensionData"]["extensionGroupId"]?.ToString() ?? string.Empty;
157-
var publisherName = tab["extensionData"]["publisherName"]?.ToString() ?? string.Empty;
158-
var applicationName = tab["extensionData"]["applicationName"]?.ToString() ?? string.Empty;
159-
var actionName = tab["extensionData"]["actionName"]?.ToString() ?? string.Empty;
160-
var actionInputKey = tab["extensionData"]["actionInputKey"]?.ToString() ?? string.Empty;
161-
var actionContract = tab["extensionData"]["actionContract"]?.ToString() ?? string.Empty;
162-
var extensionName = tab["extensionData"]["extensionName"]?.ToString() ?? string.Empty;
163-
var extensionContract = tab["extensionData"]["extensionContract"]?.ToString() ?? string.Empty;
164-
var requiredForExtension = tab["extensionData"]["requiredForExtension"]?.ToString() ?? string.Empty;
105+
var extensionData = tab.ExtensionData;
106+
var connectionKey = extensionData.ConnectionInstances != null ?
107+
extensionData.ConnectionInstances[0]?.ConnectionKey : string.Empty;
108+
var connectionValue = extensionData.ConnectionInstances != null ?
109+
extensionData.ConnectionInstances[0]?.ConnectionValue : string.Empty;
165110

166111
var text = new Text
167112
{
168113
RequireInitialOnSharedChange = "false",
169114
RequireAll = "false",
170-
Name = applicationName,
115+
Name = extensionData.ApplicationName,
171116
Required = "false",
172117
Locked = "false",
173118
DisableAutoSize = "false",
174119
MaxLength = "4000",
175-
TabLabel = tab["tabLabel"].ToString(),
120+
TabLabel = tab.TabLabel,
176121
Font = "lucidaconsole",
177122
FontColor = "black",
178123
FontSize = "size9",
@@ -187,16 +132,16 @@ public static EnvelopeDefinition MakeEnvelope(
187132
TabType = "text",
188133
ExtensionData = new ExtensionData
189134
{
190-
ExtensionGroupId = extensionGroupId,
191-
PublisherName = publisherName,
192-
ApplicationId = appId,
193-
ApplicationName = applicationName,
194-
ActionName = actionName,
195-
ActionContract = actionContract,
196-
ExtensionName = extensionName,
197-
ExtensionContract = extensionContract,
198-
RequiredForExtension = requiredForExtension,
199-
ActionInputKey = actionInputKey,
135+
ExtensionGroupId = extensionData.ExtensionGroupId,
136+
PublisherName = extensionData.PublisherName,
137+
ApplicationId = selectedApp.AppId,
138+
ApplicationName = extensionData.ApplicationName,
139+
ActionName = extensionData.ActionName,
140+
ActionContract = extensionData.ActionContract,
141+
ExtensionName = extensionData.ExtensionName,
142+
ExtensionContract = extensionData.ExtensionContract,
143+
RequiredForExtension = extensionData.RequiredForExtension.ToString(),
144+
ActionInputKey = extensionData.ActionInputKey,
200145
ExtensionPolicy = "MustVerifyToSign",
201146
ConnectionInstances = new List<ConnectionInstance>
202147
{
@@ -222,5 +167,10 @@ public static EnvelopeDefinition MakeEnvelope(
222167
}
223168

224169
//ds-snippet-end:ConnectedFields1Step5
170+
171+
//ds-snippet-start:ConnectedFields1Step2
172+
private static IamClient CreateAuthenticatedClient(string basePath, string accessToken) =>
173+
IamClient.Builder().WithServerUrl(basePath).WithAccessToken(accessToken).Build();
174+
//ds-snippet-end:ConnectedFields1Step2
225175
}
226176
}

0 commit comments

Comments
 (0)