Фильтрация и пагинация
Список записей можно получить двумя способами:
GET /api/e/{model}— простой список с базовой пагинациейPOST /api/e/{model}/list-server— server-side фильтрация в формате AG Grid
GET /api/e/
curl "https://app.orbita.example/api/e/it_requests?page=1&per_page=25" \
-H "Authorization: Bearer <token>"Параметры:
| Параметр | Тип | Описание |
|---|---|---|
page | int | Страница (по умолчанию 1) |
per_page | int | Записей на страницу |
Ответ включает meta.total, meta.last_page.
POST /api/e/{model}/list-server
Server-side список в формате AG Grid Server Side Row Model.
POST /api/e/it_requests/list-server
Authorization: Bearer <token>
Content-Type: application/jsonСтруктура запроса
{
"filterModel": {
"поле": { ... условие фильтра ... }
},
"sortModel": [
{ "colId": "created_at", "sort": "desc" }
],
"quickFilter": "текст поиска",
"startRow": 0,
"endRow": 25
}startRow / endRow определяют срез (0-based). startRow: 0, endRow: 25 → первые 25 записей.
Типы фильтров (filterModel)
Text — текстовые поля
"name": {
"filterType": "text",
"type": "contains",
"filter": "VPN"
}type | SQL | Примечание |
|---|---|---|
contains | LIKE '%VPN%' | Подстрока |
equals | LIKE '%VPN%' | Технически то же что contains — особенность реализации |
Поведение equals
В текущей реализации оба оператора (contains и equals) генерируют LIKE '%value%'. Для точного совпадения используйте set-фильтр с одним значением.
Number — числовые поля
"sla_hours": {
"filterType": "number",
"filter": 8
}Применяет прямое равенство: WHERE sla_hours = 8.
Date — поля дата/время
"created_at": {
"filterType": "date",
"dateFrom": "2024-02-01"
}- Для стандартных колонок:
whereDate('created_at', '2024-02-01') - Для JSON-полей:
LIKE '2024-02-01%'(строковое сравнение)
Только dateFrom
Поле dateTo (диапазон дат) в текущей реализации не обрабатывается. Для диапазона используйте два отдельных запроса или фильтруйте на стороне клиента.
Set — фильтр по множеству значений
"status": {
"filterType": "set",
"values": ["new", "assigned", "in_work"]
}Генерирует WHERE status IN ('new', 'assigned', 'in_work').
Используйте для:
value_list— выбрать несколько значений из справочникаstate_model— показать несколько статусовuser— заявки нескольких исполнителей
Быстрый текстовый поиск (quickFilter)
{
"quickFilter": "принтер"
}Ищет по id и всей колонке data (JSONB):
WHERE id LIKE '%принтер%' OR data::text LIKE '%принтер%'Быстрый поиск работает независимо от filterModel — они применяются вместе через AND.
Производительность
quickFilter делает полный поиск по JSON-блобу. На больших объёмах данных используйте /api/sys/global-search с Meilisearch — он работает через поисковые индексы.
Сортировка (sortModel)
"sortModel": [
{ "colId": "priority", "sort": "desc" },
{ "colId": "created_at", "sort": "asc" }
]- Для стандартных колонок:
ORDER BY priority DESC - Для JSON-полей:
ORDER BY data->>'priority' DESC(PostgreSQL JSON extraction)
Многоуровневая сортировка поддерживается — порядок в массиве имеет значение.
Полный пример: критические открытые заявки
{
"filterModel": {
"priority": {
"filterType": "set",
"values": ["critical", "high"]
},
"status": {
"filterType": "set",
"values": ["new", "assigned", "in_work"]
}
},
"sortModel": [
{ "colId": "created_at", "sort": "desc" }
],
"startRow": 0,
"endRow": 50
}Заявки конкретного исполнителя за период
{
"filterModel": {
"assignee": {
"filterType": "set",
"values": [5]
},
"created_at": {
"filterType": "date",
"dateFrom": "2024-02-01"
}
},
"sortModel": [{ "colId": "created_at", "sort": "desc" }],
"startRow": 0,
"endRow": 25
}Поиск по тексту с фильтром статуса
{
"filterModel": {
"status": {
"filterType": "set",
"values": ["in_work"]
}
},
"quickFilter": "VPN",
"startRow": 0,
"endRow": 20
}Ответ
{
"success": true,
"data": [
{
"id": 42,
"name": "Не работает VPN",
"status": "in_work",
"priority": "high",
"assignee": 3,
"created_at": "2024-02-10T09:00:00Z"
}
],
"meta": {
"total": 143
}
}meta.total — общее количество записей с учётом фильтров (для пагинации).
История записи
GET /api/sys/history/{table_name}/{id}
Authorization: Bearer <token>Возвращает массив изменений: кто, когда, что изменилось (пары до/после для каждого поля).
Поиск в журнале аудита
POST /api/sys/audit-logs/search
Authorization: Bearer <token>
Content-Type: application/json
{
"filterModel": {
"entity_type": { "filterType": "text", "type": "contains", "filter": "it_requests" },
"user_id": { "filterType": "set", "values": [5] }
},
"sortModel": [{ "colId": "created_at", "sort": "desc" }],
"startRow": 0,
"endRow": 50
}Глобальный поиск (Meilisearch)
GET /api/sys/global-search?q=слово
Authorization: Bearer <token>Минимум 2 символа. Ищет по всем проиндексированным сущностям через Meilisearch — значительно быстрее и умнее, чем quickFilter.