Documentation for the Unity C# Library
Loading...
Searching...
No Matches
PlatformAPIHandler.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Net.Http;
5using System.Net.Http.Headers;
6using Newtonsoft.Json;
7using Newtonsoft.Json.Linq;
9using UnityEngine;
10
11namespace PixoVR.Apex
12{
32
33 public class APIHandler
34 {
35 public delegate void APIResponse(ResponseType type, HttpResponseMessage message, object responseData);
36 public APIResponse OnAPIResponse;
37
38 protected string URL = "";
39 protected HttpClient handlingClient = null;
40
41
42 // Need to migrate to this in the future
43 protected string apiURL = "";
44 protected HttpClient apiHandlingClient = null;
45
46 public APIHandler()
47 : this(PlatformEndpoints.NorthAmerica_ProductionEnvironment) { }
48
49 public APIHandler(string endpointUrl)
50 {
51 handlingClient = new HttpClient();
52 SetEndpoint(endpointUrl);
53
54 apiHandlingClient = new HttpClient();
55 }
56
57 HttpResponseMessage HandleException(Exception exception)
58 {
59 Debug.LogWarning("Exception has occurred: " + exception.Message);
60 HttpResponseMessage badRequestResponse = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest);
61 OnAPIResponse.Invoke(ResponseType.RT_FAILED_RESPONSE, badRequestResponse, null);
62 return badRequestResponse;
63 }
64
65 public void SetEndpoint(string endpointUrl)
66 {
67 EnsureURLHasProtocol(ref endpointUrl);
68
69 URL = endpointUrl;
70 Debug.Log("[APIHandler] Set Endpoint to " + URL);
71 handlingClient.BaseAddress = new Uri(URL);
72 }
73
74 public void SetPlatformEndpoint(string endpointUrl)
75 {
76 EnsureURLHasProtocol(ref endpointUrl);
77
78 apiURL = endpointUrl;
79 apiHandlingClient.BaseAddress = new Uri(apiURL);
80 }
81
82 private void EnsureURLHasProtocol(ref string url)
83 {
84 if (!url.StartsWith("https://", StringComparison.InvariantCultureIgnoreCase))
85 {
86 if (url.StartsWith("http:", StringComparison.InvariantCultureIgnoreCase))
87 {
88#if UNITY_EDITOR
89 Debug.LogWarning("URL must be a secured http endpoint for production.");
90#else
91 Debug.LogError("URL must be a securated http endpoint.");
92#endif
93 }
94 else
95 {
96 url.Insert(0, "https://");
97 }
98 }
99 }
100
101 public async void Ping()
102 {
103 handlingClient.DefaultRequestHeaders.Clear();
104 handlingClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
105
106 HttpResponseMessage response;
107 try
108 {
109 response = await handlingClient.GetAsync("/ping");
110 }
111 catch (Exception ex)
112 {
113 response = HandleException(ex);
114 }
115
116 OnAPIResponse.Invoke(ResponseType.RT_PING, response, null);
117 }
118
120 {
121 public int[] userIds;
122 }
123
124 public async void GenerateAssistedLogin(string authToken, int userId, Action<HttpResponseMessage, object> success, Action<HttpResponseMessage, FailureResponse> failure)
125 {
126 apiHandlingClient.DefaultRequestHeaders.Clear();
127 apiHandlingClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authToken);
128 apiHandlingClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
129
130 // Create the GraphQL request payload
131 string jsonContent = "";
132
133 if (userId >= 0)
134 {
135 var userIdArray = new int[1] { userId };
136 var input = new { input = new GenerateAuthCodeInput { userIds = userIdArray } };
137 // Create the GraphQL request payload
138 var graphqlRequest = new
139 {
140 operationName = "generateAuthCode",
141 variables = input,
142 query = "mutation generateAuthCode($input: AuthCodeInput!) { generateAuthCode(input: $input) { code expiresAt __typename }}",
143 };
144
145 jsonContent = JsonConvert.SerializeObject(graphqlRequest);
146 }
147 else
148 {
149 var graphqlRequest = new
150 {
151 operationName = "generateAuthCode",
152 variables = new { input = new { } },
153 query = "mutation generateAuthCode($input: AuthCodeInput!) { generateAuthCode(input: $input) { code expiresAt __typename }}",
154 };
155
156 jsonContent = JsonConvert.SerializeObject(graphqlRequest);
157 }
158
159 HttpContent requestContent = new StringContent(jsonContent, System.Text.Encoding.UTF8, "application/json");
160 HttpResponseMessage response;
161 object responseContent;
162 try
163 {
164 response = await apiHandlingClient.PostAsync("/v2/query", requestContent);
165 string body = await response.Content.ReadAsStringAsync();
166 Debug.Log(body);
167
168 // Parse the GraphQL response structure
169 JObject jsonResponse = JObject.Parse(body);
170 var failureResponse = GetGQLFailureResponse(jsonResponse, "generateAuthCode");
171 if (failureResponse != null)
172 {
173 failure?.Invoke(response, failureResponse);
174 return;
175 }
176
177 // Extract the relevant data from the GraphQL response
178 string code = jsonResponse["data"]["generateAuthCode"]["code"]?.ToString();
179 string expiresAt = jsonResponse["data"]["generateAuthCode"]["expiresAt"]?.ToString();
180
181 // Create the GeneratedAssistedLogin object with the extracted data
183 {
184 AssistedLogin = new AssistedLoginCode { AuthCode = code, Expires = expiresAt },
185 };
186
187 responseContent = assistedLogin;
188 }
189 catch (Exception ex)
190 {
191 Debug.LogError($"Error generating assisted login: {ex.Message}");
192 response = new HttpResponseMessage(System.Net.HttpStatusCode.InternalServerError);
193 failure?.Invoke(response, new FailureResponse { Error = "true", Message = ex.Message });
194 return;
195 }
196
197 success?.Invoke(response, responseContent);
198 }
199
200 public async void GetUserMetricsForOrg(string authToken, int orgID, int page)
201 {
202 apiHandlingClient.DefaultRequestHeaders.Clear();
203 apiHandlingClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authToken);
204 apiHandlingClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
205
206 var graphqlRequest = new
207 {
208 operationName = "userMetrics",
209 variables = new { orgId = orgID, limit = 10, page = page },
210 query = "query userMetrics($orgId: ID!, $limit: Int, $page: Int, $search: String) { userMetrics(orgId: $orgId, limit: $limit, page: $page, search: $search) { result { id firstName lastName username email role createdAt orgUnitId orgUnit { id name externalId } lastModuleId lastModule { id abbreviation description } sessionCount lastActiveAt isInModule } pageInfo { totalCount page offset pageSize previousPage nextPage } } }"
211 };
212
213 string jsonContent = JsonConvert.SerializeObject(graphqlRequest);
214 HttpContent requestContent = new StringContent(jsonContent, System.Text.Encoding.UTF8, "application/json");
215 HttpResponseMessage response;
216 object responseContent;
217 try
218 {
219 response = await apiHandlingClient.PostAsync("/v2/query", requestContent);
220 string body = await response.Content.ReadAsStringAsync();
221
222 JObject jsonResponse = JObject.Parse(body);
223 var failureResponse = GetGQLFailureResponse(jsonResponse, "userMetrics");
224 if (failureResponse != null)
225 {
226 OnAPIResponse.Invoke(ResponseType.RT_GET_USER_METRICS_FOR_ORG, response, failureResponse);
227 return;
228 }
229
230 var userMetricsJSON = jsonResponse["data"]["userMetrics"];
231 responseContent = JsonConvert.DeserializeObject<UserMetricsResponse>(userMetricsJSON.ToString());
232 }
233 catch (Exception ex)
234 {
235 Debug.LogError($"Error retrieving users: {ex.Message}");
236 response = new HttpResponseMessage(System.Net.HttpStatusCode.InternalServerError);
237 responseContent = new FailureResponse { Error = "true", Message = ex.Message };
238 }
239
240 OnAPIResponse.Invoke(ResponseType.RT_GET_USER_METRICS_FOR_ORG, response, responseContent);
241 }
242
243 public async void LoginWithToken(string token)
244 {
245 Debug.Log($"[Platform API] Logging in with token: {token}");
246 apiHandlingClient.DefaultRequestHeaders.Clear();
247 apiHandlingClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
248 apiHandlingClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
249
250 Debug.Log($"[Platform API] Sending login with a token.");
251 HttpResponseMessage response = await apiHandlingClient.GetAsync("/v2/auth/validate-signature");
252 string body = await response.Content.ReadAsStringAsync();
253 Debug.Log($"[Platform API] Body returned as {body}");
254 object responseContent = JsonConvert.DeserializeObject<UserLoginResponseContent>(body);
255 if ((responseContent as UserLoginResponseContent).HasErrored())
256 {
257 responseContent = JsonConvert.DeserializeObject<FailureResponse>(body);
258 }
259
260 Debug.Log($"[Platform API] Got a valid login response!");
261 object loginResponseContent = (responseContent as UserLoginResponseContent).User;
262
263 OnAPIResponse.Invoke(ResponseType.RT_LOGIN, response, loginResponseContent);
264 }
265
266 public async void Login(LoginData login)
267 {
268 Debug.Log("[Platform API] Calling Login.");
269 handlingClient.DefaultRequestHeaders.Clear();
270
271 HttpContent loginRequestContent = new StringContent(JsonUtility.ToJson(login));
272 loginRequestContent.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
273
274 Debug.Log("[Platform API] Call to post api login.");
275 HttpResponseMessage response = await handlingClient.PostAsync("/login", loginRequestContent);
276 string body = await response.Content.ReadAsStringAsync();
277 Debug.Log("[Platform API] Got response body: " + body);
278 object responseContent = JsonConvert.DeserializeObject<LoginResponseContent>(body);
279 if ((responseContent as LoginResponseContent).HasErrored())
280 {
281 responseContent = JsonConvert.DeserializeObject<FailureResponse>(body);
282 }
283
284 Debug.Log("[Platform API] Response content deserialized.");
285 OnAPIResponse.Invoke(ResponseType.RT_LOGIN, response, responseContent);
286 }
287
288 public async void GetUserData(string authToken, int userId)
289 {
290 handlingClient.DefaultRequestHeaders.Clear();
291 handlingClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authToken);
292 handlingClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
293
294 HttpResponseMessage response = await handlingClient.GetAsync(string.Format("/user/{0}", userId));
295 string body = await response.Content.ReadAsStringAsync();
296 object responseContent = JsonConvert.DeserializeObject<GetUserResponseContent>(body);
297 GetUserResponseContent userInfo = responseContent as GetUserResponseContent;
298 if ((responseContent as GetUserResponseContent).HasErrored())
299 {
300 responseContent = JsonConvert.DeserializeObject<FailureResponse>(body);
301 }
302
303 OnAPIResponse.Invoke(ResponseType.RT_GET_USER, response, responseContent);
304 }
305
306 public async void GetUserModules(string authToken, int userId)
307 {
308 handlingClient.DefaultRequestHeaders.Clear();
309 handlingClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authToken);
310 handlingClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
311
312 UserModulesRequestData usersModulesRequest = new UserModulesRequestData();
313 usersModulesRequest.UserIds.Add(userId);
314 HttpContent loginRequestContent = new StringContent(JsonUtility.ToJson(usersModulesRequest));
315 loginRequestContent.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
316
317 HttpResponseMessage response = await handlingClient.PostAsync("/access/users", loginRequestContent);
318 string body = await response.Content.ReadAsStringAsync();
319 object responseContent = JsonConvert.DeserializeObject<GetUserModulesResponse>(body);
320 if ((responseContent as GetUserModulesResponse).HasErrored())
321 {
322 responseContent = JsonConvert.DeserializeObject<FailureResponse>(body);
323 }
324 else
325 {
326 (responseContent as GetUserModulesResponse).ParseData();
327 }
328
329 OnAPIResponse.Invoke(ResponseType.RT_GET_USER_MODULES, response, responseContent);
330 }
331
332 public async void GetQuickIDAuthenticationUsers(string serialNumber)
333 {
334 apiHandlingClient.DefaultRequestHeaders.Clear();
335 apiHandlingClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
336
337 HttpResponseMessage response = await apiHandlingClient.GetAsync(string.Format("/v2/auth/quick-id/get-users?serialNumber={0}", serialNumber));
338 string body = await response.Content.ReadAsStringAsync();
339
340 Debug.Log($"[Platform API] Body returned as {body}");
341
342 object responseContent = JsonConvert.DeserializeObject<QuickIDAuthGetUsersResponse>(body);
343 if ((responseContent as QuickIDAuthGetUsersResponse).HasErrored())
344 {
345 responseContent = JsonConvert.DeserializeObject<FailureResponse>(body);
346 }
347
348 OnAPIResponse.Invoke(ResponseType.RT_QUICK_ID_AUTH_GET_USERS, response, responseContent);
349 }
350
351 public async void QuickIDLogin(QuickIDLoginData login)
352 {
353 Debug.Log("[Platform API] Calling Quick ID login.");
354 apiHandlingClient.DefaultRequestHeaders.Clear();
355
356 HttpContent loginRequestContent = new StringContent(JsonUtility.ToJson(login));
357 Debug.Log("[Platform API] Quick ID login request content: " + JsonUtility.ToJson(login));
358 loginRequestContent.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
359
360 Debug.Log("[Platform API] Call to post api Quick ID login.");
361 HttpResponseMessage response = await apiHandlingClient.PostAsync("/v2/auth/quick-id/login", loginRequestContent);
362 string body = await response.Content.ReadAsStringAsync();
363 Debug.Log("[Platform API] Got response body: " + body);
364 object responseContent = JsonConvert.DeserializeObject<PlatformLoginResponse>(body);
365
366 var loginResponseContent = new LoginResponseContent();
367 if ((responseContent as PlatformLoginResponse).HasErrored())
368 {
369 responseContent = JsonConvert.DeserializeObject<FailureResponse>(body);
370 }
371 else
372 {
373 var platformLoginResponse = responseContent as PlatformLoginResponse;
374
375 loginResponseContent.Token = platformLoginResponse.Token;
376 if (platformLoginResponse.User != null)
377 {
378 loginResponseContent.ID = platformLoginResponse.User.Id;
379 loginResponseContent.OrgId = platformLoginResponse.User.OrgId;
380 loginResponseContent.First = platformLoginResponse.User.FirstName;
381 loginResponseContent.Last = platformLoginResponse.User.LastName;
382 loginResponseContent.Email = platformLoginResponse.User.Email;
383 loginResponseContent.Role = platformLoginResponse.User.Role;
384 loginResponseContent.Org = platformLoginResponse.User.Org;
385 }
386 else
387 {
388 Debug.Log("[Platform API] Quick ID login response did not contain user data.");
389 }
390 }
391
392 Debug.Log("[Platform API] Response content deserialized and mapped.");
393 OnAPIResponse.Invoke(ResponseType.RT_QUICK_ID_AUTH_LOGIN, response, loginResponseContent);
394 }
395
396 public async void JoinSession(string authToken, JoinSessionData joinData)
397 {
398 handlingClient.DefaultRequestHeaders.Clear();
399 handlingClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authToken);
400 handlingClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
401
402 HttpContent joinSessionRequestContent = new StringContent(joinData.ToJSON());
403 joinSessionRequestContent.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
404
405 HttpResponseMessage response = await handlingClient.PostAsync("/event", joinSessionRequestContent);
406 string body = await response.Content.ReadAsStringAsync();
407 object responseContent = JsonConvert.DeserializeObject<JoinSessionResponse>(body);
408 if ((responseContent as FailureResponse).HasErrored())
409 {
410 responseContent = null;
411 }
412 else
413 {
414 JoinSessionResponse joinSessionResponse = (responseContent as JoinSessionResponse);
415 joinSessionResponse.ParseData();
416 responseContent = joinSessionResponse;
417 }
418
419 OnAPIResponse.Invoke(ResponseType.RT_SESSION_JOINED, response, responseContent);
420 }
421
422 public async void GetModuleAccess(int moduleId, int userId, string serialNumber)
423 {
424 Debug.Log("[Platform API Handler] Get Module Access");
425 handlingClient.DefaultRequestHeaders.Clear();
426 handlingClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
427
428 string optionalParameters = "";
429 Debug.Log($"Checking for a serial number: {serialNumber}");
430 if (!string.IsNullOrEmpty(serialNumber))
431 {
432 optionalParameters = "?serial=" + serialNumber;
433 }
434
435 Debug.Log(
436 $"[{GetType().Name}] Checking module access at: "
437 + String.Format("/access/user/{0}/module/{1}{2}", userId, moduleId, optionalParameters)
438 );
439
440 HttpResponseMessage response = await handlingClient.GetAsync(
441 String.Format("/access/user/{0}/module/{1}{2}", userId, moduleId, optionalParameters)
442 );
443 string body = await response.Content.ReadAsStringAsync();
444
445 Debug.Log($"[{GetType().Name}] GetModuleAccess return body: {body}");
446 object responseContent = JsonConvert.DeserializeObject<FailureResponse>(body);
447 if (!(responseContent as FailureResponse).HasErrored())
448 {
449 responseContent = JsonConvert.DeserializeObject<UserAccessResponseContent>(body);
450 }
451 OnAPIResponse.Invoke(ResponseType.RT_GET_USER_ACCESS, response, responseContent);
452 }
453
454 public async void SendHeartbeat(string authToken, int sessionId)
455 {
456 apiHandlingClient.DefaultRequestHeaders.Clear();
457 apiHandlingClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authToken);
458 apiHandlingClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
459
460 HeartbeatData heartbeatData = new HeartbeatData(sessionId);
461
462 HttpContent heartbeatRequestContent = new StringContent(heartbeatData.ToJSON());
463 heartbeatRequestContent.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
464
465 HttpResponseMessage response = await apiHandlingClient.PostAsync(
466 "/heartbeat/pulse",
467 heartbeatRequestContent
468 );
469 string body = await response.Content.ReadAsStringAsync();
470 object responseContent = JsonConvert.DeserializeObject<FailureResponse>(body);
471 if ((responseContent as FailureResponse).HasErrored())
472 {
473 responseContent = null;
474 }
475
476 OnAPIResponse.Invoke(ResponseType.RT_HEARTBEAT, response, responseContent);
477 }
478
479 public async void CompleteSession(string authToken, CompleteSessionData completionData)
480 {
481 handlingClient.DefaultRequestHeaders.Clear();
482 handlingClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authToken);
483 handlingClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
484
485 HttpContent completeSessionRequestContent = new StringContent(completionData.ToJSON());
486 completeSessionRequestContent.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
487
488 HttpResponseMessage response = await handlingClient.PostAsync("/event", completeSessionRequestContent);
489 string body = await response.Content.ReadAsStringAsync();
490 object responseContent = JsonConvert.DeserializeObject<FailureResponse>(body);
491 if ((responseContent as FailureResponse).HasErrored())
492 {
493 responseContent = null;
494 }
495
496 OnAPIResponse.Invoke(ResponseType.RT_SESSION_COMPLETE, response, responseContent);
497 }
498
499 public async void SendSessionEvent(string authToken, SessionEventData sessionEvent)
500 {
501 handlingClient.DefaultRequestHeaders.Clear();
502 handlingClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authToken);
503 handlingClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
504
505 HttpContent sessionEventRequestContent = new StringContent(sessionEvent.ToJSON());
506 sessionEventRequestContent.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
507
508 HttpResponseMessage response = await handlingClient.PostAsync("/event", sessionEventRequestContent);
509 string body = await response.Content.ReadAsStringAsync();
510 object responseContent = JsonConvert.DeserializeObject<FailureResponse>(body);
511 if ((responseContent as FailureResponse).HasErrored())
512 {
513 responseContent = null;
514 }
515
516 OnAPIResponse.Invoke(ResponseType.RT_SESSION_EVENT, response, responseContent);
517 }
518
519 public async void GetModuleList(string authToken, string platform)
520 {
521 handlingClient.DefaultRequestHeaders.Clear();
522 handlingClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authToken);
523 handlingClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
524
525 string endpoint = "/modules";
526 if (platform != null && platform.Length > 0)
527 {
528 endpoint += $"?platform={platform}";
529 }
530
531 Debug.Log($"GetModuleList built endpoint: {endpoint}");
532
533 HttpResponseMessage response = await handlingClient.GetAsync(endpoint);
534 string body = await response.Content.ReadAsStringAsync();
535
536 try
537 {
538 var responseContent = JsonConvert.DeserializeObject<FailureResponse>(body);
539 OnAPIResponse.Invoke(ResponseType.RT_GET_MODULES_LIST, response, responseContent);
540 return;
541 }
542 catch (Exception ex)
543 {
544 Debug.LogWarning(ex);
545 }
546
547 List<OrgModule> orgModules = new List<OrgModule>();
548 JArray array = JArray.Parse(body);
549 if (array != null)
550 {
551 var tokens = array.Children();
552 foreach (JToken selectedToken in tokens)
553 {
554 OrgModule orgModule = ScriptableObject.CreateInstance<OrgModule>();
555 orgModule.Parse(selectedToken);
556 orgModules.Add(orgModule);
557 }
558 }
559
560 Debug.Log(orgModules.Count.ToString());
561 OnAPIResponse.Invoke(ResponseType.RT_GET_MODULES_LIST, response, orgModules);
562 }
563
564 private FailureResponse GetGQLFailureResponse(JObject jsonResponse, string jsonDataObjectKey)
565 {
566
567 if (!String.IsNullOrEmpty(jsonResponse["errors"]?.ToString()))
568 {
569 string errorMessage = jsonResponse["errors"]?[0]?["message"]?.ToString() ?? "Unknown GraphQL error";
570 return new FailureResponse { Error = "true", Message = errorMessage };
571 }
572
573 if (String.IsNullOrEmpty(jsonResponse["data"]?.ToString()) || String.IsNullOrEmpty(jsonResponse["data"][jsonDataObjectKey]?.ToString()))
574 {
575 return new FailureResponse
576 {
577 Error = "true",
578 Message = "Invalid response format from server",
579 };
580 }
581
582 return null;
583 }
584 }
585}
async void SendHeartbeat(string authToken, int sessionId)
APIHandler(string endpointUrl)
async void GetUserModules(string authToken, int userId)
async void QuickIDLogin(QuickIDLoginData login)
HttpResponseMessage HandleException(Exception exception)
void EnsureURLHasProtocol(ref string url)
async void JoinSession(string authToken, JoinSessionData joinData)
async void GetUserMetricsForOrg(string authToken, int orgID, int page)
async void LoginWithToken(string token)
async void CompleteSession(string authToken, CompleteSessionData completionData)
async void Login(LoginData login)
async void SendSessionEvent(string authToken, SessionEventData sessionEvent)
FailureResponse GetGQLFailureResponse(JObject jsonResponse, string jsonDataObjectKey)
void SetPlatformEndpoint(string endpointUrl)
async void GenerateAssistedLogin(string authToken, int userId, Action< HttpResponseMessage, object > success, Action< HttpResponseMessage, FailureResponse > failure)
async void GetQuickIDAuthenticationUsers(string serialNumber)
async void GetUserData(string authToken, int userId)
delegate void APIResponse(ResponseType type, HttpResponseMessage message, object responseData)
void SetEndpoint(string endpointUrl)
async void GetModuleAccess(int moduleId, int userId, string serialNumber)
async void GetModuleList(string authToken, string platform)
[Serializable]
Definition ApexTypes.cs:165
void Parse(JToken token)
Definition ApexTypes.cs:395
[Serializable]
Definition ApexTypes.cs:610