СитоРамкиФильтрация | Сортировка | Суэггер
SieveFramework — это настраиваемая платформа, которая помогает упростить интеграцию фильтров, сортировок и разбиения на страницы в ваш проект с достаточным уровнем абстракции. Под капотом находится System.Linq.Expressions помогающий выполнять любые операции с коллекциями и получать встроенную поддержку запросов.
| Проект | Описание |
|---|---|
SieveFramework | Основной проект с базовым функционалом |
SieveFramework.AspNetCore | Необходимые зависимости для интеграции sieve с проектами ASP.Net Core |
SieveFramework.AspNetCore.Swashbuckle | Необходимые зависимости для интеграции sieve с платформой Swagger |
Основной поставщик — SieveProvider . Он просто содержит коллекцию ModelProvider , которая хранит информацию о конкретной модели:
Основной поставщик работает с предикатами — наборами действий над запрашиваемым ресурсом. Каждый предикат может выполнять только один тип действия запроса в рамках ресурса:
Такая конструкция помогает делегировать операции одного и того же типа одному исполнителю и контролирует направление операций в конвейере.
Формат фильтра, представленный анализаторами и используемый для привязки запроса запроса с использованием пользовательской привязки модели.
[!] Данные из тела запроса будут связаны с собственными связующими моделями ASP.Net.
Конфигурация встроенного парсера по умолчанию:
| Псевдоним | Описание |
|---|---|
~ | NODE_DELIMITER — используется для разделения значений внутри узла. |
& | OPERATION_DELIMITER — используется для разделения различных операций (разделитель запросов по умолчанию) |
filter= | FILTER — параметр запроса содержит фильтр |
sort= | SORT — параметр запроса содержит сортировки |
take= | TAKE — параметр запроса содержит размер выборки |
skip= | SKIP — параметр запроса содержит размер пропуска |
Планируемая функция — формат Swagger DeepObject для десериализации модели для запроса.
Структура: Property NODE_DELIMITER Alias NODE_DELIMITER Value
| Псевдоним (Родной) | Псевдоним (DeepObject) | Описание |
|---|---|---|
eq | TODO | Равно |
neq | TODO | Не равно |
gt | TODO | Больше, чем |
gte | TODO | Больше или равно |
lt | TODO | Меньше, чем |
lte | TODO | Меньше или равно |
Структура: Filter NODE_DELIMITER Alias NODE_DELIMITER Filter
| Псевдоним (Родной) | Псевдоним (DeepObject) | Описание |
|---|---|---|
and | TODO | Объединяет фильтры по и логике |
or | TODO | Объединяет фильтры по или по логике |
Фильтр, полученный в первую очередь с помощью
orусловия, так чтоnode~and~node~or~nodeбудет (node~and~node)~or~node.
Структура: Property NODE_DELIMITER Alias
| Псевдоним (Родной) | Псевдоним (DeepObject) | Описание |
|---|---|---|
asc | TODO | Сортировать по возрастанию |
desc | TODO | Сортировать по убыванию |
Узлы сортировки можно объединять только с помощью логики
and:
node~and~node
public void ConfigureServices ( IServiceCollection services )
{
services . AddSieveProvider ( config =>
{
// WithParser - Add custom Query parser. [NativeQueryParser] is default, no need to register them it's just an example
config . WithParser < NativeQueryParser > ( )
// ForAssemblies - Add assemblies to scan models by attributes [CanSort / CanFilter]
. ForAssemblies ( .. . )
// Fluent models registration
. ConfigureProvider ( provider =>
{
provider . AddModel < TestModel > ( builder =>
{
builder . CanSort ( p => p . TestProperty ) ;
builder . CanFilter ( p => p . TestProperty ) ;
} ) ;
} ) ;
} ) ;
services . AddControllers ( ) ;
} public class WeatherForecastController : ControllerBase
{
// [1] Accept processor through DI
private readonly ISieveProvider _sieve ;
public WeatherForecastController ( ISieveProvider sieve )
{
_sieve = sieve ;
}
// [2] Wrap processed model's resource with [Sieve] - It will be maped automaticly
[ HttpGet ]
public ActionResult GetCustom ( Sieve < WeatherForecast > model )
{
var rng = new Random ( ) ;
var query = Enumerable . Range ( 1 , 5 ) . Select ( index => new WeatherForecast
{
Date = DateTime . Now . AddDays ( index ) ,
TemperatureC = rng . Next ( - 20 , 55 ) ,
Summary = "Summary" + index
} ) . AsQueryable ( ) ;
// [3] Apply filter to resource
var result = _sieve . Apply ( query , model ) . ToArray ( ) ;
return Ok ( new
{
origin = query . ToArray ( ) ,
result = result
} ) ;
}
} public void ConfigureServices ( IServiceCollection services )
{
// [1] Must be registered before swagger
services . AddSieveProvider ( ) ;
services . AddControllers ( ) ;
services . AddSwaggerGen ( builder =>
{
// [2] Add configuration for swagger
services . AddSieveDescription ( builder ) ;
builder . SwaggerDoc ( "v1" , new OpenApiInfo
{
Title = "Test" ,
Version = "v1"
} ) ;
} ) ;
}Описания сит дополняют схему с помощью строго типизированной модели сита и списка разрешенных свойств сортировки и фильтрации для каждого действия API.