public async Task <IActionResult> Search(string resourceType, [FromBody] SearchSCIMResourceParameter searchRequest) { var org = this.User.Claims.First(c => c.Type == "scope").Value; searchRequest.Filter = string.IsNullOrWhiteSpace(searchRequest.Filter) ? $"organization eq {org}" : $"{searchRequest.Filter} and organization eq {org}"; return(await InternalSearch(searchRequest, resourceType)); }
public async Task <IActionResult> Get() { var searchRequest = SearchSCIMResourceParameter.Create(Request.Query); try { if (searchRequest.Count > _options.MaxResults) { searchRequest.Count = _options.MaxResults; } var result = await _scimRepresentationQueryRepository.FindSCIMRepresentations(new SearchSCIMRepresentationsParameter(_scimEndpoint, searchRequest.StartIndex, searchRequest.Count, searchRequest.SortBy, searchRequest.SortOrder, SCIMFilterParser.Parse(searchRequest.Filter, _schemas))); var jObj = new JObject { { SCIMConstants.StandardSCIMRepresentationAttributes.Schemas, new JArray(new [] { SCIMConstants.StandardSchemas.ListResponseSchemas.Id }) }, { SCIMConstants.StandardSCIMRepresentationAttributes.TotalResults, result.TotalResults }, { SCIMConstants.StandardSCIMRepresentationAttributes.ItemsPerPage, searchRequest.Count }, { SCIMConstants.StandardSCIMRepresentationAttributes.StartIndex, searchRequest.StartIndex } }; var resources = new JArray(); foreach (var record in result.Content) { JObject newJObj = null; var location = $"{Request.GetAbsoluteUriWithVirtualPath()}/{_scimEndpoint}/{record.Id}"; if (searchRequest.Attributes.Any()) { newJObj = record.ToResponseWithIncludedAttributes(searchRequest.Attributes.Select(a => SCIMFilterParser.Parse(a, _schemas)).ToList()); } else if (searchRequest.ExcludedAttributes.Any()) { newJObj = record.ToResponseWithExcludedAttributes(searchRequest.ExcludedAttributes.Select(a => SCIMFilterParser.Parse(a, _schemas)).ToList(), location); } else { newJObj = record.ToResponse(location, true); } resources.Add(newJObj); } jObj.Add(SCIMConstants.StandardSCIMRepresentationAttributes.Resources, resources); return(new ContentResult { StatusCode = (int)HttpStatusCode.OK, Content = jObj.ToString(), ContentType = SCIMConstants.STANDARD_SCIM_CONTENT_TYPE }); } catch (SCIMFilterException ex) { return(this.BuildError(HttpStatusCode.BadRequest, ex.Message, "invalidFilter")); } }
/// <summary> /// Get CustomResources /// </summary> /// <returns></returns> public override Task <IActionResult> Get([FromQuery] SearchSCIMResourceParameter searchRequest) { return(base.Get(searchRequest)); }
public virtual Task <IActionResult> Search([FromBody] SearchSCIMResourceParameter searchRequest) { return(InternalSearch(searchRequest)); }
private async Task <IActionResult> InternalSearch(SearchSCIMResourceParameter searchRequest) { _logger.LogInformation(Global.StartGetResources); try { if (searchRequest.Count > _options.MaxResults) { searchRequest.Count = _options.MaxResults; } var schema = await _scimSchemaQueryRepository.FindRootSCIMSchemaByResourceType(_resourceType); var schemaIds = new List <string> { schema.Id }; schemaIds.AddRange(schema.SchemaExtensions.Select(s => s.Schema)); var schemas = (await _scimSchemaQueryRepository.FindSCIMSchemaByIdentifiers(schemaIds)).ToList(); var result = await _scimRepresentationQueryRepository.FindSCIMRepresentations(new SearchSCIMRepresentationsParameter(_resourceType, searchRequest.StartIndex - 1, searchRequest.Count, searchRequest.SortBy, searchRequest.SortOrder, SCIMFilterParser.Parse(searchRequest.Filter, schemas))); var jObj = new JObject { { SCIMConstants.StandardSCIMRepresentationAttributes.Schemas, new JArray(new [] { SCIMConstants.StandardSchemas.ListResponseSchemas.Id }) }, { SCIMConstants.StandardSCIMRepresentationAttributes.TotalResults, result.TotalResults }, { SCIMConstants.StandardSCIMRepresentationAttributes.ItemsPerPage, searchRequest.Count }, { SCIMConstants.StandardSCIMRepresentationAttributes.StartIndex, searchRequest.StartIndex } }; var resources = new JArray(); var baseUrl = Request.GetAbsoluteUriWithVirtualPath(); var representations = result.Content.ToList(); await _attributeReferenceEnricher.Enrich(_resourceType, representations, baseUrl); foreach (var record in representations) { JObject newJObj = null; var location = $"{baseUrl}/{_resourceType}/{record.Id}"; if (searchRequest.Attributes.Any()) { newJObj = record.ToResponseWithIncludedAttributes(searchRequest.Attributes.Select(a => SCIMFilterParser.Parse(a, schemas)).ToList()); } else if (searchRequest.ExcludedAttributes.Any()) { newJObj = record.ToResponseWithExcludedAttributes(searchRequest.ExcludedAttributes.Select(a => SCIMFilterParser.Parse(a, schemas)).ToList(), location); } else { newJObj = record.ToResponse(location, true); } resources.Add(newJObj); } jObj.Add(SCIMConstants.StandardSCIMRepresentationAttributes.Resources, resources); return(new ContentResult { StatusCode = (int)HttpStatusCode.OK, Content = jObj.ToString(), ContentType = SCIMConstants.STANDARD_SCIM_CONTENT_TYPE }); } catch (SCIMFilterException ex) { _logger.LogError(ex, ex.Message); return(this.BuildError(HttpStatusCode.BadRequest, ex.Message, SCIMConstants.ErrorSCIMTypes.InvalidFilter)); } catch (Exception ex) { _logger.LogError(ex, ex.Message); return(this.BuildError(HttpStatusCode.InternalServerError, ex.ToString(), SCIMConstants.ErrorSCIMTypes.InternalServerError)); } }
public Task <IActionResult> Search([FromBody] JObject jObj) { var searchRequest = SearchSCIMResourceParameter.Create(jObj); return(InternalSearch(searchRequest)); }
public Task <IActionResult> Get() { var searchRequest = SearchSCIMResourceParameter.Create(Request.Query); return(InternalSearch(searchRequest)); }
protected async Task <IActionResult> InternalSearch(SearchSCIMResourceParameter searchRequest, string resourceType) { try { var schema = await _scimSchemaQueryRepository.FindRootSCIMSchemaByResourceType(resourceType); var schemaIds = new List <string> { schema.Id }; schemaIds.AddRange(schema.SchemaExtensions.Select(s => s.Schema)); var schemas = (await _scimSchemaQueryRepository.FindSCIMSchemaByIdentifiers(schemaIds)).ToList(); if (searchRequest.StartIndex <= 0) { return(this.BuildError(HttpStatusCode.BadRequest, Global.StartIndexMustBeSuperiorOrEqualTo1)); } var sortByFilter = SCIMFilterParser.Parse(searchRequest.SortBy, schemas); var standardSchemas = new List <SCIMSchema> { StandardSchemas.StandardResponseSchemas }; standardSchemas.AddRange(schemas); var includedAttributes = searchRequest.Attributes == null ? new List <SCIMAttributeExpression>() : searchRequest.Attributes.Select(a => SCIMFilterParser.Parse(a, standardSchemas)).Cast <SCIMAttributeExpression>().ToList(); var excludedAttributes = searchRequest.ExcludedAttributes == null ? new List <SCIMAttributeExpression>() : searchRequest.ExcludedAttributes.Select(a => SCIMFilterParser.Parse(a, standardSchemas)).Cast <SCIMAttributeExpression>().ToList(); var result = await _scimRepresentationQueryRepository.FindSCIMRepresentations(new SearchSCIMRepresentationsParameter(resourceType, searchRequest.StartIndex, searchRequest.Count.Value, sortByFilter, searchRequest.SortOrder, SCIMFilterParser.Parse(searchRequest.Filter, schemas), includedAttributes, excludedAttributes)); var jObj = new JObject { { StandardSCIMRepresentationAttributes.Schemas, new JArray(new [] { StandardSchemas.ListResponseSchemas.Id }) }, { StandardSCIMRepresentationAttributes.TotalResults, result.TotalResults }, { StandardSCIMRepresentationAttributes.ItemsPerPage, searchRequest.Count }, { StandardSCIMRepresentationAttributes.StartIndex, searchRequest.StartIndex } }; var resources = new JArray(); var baseUrl = Request.GetAbsoluteUriWithVirtualPath(); var representations = result.Content.ToList(); foreach (var representation in representations) { representation.Schemas = schemas; } await _attributeReferenceEnricher.Enrich(resourceType, representations, baseUrl); foreach (var record in representations) { JObject newJObj = null; var location = $"{baseUrl}/{_resourceTypeResolver.ResolveByResourceType(resourceType).ControllerName}/{record.Id}"; bool includeStandardRequest = true; if (searchRequest.Attributes.Any()) { record.AddStandardAttributes(location, searchRequest.Attributes, true, false); includeStandardRequest = false; } else if (searchRequest.ExcludedAttributes.Any()) { record.AddStandardAttributes(location, searchRequest.ExcludedAttributes, false, false); includeStandardRequest = false; } else { record.ApplyEmptyArray(); } newJObj = record.ToResponse(location, true, includeStandardRequest); resources.Add(newJObj); } jObj.Add(StandardSCIMRepresentationAttributes.Resources, resources); return(new ContentResult { StatusCode = (int)HttpStatusCode.OK, Content = jObj.ToString(), ContentType = SCIMConstants.STANDARD_SCIM_CONTENT_TYPE }); } catch (SCIMFilterException ex) { return(this.BuildError(HttpStatusCode.BadRequest, ex.Message, SCIMConstants.ErrorSCIMTypes.InvalidFilter)); } catch (Exception ex) { return(this.BuildError(HttpStatusCode.InternalServerError, ex.ToString(), SCIMConstants.ErrorSCIMTypes.InternalServerError)); } }