Ejemplo n.º 1
0
 public static Filter[] GetFilters(this ObjectSearchRequest query)
 {
     return(query.Conditions == null
                ? new Filter[0]
                : query.Conditions.Select(x => new Filter
     {
         Field = x.Path,
         Type = x.Operator,
         Value = x.Value,
     }).ToArray());
 }
Ejemplo n.º 2
0
 public static Sort[] GetSorts(this ObjectSearchRequest query)
 {
     return(query.Sort == null
                ? new Sort[0]
                : new[]
     {
         new Sort
         {
             Direction = query.Sort.SortOrder,
             Field = query.Sort.Path,
         }
     });
 }
Ejemplo n.º 3
0
        public async Task <SearchResult> SearchObjects(string objectIdentifier, ObjectSearchRequest query, bool isSuperUser)
        {
            var type   = schemaRegistry.GetTypeByTypeIdentifier(objectIdentifier);
            var schema = schemaRegistry.GetSchemaByTypeIdentifier(objectIdentifier);

            if (!schema.Description.AllowReadAll && !query.Conditions.Any())
            {
                throw new InvalidOperationException($"Reading without filters is not allowed for {objectIdentifier}");
            }
            if (!schema.Description.AllowSort && query.Sorts.Any())
            {
                throw new InvalidOperationException($"Sorting is not allowed for {objectIdentifier}");
            }

            var offset     = query.Offset ?? 0;
            var count      = query.Count ?? 20;
            var countLimit = isSuperUser ? schema.Description.CountLimitForSuperUser : schema.Description.CountLimit;

            if (offset + count > countLimit)
            {
                throw new InvalidOperationException($"Expected offset ({offset}) + count ({count}) to be less than countLimit ({countLimit})");
            }

            var connector = schemaRegistry.GetConnector(objectIdentifier);
            var counts    = await connector.Count(query.Conditions, countLimit + 1).ConfigureAwait(false);

            var results = counts == null
                              ? await connector.Search(query.Conditions, query.Sorts, 0, countLimit + 1).ConfigureAwait(false)
                              : await connector.Search(query.Conditions, query.Sorts, offset, count).ConfigureAwait(false);

            var objects = results.Select(x => ObjectsConverter.StoredToApi(type, x, schema.CustomPropertyConfigurationProvider)).ToArray();

            return(new SearchResult
            {
                Count = counts,
                CountLimit = countLimit,
                Items = objects,
            });
        }
Ejemplo n.º 4
0
        public async Task <CountResult> CountObjects(string objectIdentifier, ObjectSearchRequest query, bool isSuperUser)
        {
            var schema = schemaRegistry.GetSchemaByTypeIdentifier(objectIdentifier);

            if (!schema.Description.AllowReadAll && !query.Conditions.Any())
            {
                throw new InvalidOperationException($"Reading without filters is not allowed for {objectIdentifier}");
            }
            if (!schema.Description.AllowSort && query.Sorts.Any())
            {
                throw new InvalidOperationException($"Sorting is not allowed for {objectIdentifier}");
            }

            var downloadLimit = isSuperUser ? schema.Description.DownloadLimitForSuperUser : schema.Description.DownloadLimit;

            var connector = schemaRegistry.GetConnector(objectIdentifier);
            var count     = await connector.Count(query.Conditions, downloadLimit + 1).ConfigureAwait(false);

            return(new CountResult
            {
                Count = count,
                CountLimit = downloadLimit,
            });
        }
Ejemplo n.º 5
0
 public Task <CountResult> CountObjects(string objectIdentifier, [FromBody] ObjectSearchRequest query) => impl.CountObjects(objectIdentifier, query, IsSuperUser());
Ejemplo n.º 6
0
 public Task <SearchResult> SearchObjects(string objectIdentifier, [FromBody] ObjectSearchRequest query) => impl.SearchObjects(objectIdentifier, query, true);
Ejemplo n.º 7
0
        public async Task <DownloadResult> DownloadObjects([NotNull] string objectIdentifier, [NotNull][FromBody] ObjectSearchRequest query)
        {
            var type          = schemaRegistry.GetTypeByTypeIdentifier(objectIdentifier);
            var schema        = schemaRegistry.GetSchemaByTypeIdentifier(objectIdentifier);
            var downloadLimit = schema.Description.DownloadLimit;
            var count         = await schemaRegistry.GetConnector(objectIdentifier).Count(query.GetFilters(), downloadLimit + 1).ConfigureAwait(false);

            if (count > downloadLimit)
            {
                return new DownloadResult
                       {
                           File       = null,
                           Count      = (int)count,
                           CountLimit = downloadLimit,
                       }
            }
            ;

            var results = await schemaRegistry.GetConnector(objectIdentifier).Search(query.GetFilters(), query.GetSorts(), 0, downloadLimit).ConfigureAwait(false);

            var properties = new List <string>();
            var getters    = new List <Func <object, object> >();

            PropertyHelpers.BuildGettersForProperties(type, "", x => x, properties, getters);

            var excludedIndices    = properties.Select((x, i) => (x, i)).Where(x => query.ExcludedFields.Contains(x.x)).Select(x => x.i).ToArray();
            var filteredProperties = properties.Where((x, i) => !excludedIndices.Contains(i)).ToArray();
            var filteredGetters    = getters.Where((x, i) => !excludedIndices.Contains(i)).ToArray();

            var csvWriter = new CsvWriter(filteredProperties);

            foreach (var item in results)
            {
                csvWriter.AddRow(filteredGetters.Select(f => PropertyHelpers.ToString(f, item)).ToArray());
            }

            return(new DownloadResult
            {
                Count = count ?? 0,
                CountLimit = downloadLimit,
                File = new FileInfo
                {
                    Content = csvWriter.GetBytes(),
                    ContentType = "text/csv",
                    Name = $"{objectIdentifier}-{DateTime.UtcNow:yyyy-MM-dd-HHmm}.csv"
                }
            });
        }
Ejemplo n.º 8
0
        public async Task <SearchResult <object> > SearchObjects([NotNull] string objectIdentifier, [NotNull][FromBody] ObjectSearchRequest query)
        {
            var type       = schemaRegistry.GetTypeByTypeIdentifier(objectIdentifier);
            var schema     = schemaRegistry.GetSchemaByTypeIdentifier(objectIdentifier);
            var countLimit = schema.Description.CountLimit;
            var connector  = schemaRegistry.GetConnector(objectIdentifier);
            var counts     = await connector.Count(query.GetFilters(), countLimit + 1).ConfigureAwait(false);

            var results = await connector.Search(query.GetFilters(), query.GetSorts(), query.Offset ?? 0, query.Count ?? 20).ConfigureAwait(false);

            var typeInfo = TypeInfoExtractor.Extract(type, schema.PropertyDescriptionBuilder, schema.CustomPropertyConfigurationProvider);
            var objects  = results.Select(x => ObjectsConverter.StoredToApi(typeInfo, type, x, schema.CustomPropertyConfigurationProvider)).ToArray();

            return(new SearchResult <object>
            {
                Count = counts ?? objects.Length,
                CountLimit = countLimit,
                Items = objects,
            });
        }
Ejemplo n.º 9
0
        public async Task <ObjectDetails> ReadObject([NotNull] string objectIdentifier, [NotNull][FromBody] ObjectSearchRequest query)
        {
            var type     = schemaRegistry.GetTypeByTypeIdentifier(objectIdentifier);
            var schema   = schemaRegistry.GetSchemaByTypeIdentifier(objectIdentifier);
            var typeMeta = PropertyHelpers.BuildTypeMetaInformation(type, schema.PropertyDescriptionBuilder, schema.CustomPropertyConfigurationProvider);
            var result   = await schemaRegistry.GetConnector(objectIdentifier).Read(query.GetFilters()).ConfigureAwait(false);

            var typeInfo = TypeInfoExtractor.Extract(result, type, schema.PropertyDescriptionBuilder, schema.CustomPropertyConfigurationProvider);
            var obj      = ObjectsConverter.StoredToApi(typeInfo, type, result, schema.CustomPropertyConfigurationProvider);

            return(new ObjectDetails
            {
                Object = obj,
                Meta = new ObjectDescription
                {
                    Identifier = objectIdentifier,
                    SchemaDescription = schema.Description,
                    TypeMetaInformation = typeMeta,
                }
            });
        }
Ejemplo n.º 10
0
 public Task <ObjectDetails> ReadObject(string objectIdentifier, [FromBody] ObjectSearchRequest query) => impl.ReadObject(objectIdentifier, query);
Ejemplo n.º 11
0
 public Task <DownloadResult> DownloadObjects(string objectIdentifier, [FromBody] ObjectSearchRequest query) => impl.DownloadObjects(objectIdentifier, query);