public async Task <ActionResult> GetInstances( string org, string appId, [FromQuery(Name = "process.currentTask")] string currentTaskId, [FromQuery(Name = "process.isComplete")] bool?processIsComplete, [FromQuery(Name = "process.isInError")] bool?processIsInError, [FromQuery(Name = "process.endState")] string processEndState, [FromQuery] int?instanceOwnerId, [FromQuery] string labels, [FromQuery] string lastChangedDateTime, [FromQuery] string createdDateTime, [FromQuery] string visibleDateTime, [FromQuery] string dueDateTime, string continuationToken, int?size) { int pageSize = size ?? 100; string selfContinuationToken = null; if (!string.IsNullOrEmpty(continuationToken)) { selfContinuationToken = continuationToken; continuationToken = HttpUtility.UrlDecode(continuationToken); } Dictionary <string, StringValues> queryParams = QueryHelpers.ParseQuery(Request.QueryString.Value); string host = $"{Request.Scheme}://{Request.Host.ToUriComponent()}"; string url = Request.Path; string query = Request.QueryString.Value; logger.LogInformation($"uri = {url}{query}"); try { InstanceQueryResponse result = await _instanceRepository.GetInstancesOfApplication(queryParams, continuationToken, pageSize); if (result.TotalHits == 0) { return(NotFound($"Did not find any instances")); } if (!string.IsNullOrEmpty(result.Exception)) { return(BadRequest(result.Exception)); } string nextContinuationToken = HttpUtility.UrlEncode(result.ContinuationToken); result.ContinuationToken = null; HALResponse response = new HALResponse(result); if (continuationToken == null) { string selfUrl = $"{host}{url}{query}"; result.Self = selfUrl; Link selfLink = new Link("self", selfUrl); response.AddLinks(selfLink); } else { string selfQueryString = BuildQueryStringWithOneReplacedParameter( queryParams, "continuationToken", selfContinuationToken); string selfUrl = $"{host}{url}{selfQueryString}"; result.Self = selfUrl; Link selfLink = new Link("self", selfUrl); response.AddLinks(selfLink); } if (nextContinuationToken != null) { string nextQueryString = BuildQueryStringWithOneReplacedParameter( queryParams, "continuationToken", nextContinuationToken); string nextUrl = $"{host}{url}{nextQueryString}"; result.Next = nextUrl; Link nextLink = new Link("next", nextUrl); response.AddLinks(nextLink); } // add self links to platform result.Instances.ForEach(i => AddSelfLinks(Request, i)); StringValues acceptHeader = Request.Headers["Accept"]; if (acceptHeader.Any() && acceptHeader.Contains("application/hal+json")) { /* Response object should be expressed as HAL (Hypertext Application Language) with _embedded and _links. * Thus we reset the response object's inline instances, next and self elements.*/ response.AddEmbeddedCollection("instances", result.Instances); result.Instances = null; result.Next = null; result.Self = null; } return(Ok(response)); } catch (Exception e) { logger.LogError("exception", e); return(StatusCode(500, $"Unable to perform query due to: {e.Message}")); } }
public async Task <ActionResult> GetInstances( string org, string appId, [FromQuery(Name = "process.currentTask")] string currentTaskId, [FromQuery(Name = "process.isComplete")] bool?processIsComplete, [FromQuery(Name = "process.endEvent")] string processEndEvent, [FromQuery(Name = "process.ended")] string processEnded, [FromQuery(Name = "instanceOwner.partyId")] int?instanceOwnerPartyId, [FromQuery(Name = "appOwner.labels")] string labels, [FromQuery] string lastChanged, [FromQuery] string created, [FromQuery(Name = "visibleAfter")] string visibleAfter, [FromQuery] string dueBefore, string continuationToken, int?size) { int pageSize = size ?? 100; string selfContinuationToken = null; if (!string.IsNullOrEmpty(continuationToken)) { selfContinuationToken = continuationToken; continuationToken = HttpUtility.UrlDecode(continuationToken); } Dictionary <string, StringValues> queryParams = QueryHelpers.ParseQuery(Request.QueryString.Value); string host = $"{Request.Scheme}://{Request.Host.ToUriComponent()}"; string url = Request.Path; string query = Request.QueryString.Value; _logger.LogInformation($"uri = {url}{query}"); try { InstanceQueryResponse result = await _instanceRepository.GetInstancesOfApplication(queryParams, continuationToken, pageSize); if (!string.IsNullOrEmpty(result.Exception)) { return(BadRequest(result.Exception)); } string nextContinuationToken = HttpUtility.UrlEncode(result.ContinuationToken); result.ContinuationToken = null; QueryResponse <Instance> response = new QueryResponse <Instance> { Instances = result.Instances, Count = result.Instances.Count, TotalHits = result.TotalHits ?? 0 }; if (continuationToken == null) { string selfUrl = $"{host}{url}{query}"; response.Self = selfUrl; } else { string selfQueryString = BuildQueryStringWithOneReplacedParameter( queryParams, "continuationToken", selfContinuationToken); string selfUrl = $"{host}{url}{selfQueryString}"; response.Self = selfUrl; } if (nextContinuationToken != null) { string nextQueryString = BuildQueryStringWithOneReplacedParameter( queryParams, "continuationToken", nextContinuationToken); string nextUrl = $"{host}{url}{nextQueryString}"; response.Next = nextUrl; } // add self links to platform result.Instances.ForEach(i => AddSelfLinks(Request, i)); return(Ok(response)); } catch (Exception e) { _logger.LogError($"Unable to perform query on instances due to: {e}"); return(StatusCode(500, $"Unable to perform query on instances due to: {e.Message}")); } }
public async Task <ActionResult <QueryResponse <Instance> > > GetInstances( [FromQuery] string org, [FromQuery] string appId, [FromQuery(Name = "process.currentTask")] string currentTaskId, [FromQuery(Name = "process.isComplete")] bool?processIsComplete, [FromQuery(Name = "process.endEvent")] string processEndEvent, [FromQuery(Name = "process.ended")] string processEnded, [FromQuery(Name = "instanceOwner.partyId")] int?instanceOwnerPartyId, [FromQuery] string lastChanged, [FromQuery] string created, [FromQuery(Name = "visibleAfter")] string visibleAfter, [FromQuery] string dueBefore, string continuationToken, int?size) { int pageSize = size ?? 100; string selfContinuationToken = null; if (string.IsNullOrEmpty(org) && string.IsNullOrEmpty(appId)) { return(BadRequest("Org or AppId must be defined.")); } org = string.IsNullOrEmpty(org) ? appId.Split('/')[0] : org; _logger.LogInformation($" // InstancesController // GetInstances // Tyring to get instances for org: {org}"); if (!AuthorizationHelper.VerifyOrgInClaimPrincipal(org, HttpContext.User)) { return(Forbid()); } if (!string.IsNullOrEmpty(continuationToken)) { selfContinuationToken = continuationToken; continuationToken = HttpUtility.UrlDecode(continuationToken); } Dictionary <string, StringValues> queryParams = QueryHelpers.ParseQuery(Request.QueryString.Value); string host = $"https://{_generalSettings.GetHostName}"; string url = Request.Path; string query = Request.QueryString.Value; _logger.LogInformation($"uri = {url}{query}"); try { InstanceQueryResponse result = await _instanceRepository.GetInstancesOfApplication(queryParams, continuationToken, pageSize); if (!string.IsNullOrEmpty(result.Exception)) { return(BadRequest(result.Exception)); } string nextContinuationToken = HttpUtility.UrlEncode(result.ContinuationToken); result.ContinuationToken = null; QueryResponse <Instance> response = new QueryResponse <Instance> { Instances = result.Instances, Count = result.Instances.Count, TotalHits = result.TotalHits ?? 0 }; if (continuationToken == null) { string selfUrl = $"{host}{url}{query}"; response.Self = selfUrl; } else { string selfQueryString = BuildQueryStringWithOneReplacedParameter( queryParams, "continuationToken", selfContinuationToken); string selfUrl = $"{host}{url}{selfQueryString}"; response.Self = selfUrl; } if (nextContinuationToken != null) { string nextQueryString = BuildQueryStringWithOneReplacedParameter( queryParams, "continuationToken", nextContinuationToken); string nextUrl = $"{host}{url}{nextQueryString}"; response.Next = nextUrl; } // add self links to platform result.Instances.ForEach(i => i.SetPlatformSelfLinks(_storageBaseAndHost)); return(Ok(response)); } catch (Exception e) { _logger.LogError($"Unable to perform query on instances due to: {e}"); return(StatusCode(500, $"Unable to perform query on instances due to: {e.Message}")); } }