public async void GetMany_UserRequestsAnotherPartiesInstances_Ok() { // Arrange string requestUri = $"{BasePath}?instanceOwner.PartyId=1600"; HttpClient client = GetTestClient(); string token = PrincipalUtil.GetToken(3, 1337); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); int expectedNoInstances = 2; // Act HttpResponseMessage response = await client.GetAsync(requestUri); string json = await response.Content.ReadAsStringAsync(); InstanceQueryResponse queryResponse = JsonConvert.DeserializeObject <InstanceQueryResponse>(json); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(expectedNoInstances, queryResponse.TotalHits); }
public async void GetMany_OrgRequestsAllInstances_Ok() { // Arrange string requestUri = $"{BasePath}?org=ttd"; HttpClient client = GetTestClient(); string token = PrincipalUtil.GetOrgToken("ttd", scope: "altinn:instances.read"); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); int expectedNoInstances = 10; // Act HttpResponseMessage response = await client.GetAsync(requestUri); string json = await response.Content.ReadAsStringAsync(); InstanceQueryResponse queryResponse = JsonConvert.DeserializeObject <InstanceQueryResponse>(json); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(expectedNoInstances, queryResponse.TotalHits); }
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 Task <InstanceQueryResponse> GetInstancesFromQuery(Dictionary <string, StringValues> queryParams, string continuationToken, int size) { List <string> validQueryParams = new List <string> { "org", "appId", "process.currentTask", "process.isComplete", "process.endEvent", "process.ended", "instanceOwner.partyId", "lastChanged", "created", "visibleAfter", "dueBefore", "excludeConfirmedBy", "size", "language", "status.isSoftDeleted", "status.isArchived", "status.isArchivedOrSoftDeleted", "status.isActiveorSoftDeleted", "sortBy", "archiveReference" }; InstanceQueryResponse response = new InstanceQueryResponse(); string invalidKey = queryParams.FirstOrDefault(q => !validQueryParams.Contains(q.Key)).Key; if (!string.IsNullOrEmpty(invalidKey)) { response.Exception = $"Unknown query parameter: {invalidKey}"; return(Task.FromResult(response)); } List <Instance> instances = new List <Instance>(); string instancesPath = GetInstancesPath(); if (Directory.Exists(instancesPath)) { string[] files = Directory.GetFiles(instancesPath, "*.json", SearchOption.AllDirectories); foreach (var file in files) { string content = File.ReadAllText(file); Instance instance = (Instance)JsonConvert.DeserializeObject(content, typeof(Instance)); PostProcess(instance); instances.Add(instance); } } if (queryParams.ContainsKey("org")) { string org = queryParams.GetValueOrDefault("org").ToString(); instances.RemoveAll(i => !i.Org.Equals(org, StringComparison.OrdinalIgnoreCase)); } if (queryParams.ContainsKey("appId")) { string appId = queryParams.GetValueOrDefault("appId").ToString(); instances.RemoveAll(i => !i.AppId.Equals(appId, StringComparison.OrdinalIgnoreCase)); } if (queryParams.ContainsKey("instanceOwner.partyId")) { instances.RemoveAll(i => !queryParams["instanceOwner.partyId"].Contains(i.InstanceOwner.PartyId)); } if (queryParams.ContainsKey("archiveReference")) { string archiveRef = queryParams.GetValueOrDefault("archiveReference").ToString(); instances.RemoveAll(i => !i.Id.EndsWith(archiveRef.ToLower())); } bool match; if (queryParams.ContainsKey("status.isArchived") && bool.TryParse(queryParams.GetValueOrDefault("isArchived"), out match)) { instances.RemoveAll(i => i.Status.IsArchived != match); } if (queryParams.ContainsKey("status.isSoftDeleted") && bool.TryParse(queryParams.GetValueOrDefault("isSoftDeleted"), out match)) { instances.RemoveAll(i => i.Status.IsSoftDeleted != match); } instances.RemoveAll(i => i.Status.IsHardDeleted == true); response.Instances = instances; response.Count = instances.Count; return(Task.FromResult(response)); }
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; bool isOrgQuerying = false; // if user is org string orgClaim = User.GetOrg(); int? userId = User.GetUserIdAsInt(); if (orgClaim != null) { isOrgQuerying = true; if (!_authzHelper.ContainsRequiredScope(InstanceReadScope, User)) { return(Forbid()); } if (string.IsNullOrEmpty(org) && string.IsNullOrEmpty(appId)) { return(BadRequest("Org or AppId must be defined.")); } org = string.IsNullOrEmpty(org) ? appId.Split('/')[0] : org; if (!orgClaim.Equals(org, StringComparison.InvariantCultureIgnoreCase)) { return(Forbid()); } } else if (userId != null) { if (instanceOwnerPartyId == null) { return(BadRequest("InstanceOwnerPartyId must be defined.")); } } else { return(BadRequest()); } if (!string.IsNullOrEmpty(continuationToken)) { selfContinuationToken = continuationToken; continuationToken = HttpUtility.UrlDecode(continuationToken); } Dictionary <string, StringValues> queryParams = QueryHelpers.ParseQuery(Request.QueryString.Value); string host = $"https://platform.{_generalSettings.Hostname}"; string url = Request.Path; string query = Request.QueryString.Value; try { InstanceQueryResponse result = await _instanceRepository.GetInstancesFromQuery(queryParams, continuationToken, pageSize); if (!string.IsNullOrEmpty(result.Exception)) { return(BadRequest(result.Exception)); } if (!isOrgQuerying) { int originalCount = result.Instances.Count; result.Instances = await _authzHelper.AuthorizeInstances(User, result.Instances); result.Count = result.Instances.Count; result.TotalHits -= originalCount - result.Instances.Count; } 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 (!string.IsNullOrEmpty(nextContinuationToken)) { 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}")); } }
public async Task <ActionResult> SearchMessageBoxInstances( [FromQuery(Name = "instanceOwner.partyId")] int instanceOwnerPartyId, [FromQuery] string appId, [FromQuery] bool includeActive, [FromQuery] bool includeArchived, [FromQuery] bool includeDeleted, [FromQuery] string lastChanged, [FromQuery] string created, [FromQuery] string searchString, [FromQuery] string archiveReference, [FromQuery] string language) { string[] acceptedLanguages = { "en", "nb", "nn" }; string languageId = "nb"; if (language != null && acceptedLanguages.Contains(language.ToLower())) { languageId = language.ToLower(); } Dictionary <string, StringValues> queryParams = QueryHelpers.ParseQuery(Request.QueryString.Value); if (!string.IsNullOrEmpty(archiveReference)) { if ((includeActive == includeArchived) && (includeActive == includeDeleted)) { includeActive = false; includeDeleted = true; includeArchived = true; } else if (includeActive && !includeArchived && !includeDeleted) { return(Ok(new List <MessageBoxInstance>())); } else if (includeActive && (includeArchived || includeDeleted)) { includeActive = false; } } GetStatusFromQueryParams(includeActive, includeArchived, includeDeleted, queryParams); queryParams.Add("sortBy", "desc:lastChanged"); if (!string.IsNullOrEmpty(searchString)) { StringValues applicationIds = await MatchStringToAppTitle(searchString); if (!applicationIds.Any() || (!string.IsNullOrEmpty(appId) && !applicationIds.Contains(appId))) { return(Ok(new List <MessageBoxInstance>())); } else if (string.IsNullOrEmpty(appId)) { queryParams.Add("appId", applicationIds); } queryParams.Remove(nameof(searchString)); } InstanceQueryResponse queryResponse = await _instanceRepository.GetInstancesFromQuery(queryParams, string.Empty, 100); if (queryResponse?.Exception != null) { if (queryResponse.Exception.StartsWith("Unknown query parameter")) { return(BadRequest(queryResponse.Exception)); } return(StatusCode(500, queryResponse.Exception)); } if (queryResponse == null || queryResponse.Count <= 0) { return(Ok(new List <MessageBoxInstance>())); } List <Instance> allInstances = queryResponse.Instances; allInstances.RemoveAll(i => i.VisibleAfter > DateTime.UtcNow); allInstances.ForEach(i => { if (i.Status.IsArchived || i.Status.IsSoftDeleted) { i.DueBefore = null; } }); List <MessageBoxInstance> authorizedInstances = await _authorizationHelper.AuthorizeMesseageBoxInstances(HttpContext.User, allInstances); List <string> appIds = authorizedInstances.Select(i => InstanceHelper.GetAppId(i)).Distinct().ToList(); List <TextResource> texts = await _textRepository.Get(appIds, languageId); InstanceHelper.ReplaceTextKeys(authorizedInstances, texts, languageId); return(Ok(authorizedInstances)); }
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 Task <InstanceQueryResponse> GetInstancesFromQuery(Dictionary <string, StringValues> queryParams, string continuationToken, int size) { InstanceQueryResponse response = new InstanceQueryResponse(); List <Instance> instances = new List <Instance>(); string instancesPath = GetInstancesPath(); if (queryParams.ContainsKey("appId")) { string appId = queryParams.GetValueOrDefault("appId").ToString(); if (Directory.Exists(instancesPath)) { string[] files = Directory.GetFiles(instancesPath, "*.json", SearchOption.AllDirectories); foreach (var file in files) { string content = File.ReadAllText(file); Instance instance = (Instance)JsonConvert.DeserializeObject(content, typeof(Instance)); if (instance.AppId.Equals(appId, StringComparison.InvariantCultureIgnoreCase)) { PostProcess(instance); instances.Add(instance); } } } } else if (queryParams.ContainsKey("instanceOwner.PartyId")) { instancesPath += $"\\{queryParams.GetValueOrDefault("instanceOwner.PartyId")}"; string[] files = Directory.GetFiles(instancesPath, "*.json", SearchOption.AllDirectories); foreach (var file in files) { string content = File.ReadAllText(file); Instance instance = (Instance)JsonConvert.DeserializeObject(content, typeof(Instance)); PostProcess(instance); instances.Add(instance); } } else if (queryParams.ContainsKey("org")) { string org = queryParams.GetValueOrDefault("org").ToString(); if (Directory.Exists(instancesPath)) { string[] files = Directory.GetFiles(instancesPath, "*.json", SearchOption.AllDirectories); foreach (var file in files) { string content = File.ReadAllText(file); Instance instance = (Instance)JsonConvert.DeserializeObject(content, typeof(Instance)); if (instance.Org.Equals(org, StringComparison.InvariantCultureIgnoreCase)) { PostProcess(instance); instances.Add(instance); } } } } response.Instances = instances; response.Count = instances.Count; response.TotalHits = instances.Count; return(Task.FromResult(response)); }
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}")); } }