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