Skip to content

Фильтрация и пагинация

Список записей можно получить двумя способами:

  • GET /api/e/{model} — простой список с базовой пагинацией
  • POST /api/e/{model}/list-server — server-side фильтрация в формате AG Grid

GET /api/e/

bash
curl "https://app.orbita.example/api/e/it_requests?page=1&per_page=25" \
  -H "Authorization: Bearer <token>"

Параметры:

ПараметрТипОписание
pageintСтраница (по умолчанию 1)
per_pageintЗаписей на страницу

Ответ включает meta.total, meta.last_page.


POST /api/e/{model}/list-server

Server-side список в формате AG Grid Server Side Row Model.

http
POST /api/e/it_requests/list-server
Authorization: Bearer <token>
Content-Type: application/json

Структура запроса

json
{
  "filterModel": {
    "поле": { ... условие фильтра ... }
  },
  "sortModel": [
    { "colId": "created_at", "sort": "desc" }
  ],
  "quickFilter": "текст поиска",
  "startRow": 0,
  "endRow": 25
}

startRow / endRow определяют срез (0-based). startRow: 0, endRow: 25 → первые 25 записей.


Типы фильтров (filterModel)

Text — текстовые поля

json
"name": {
  "filterType": "text",
  "type": "contains",
  "filter": "VPN"
}
typeSQLПримечание
containsLIKE '%VPN%'Подстрока
equalsLIKE '%VPN%'Технически то же что contains — особенность реализации

Поведение equals

В текущей реализации оба оператора (contains и equals) генерируют LIKE '%value%'. Для точного совпадения используйте set-фильтр с одним значением.

Number — числовые поля

json
"sla_hours": {
  "filterType": "number",
  "filter": 8
}

Применяет прямое равенство: WHERE sla_hours = 8.

Date — поля дата/время

json
"created_at": {
  "filterType": "date",
  "dateFrom": "2024-02-01"
}
  • Для стандартных колонок: whereDate('created_at', '2024-02-01')
  • Для JSON-полей: LIKE '2024-02-01%' (строковое сравнение)

Только dateFrom

Поле dateTo (диапазон дат) в текущей реализации не обрабатывается. Для диапазона используйте два отдельных запроса или фильтруйте на стороне клиента.

Set — фильтр по множеству значений

json
"status": {
  "filterType": "set",
  "values": ["new", "assigned", "in_work"]
}

Генерирует WHERE status IN ('new', 'assigned', 'in_work').

Используйте для:

  • value_list — выбрать несколько значений из справочника
  • state_model — показать несколько статусов
  • user — заявки нескольких исполнителей

Быстрый текстовый поиск (quickFilter)

json
{
  "quickFilter": "принтер"
}

Ищет по id и всей колонке data (JSONB):

sql
WHERE id LIKE '%принтер%' OR data::text LIKE '%принтер%'

Быстрый поиск работает независимо от filterModel — они применяются вместе через AND.

Производительность

quickFilter делает полный поиск по JSON-блобу. На больших объёмах данных используйте /api/sys/global-search с Meilisearch — он работает через поисковые индексы.


Сортировка (sortModel)

json
"sortModel": [
  { "colId": "priority", "sort": "desc" },
  { "colId": "created_at", "sort": "asc" }
]
  • Для стандартных колонок: ORDER BY priority DESC
  • Для JSON-полей: ORDER BY data->>'priority' DESC (PostgreSQL JSON extraction)

Многоуровневая сортировка поддерживается — порядок в массиве имеет значение.


Полный пример: критические открытые заявки

json
{
  "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
}

Заявки конкретного исполнителя за период

json
{
  "filterModel": {
    "assignee": {
      "filterType": "set",
      "values": [5]
    },
    "created_at": {
      "filterType": "date",
      "dateFrom": "2024-02-01"
    }
  },
  "sortModel": [{ "colId": "created_at", "sort": "desc" }],
  "startRow": 0,
  "endRow": 25
}

Поиск по тексту с фильтром статуса

json
{
  "filterModel": {
    "status": {
      "filterType": "set",
      "values": ["in_work"]
    }
  },
  "quickFilter": "VPN",
  "startRow": 0,
  "endRow": 20
}

Ответ

json
{
  "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 — общее количество записей с учётом фильтров (для пагинации).


История записи

http
GET /api/sys/history/{table_name}/{id}
Authorization: Bearer <token>

Возвращает массив изменений: кто, когда, что изменилось (пары до/после для каждого поля).

Поиск в журнале аудита

http
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)

http
GET /api/sys/global-search?q=слово
Authorization: Bearer <token>

Минимум 2 символа. Ищет по всем проиндексированным сущностям через Meilisearch — значительно быстрее и умнее, чем quickFilter.

Документация Orbita ITSM