2using Newtonsoft.Json.Linq;
5using System.Collections.Generic;
7using System.Net.Http.Headers;
8using UnityEditor.PackageManager;
38 protected string URL =
"";
59 Debug.LogWarning(
"Exception has occurred: " + exception.Message);
60 HttpResponseMessage badRequestResponse =
new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest);
62 return badRequestResponse;
70 Debug.Log(
"[APIHandler] Set Endpoint to " +
URL);
71 handlingClient.BaseAddress =
new Uri(
URL);
79 apiHandlingClient.BaseAddress =
new Uri(
apiURL);
84 if (!url.StartsWith(
"https://", StringComparison.InvariantCultureIgnoreCase))
86 if (url.StartsWith(
"http:", StringComparison.InvariantCultureIgnoreCase))
89 Debug.LogWarning(
"URL must be a secured http endpoint for production.");
91 Debug.LogError(
"URL must be a securated http endpoint.");
96 url.Insert(0,
"https://");
101 public async
void Ping(Action<HttpResponseMessage, object> success, Action<HttpResponseMessage, FailureResponse> failure)
104 handlingClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(
"application/json"));
106 HttpResponseMessage response;
114 failure?.Invoke(response,
new FailureResponse { Error =
"True", HttpCode =
"400", Message =
"Failed " });
117 success?.Invoke(response,
null);
125 public async
void GenerateAssistedLogin(
string authToken,
int userId, Action<HttpResponseMessage, object> success, Action<HttpResponseMessage, FailureResponse> failure)
128 apiHandlingClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(
"Bearer", authToken);
129 apiHandlingClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(
"application/json"));
132 string jsonContent =
"";
136 var userIdArray =
new int[1] { userId };
139 var graphqlRequest =
new
141 operationName =
"generateAuthCode",
143 query =
"mutation generateAuthCode($input: AuthCodeInput!) { generateAuthCode(input: $input) { code expiresAt __typename }}",
146 jsonContent = JsonConvert.SerializeObject(graphqlRequest);
150 var graphqlRequest =
new
152 operationName =
"generateAuthCode",
153 variables =
new { input =
new { } },
154 query =
"mutation generateAuthCode($input: AuthCodeInput!) { generateAuthCode(input: $input) { code expiresAt __typename }}",
157 jsonContent = JsonConvert.SerializeObject(graphqlRequest);
160 HttpContent requestContent =
new StringContent(jsonContent, System.Text.Encoding.UTF8,
"application/json");
161 HttpResponseMessage response;
162 object responseContent =
null;
166 string body = await response.Content.ReadAsStringAsync();
170 JObject jsonResponse = JObject.Parse(body);
172 if (failureResponse !=
null)
174 failure?.Invoke(response, failureResponse);
179 string code = jsonResponse[
"data"][
"generateAuthCode"][
"code"]?.ToString();
180 string expiresAt = jsonResponse[
"data"][
"generateAuthCode"][
"expiresAt"]?.ToString();
188 responseContent = assistedLogin;
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 });
198 success?.Invoke(response, responseContent);
201 public async
void GetUserMetricsForOrg(
string authToken,
int orgID,
int page,
FilterParams filterParams, Action<UserMetricsResponse, object> success, Action<HttpResponseMessage, FailureResponse> failure)
204 apiHandlingClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(
"Bearer", authToken);
205 apiHandlingClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(
"application/json"));
207 var paramsInput =
new
211 sortOrder = filterParams.sortOrder == FilterParams.SortOrder.Ascending ?
"ASC" :
"DESC",
214 var graphqlRequest =
new
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"
221 string jsonContent = JsonConvert.SerializeObject(graphqlRequest);
222 HttpContent requestContent =
new StringContent(jsonContent, System.Text.Encoding.UTF8,
"application/json");
223 HttpResponseMessage response;
224 object responseContent;
228 string body = await response.Content.ReadAsStringAsync();
230 JObject jsonResponse = JObject.Parse(body);
232 if (failureResponse !=
null)
235 failure?.Invoke(response, failureResponse);
239 var userMetricsJSON = jsonResponse[
"data"][
"userMetrics"];
240 var userMetricsResponse = JsonConvert.DeserializeObject<
UserMetricsResponse>(userMetricsJSON.ToString());
241 userMetricsResponse.
result.ForEach(u => u.RefreshDisplayFields());
242 responseContent = userMetricsResponse;
244 success?.Invoke(userMetricsResponse, response);
248 Debug.LogError($
"Error retrieving users: {ex.Message}");
249 response =
new HttpResponseMessage(System.Net.HttpStatusCode.InternalServerError);
250 responseContent =
new FailureResponse { Error =
"true", Message = ex.Message };
255 public async
void GetDevicesForOrg(
string authToken,
int orgID,
int page,
FilterParams filterParams, Action<HttpResponseMessage, OrgDevicesResponse> success, Action<HttpResponseMessage, FailureResponse> failure)
258 apiHandlingClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(
"Bearer", authToken);
259 apiHandlingClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(
"application/json"));
261 var graphqlRequest =
new
263 operationName =
"OrgDeviceLicenses",
271 sortOrder = filterParams.sortOrder == FilterParams.SortOrder.Ascending ?
"ASC" :
"DESC",
273 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"
276 string jsonContent = JsonConvert.SerializeObject(graphqlRequest);
277 HttpContent requestContent =
new StringContent(jsonContent, System.Text.Encoding.UTF8,
"application/json");
278 HttpResponseMessage response;
283 string body = await response.Content.ReadAsStringAsync();
285 JObject jsonResponse = JObject.Parse(body);
287 if (failureResponse !=
null)
289 failure?.Invoke(response, failureResponse);
293 var orgDevicesJSON = jsonResponse[
"data"][
"orgDeviceLicenses"];
294 var deviceResponse = JsonConvert.DeserializeObject<
OrgDevicesResponse>(orgDevicesJSON.ToString());
295 deviceResponse.
result.ForEach(u => u.RefreshDisplayFields());
296 responseContent = deviceResponse;
300 Debug.LogError($
"Error retrieving devices: {ex.Message}");
301 response =
new HttpResponseMessage(System.Net.HttpStatusCode.InternalServerError);
302 failure?.Invoke(response,
new FailureResponse { Error =
"true", Message = ex.Message });
306 success?.Invoke(response, responseContent);
309 public async
void GetSessionHistory(
string authToken,
int page,
SessionFilters sessionFilters,
FilterParams filterParams, Action<HttpResponseMessage, SessionHistoryResponse> success, Action<HttpResponseMessage, FailureResponse> failure)
312 apiHandlingClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(
"Bearer", authToken);
313 apiHandlingClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(
"application/json"));
315 var paramsInput =
new
319 sortOrder = filterParams.sortOrder == FilterParams.SortOrder.Ascending ?
"ASC" :
"DESC",
322 var graphqlRequest =
new
324 operationName =
"userSessionHistory",
327 userId = sessionFilters.
userIDs[0],
331 @params = paramsInput,
333 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"
336 string jsonContent = JsonConvert.SerializeObject(graphqlRequest);
337 HttpContent requestContent =
new StringContent(jsonContent, System.Text.Encoding.UTF8,
"application/json");
338 HttpResponseMessage response;
343 string body = await response.Content.ReadAsStringAsync();
344 JObject jsonResponse = JObject.Parse(body);
346 if (failureResponse !=
null)
348 failure?.Invoke(response, failureResponse);
351 var sessionHistoryJSON = jsonResponse[
"data"][
"userSessionHistory"];
352 var sessionHistoryResponse = JsonConvert.DeserializeObject<
SessionHistoryResponse>(sessionHistoryJSON.ToString());
353 sessionHistoryResponse.
result.ForEach(u => u.RefreshDisplayFields());
354 responseContent = sessionHistoryResponse;
358 Debug.LogError($
"Error retrieving session history: {ex.Message}");
359 response =
new HttpResponseMessage(System.Net.HttpStatusCode.InternalServerError);
360 failure?.Invoke(response,
new FailureResponse { Error =
"true", Message = ex.Message });
364 success?.Invoke(response, responseContent);
369 Debug.Log($
"[Platform API] Logging in with token: {token}");
371 apiHandlingClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(
"Bearer", token);
372 apiHandlingClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(
"application/json"));
374 Debug.Log($
"[Platform API] Sending login with a token.");
375 HttpResponseMessage response = await
apiHandlingClient.GetAsync(
"/v2/auth/validate-signature");
376 string body = await response.Content.ReadAsStringAsync();
377 Debug.Log($
"[Platform API] Body returned as {body}");
381 responseContent = JsonConvert.DeserializeObject<
FailureResponse>(body);
384 Debug.Log($
"[Platform API] Got a valid login response!");
392 Debug.Log(
"[Platform API] Calling Login.");
395 HttpContent loginRequestContent =
new StringContent(JsonUtility.ToJson(login));
396 loginRequestContent.Headers.ContentType =
new MediaTypeWithQualityHeaderValue(
"application/json");
398 Debug.Log(
"[Platform API] Call to post api login.");
399 HttpResponseMessage response = await
handlingClient.PostAsync(
"/login", loginRequestContent);
400 string body = await response.Content.ReadAsStringAsync();
401 Debug.Log(
"[Platform API] Got response body: " + body);
405 responseContent = JsonConvert.DeserializeObject<
FailureResponse>(body);
408 Debug.Log(
"[Platform API] Response content deserialized.");
415 handlingClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(
"Bearer", authToken);
416 handlingClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(
"application/json"));
418 HttpResponseMessage response = await
handlingClient.GetAsync(
string.Format(
"/user/{0}", userId));
419 string body = await response.Content.ReadAsStringAsync();
424 responseContent = JsonConvert.DeserializeObject<
FailureResponse>(body);
433 handlingClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(
"Bearer", authToken);
434 handlingClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(
"application/json"));
437 usersModulesRequest.
UserIds.Add(userId);
438 HttpContent loginRequestContent =
new StringContent(JsonUtility.ToJson(usersModulesRequest));
439 loginRequestContent.Headers.ContentType =
new MediaTypeWithQualityHeaderValue(
"application/json");
441 HttpResponseMessage response = await
handlingClient.PostAsync(
"/access/users", loginRequestContent);
442 string body = await response.Content.ReadAsStringAsync();
446 responseContent = JsonConvert.DeserializeObject<
FailureResponse>(body);
459 apiHandlingClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(
"application/json"));
461 HttpResponseMessage response = await
apiHandlingClient.GetAsync(
string.Format(
"/v2/auth/quick-id/get-users?serialNumber={0}", serialNumber));
462 string body = await response.Content.ReadAsStringAsync();
464 Debug.Log($
"[Platform API] Body returned as {body}");
469 responseContent = JsonConvert.DeserializeObject<
FailureResponse>(body);
477 Debug.Log(
"[Platform API] Calling Quick ID login.");
480 HttpContent loginRequestContent =
new StringContent(JsonUtility.ToJson(login));
481 Debug.Log(
"[Platform API] Quick ID login request content: " + JsonUtility.ToJson(login));
482 loginRequestContent.Headers.ContentType =
new MediaTypeWithQualityHeaderValue(
"application/json");
484 Debug.Log(
"[Platform API] Call to post api Quick ID login.");
485 HttpResponseMessage response = await
apiHandlingClient.PostAsync(
"/v2/auth/quick-id/login", loginRequestContent);
486 string body = await response.Content.ReadAsStringAsync();
487 Debug.Log(
"[Platform API] Got response body: " + body);
493 responseContent = JsonConvert.DeserializeObject<
FailureResponse>(body);
499 loginResponseContent.Token = platformLoginResponse.
Token;
500 if (platformLoginResponse.User !=
null)
502 loginResponseContent.ID = platformLoginResponse.User.Id;
503 loginResponseContent.OrgId = platformLoginResponse.User.OrgId;
504 loginResponseContent.First = platformLoginResponse.User.FirstName;
505 loginResponseContent.Last = platformLoginResponse.User.LastName;
506 loginResponseContent.Email = platformLoginResponse.User.Email;
507 loginResponseContent.Role = platformLoginResponse.User.Role;
508 loginResponseContent.Org = platformLoginResponse.User.Org;
512 Debug.Log(
"[Platform API] Quick ID login response did not contain user data.");
516 Debug.Log(
"[Platform API] Response content deserialized and mapped.");
522 Debug.Log(
"[Platform API Handler] Get Module Access");
524 handlingClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(
"*/*"));
526 string optionalParameters =
"";
527 Debug.Log($
"Checking for a serial number: {serialNumber}");
528 if (!
string.IsNullOrEmpty(serialNumber))
530 optionalParameters =
"?serial=" + serialNumber;
534 $
"[{GetType().Name}] Checking module access at: "
535 + String.Format(
"/access/user/{0}/module/{1}{2}", userId, moduleId, optionalParameters)
539 String.Format(
"/access/user/{0}/module/{1}{2}", userId, moduleId, optionalParameters)
541 string body = await response.Content.ReadAsStringAsync();
543 Debug.Log($
"[{GetType().Name}] GetModuleAccess return body: {body}");
544 object responseContent = JsonConvert.DeserializeObject<
FailureResponse>(body);
552 public async
void SendHeartbeat(
string authToken,
int sessionId, Action<HttpResponseMessage, object> success =
null, Action<HttpResponseMessage, FailureResponse> failure =
null)
555 apiHandlingClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(
"Bearer", authToken);
556 apiHandlingClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(
"application/json"));
560 HttpContent heartbeatRequestContent =
new StringContent(heartbeatData.ToJSON());
561 heartbeatRequestContent.Headers.ContentType =
new MediaTypeWithQualityHeaderValue(
"application/json");
565 heartbeatRequestContent
567 string body = await response.Content.ReadAsStringAsync();
568 object responseContent = JsonConvert.DeserializeObject<
FailureResponse>(body);
575 success?.Invoke(response,
null);
578 public async
void JoinSession(
string authToken,
JoinSessionData joinData, Action<HttpResponseMessage, JoinSessionResponse> success, Action<HttpResponseMessage, FailureResponse> failure)
581 handlingClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(
"Bearer", authToken);
582 handlingClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(
"application/json"));
584 HttpContent joinSessionRequestContent =
new StringContent(joinData.ToJSON());
585 joinSessionRequestContent.Headers.ContentType =
new MediaTypeWithQualityHeaderValue(
"application/json");
587 HttpResponseMessage response = await
handlingClient.PostAsync(
"/event", joinSessionRequestContent);
588 string body = await response.Content.ReadAsStringAsync();
599 responseContent = joinSessionResponse;
605 public async
void CompleteSession(
string authToken,
CompleteSessionData completionData, Action<HttpResponseMessage, object> success, Action<HttpResponseMessage, FailureResponse> failure)
608 handlingClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(
"Bearer", authToken);
609 handlingClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(
"application/json"));
611 HttpContent completeSessionRequestContent =
new StringContent(completionData.ToJSON());
612 completeSessionRequestContent.Headers.ContentType =
new MediaTypeWithQualityHeaderValue(
"application/json");
614 HttpResponseMessage response = await
handlingClient.PostAsync(
"/event", completeSessionRequestContent);
615 string body = await response.Content.ReadAsStringAsync();
616 object responseContent = JsonConvert.DeserializeObject<
FailureResponse>(body);
623 success?.Invoke(response,
null);
626 public async
void SendSessionEvent(
string authToken,
SessionEventData sessionEvent, Action<HttpResponseMessage, object> success, Action<HttpResponseMessage, FailureResponse> failure)
629 handlingClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(
"Bearer", authToken);
630 handlingClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(
"application/json"));
632 HttpContent sessionEventRequestContent =
new StringContent(sessionEvent.ToJSON());
633 sessionEventRequestContent.Headers.ContentType =
new MediaTypeWithQualityHeaderValue(
"application/json");
635 HttpResponseMessage response = await
handlingClient.PostAsync(
"/event", sessionEventRequestContent);
636 string body = await response.Content.ReadAsStringAsync();
637 object responseContent = JsonConvert.DeserializeObject<
FailureResponse>(body);
644 success?.Invoke(response,
null);
650 handlingClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(
"Bearer", authToken);
651 handlingClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(
"application/json"));
653 string endpoint =
"/modules";
654 if (platform !=
null && platform.Length > 0)
656 endpoint += $
"?platform={platform}";
659 Debug.Log($
"GetModuleList built endpoint: {endpoint}");
661 HttpResponseMessage response = await
handlingClient.GetAsync(endpoint);
662 string body = await response.Content.ReadAsStringAsync();
666 var responseContent = JsonConvert.DeserializeObject<
FailureResponse>(body);
672 Debug.LogWarning(ex);
675 List<OrgModule> orgModules =
new List<OrgModule>();
676 JArray array = JArray.Parse(body);
679 var tokens = array.Children();
680 foreach (JToken selectedToken
in tokens)
683 orgModule.
Parse(selectedToken);
684 orgModules.Add(orgModule);
688 Debug.Log(orgModules.Count.ToString());
695 if (!String.IsNullOrEmpty(jsonResponse[
"errors"]?.ToString()))
697 string errorMessage = jsonResponse[
"errors"]?[0]?[
"message"]?.ToString() ??
"Unknown GraphQL error";
701 if (String.IsNullOrEmpty(jsonResponse[
"data"]?.ToString()) || String.IsNullOrEmpty(jsonResponse[
"data"][jsonDataObjectKey]?.ToString()))
706 Message =
"Invalid response format from server",
HttpClient handlingClient
APIHandler(string endpointUrl)
async void GetUserModules(string authToken, int userId)
async void GetUserMetricsForOrg(string authToken, int orgID, int page, FilterParams filterParams, Action< UserMetricsResponse, object > success, Action< HttpResponseMessage, FailureResponse > failure)
async void QuickIDLogin(QuickIDLoginData login)
HttpResponseMessage HandleException(Exception exception)
void EnsureURLHasProtocol(ref string url)
async void CompleteSession(string authToken, CompleteSessionData completionData, Action< HttpResponseMessage, object > success, Action< HttpResponseMessage, FailureResponse > failure)
async void LoginWithToken(string token)
HttpClient apiHandlingClient
async void Login(LoginData login)
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 GetSessionHistory(string authToken, int page, SessionFilters sessionFilters, FilterParams filterParams, Action< HttpResponseMessage, SessionHistoryResponse > success, Action< HttpResponseMessage, FailureResponse > failure)
async void SendHeartbeat(string authToken, int sessionId, Action< HttpResponseMessage, object > success=null, Action< HttpResponseMessage, FailureResponse > failure=null)
delegate void APIResponse(ResponseType type, HttpResponseMessage message, object responseData)
async void SendSessionEvent(string authToken, SessionEventData sessionEvent, Action< HttpResponseMessage, object > success, Action< HttpResponseMessage, FailureResponse > failure)
async void Ping(Action< HttpResponseMessage, object > success, Action< HttpResponseMessage, FailureResponse > failure)
void SetEndpoint(string endpointUrl)
async void GetDevicesForOrg(string authToken, int orgID, int page, FilterParams filterParams, Action< HttpResponseMessage, OrgDevicesResponse > success, Action< HttpResponseMessage, FailureResponse > failure)
APIResponse OnAPIResponse
async void JoinSession(string authToken, JoinSessionData joinData, Action< HttpResponseMessage, JoinSessionResponse > success, Action< HttpResponseMessage, FailureResponse > failure)
async void GetModuleAccess(int moduleId, int userId, string serialNumber)
async void GetModuleList(string authToken, string platform)
List< UserMetric > result
@ RT_QUICK_ID_AUTH_GET_USERS
@ RT_GET_USER_METRICS_FOR_ORG