Налаштування REST API / GraphQL API Directus
Directus автоматично генерує повний REST API та GraphQL для всіх колекцій. REST за замовчуванням, GraphQL включається в налаштуваннях. Обидва використовують одну систему контролю доступу.
REST API
Базові операції:
# Список
GET /items/articles?fields=id,title,slug&filter[status][_eq]=published&sort=-date_published&limit=10
# Один елемент
GET /items/articles/42?fields=*,author.*,category.*
# Створити
POST /items/articles
Authorization: Bearer <token>
{ "title": "New Article", "status": "draft" }
# Оновити
PATCH /items/articles/42
{ "status": "published" }
# Видалити
DELETE /items/articles/42
Фільтри:
# Оператори: _eq, _neq, _lt, _lte, _gt, _gte, _in, _nin, _null, _nnull, _contains, _icontains, _starts_with, _ends_with
# Числовий діапазон
GET /items/products?filter[price][_gte]=100&filter[price][_lte]=500
# OR умова
GET /items/articles?filter[_or][0][title][_icontains]=react&filter[_or][1][content][_icontains]=react
# Пов'язані колекції
GET /items/articles?filter[category][slug][_eq]=tech
# Декілька значень
GET /items/orders?filter[status][_in]=paid,shipped
Populate (deep):
# Усі поля першого рівня
GET /items/articles?fields=*
# Конкретні поля зв'язків
GET /items/articles?fields=id,title,author.name,author.email,category.name,thumbnail.id,thumbnail.filename_disk
# Вкладені зв'язки
GET /items/articles?fields=id,title,comments.id,comments.text,comments.user.name
# Deep populate
GET /items/articles/1?deep[comments][_sort]=-date_created&deep[comments][_limit]=5
Агрегація:
# Підрахунок, сума, середнє
GET /items/orders?aggregate[count]=*&aggregate[sum]=total&aggregate[avg]=total&filter[status][_eq]=paid
# Групування
GET /items/orders?groupBy[]=status&aggregate[count]=*
Системні колекції
# Користувачі
GET /users?fields=id,first_name,last_name,email,role.name
# Файли/медіа
GET /files?fields=id,filename_disk,width,height,filesize
# Активність
GET /activity?filter[collection][_eq]=articles&sort=-timestamp&limit=20
GraphQL
# Включити в .env
GRAPHQL_SDLFILE=/tmp/graphql-schema.graphql
GraphQL доступен за адресою /graphql:
query GetArticles($locale: String, $limit: Int) {
articles(
filter: { status: { _eq: "published" } }
sort: ["-date_published"]
limit: $limit
) {
id
title
slug
excerpt
date_published
thumbnail {
id
filename_disk
}
category {
name
slug
}
author {
first_name
last_name
}
}
}
query GetSingletonSettings {
settings {
site_name
site_description
logo { id filename_disk }
social_links
}
}
mutation CreateContact($data: create_contacts_input!) {
create_contacts_item(data: $data) {
id
email
message
}
}
Realtime через WebSocket
# Підключення
ws://localhost:8055/websocket
# Аутентифікація
{ "type": "auth", "access_token": "..." }
# Підписка на колекцію
{ "type": "subscribe", "collection": "articles", "uid": "sub-1", "query": { "fields": ["id", "title"] } }
# Подія зміни
{ "type": "subscription", "event": "update", "data": [{ "id": 1, "title": "Updated" }] }
Кастомний запит через SDK
import { createDirectus, rest, aggregate, readItems } from '@directus/sdk'
const client = createDirectus(DIRECTUS_URL).with(rest())
// Агрегація продажів за місяць
const salesStats = await client.request(
aggregate('orders', {
aggregate: { count: '*', sum: ['total'], avg: ['total'] },
groupBy: ['status'],
filter: { date_created: { _gte: '$NOW(-30 days)' } },
})
)
// Пошук з вагами
const results = await client.request(
readItems('articles', {
search: 'TypeScript', // fulltext search по всім строковим полям
fields: ['id', 'title', 'excerpt'],
filter: { status: { _eq: 'published' } },
limit: 10,
})
)
Rate Limiting та безпека
# Rate limiting
RATE_LIMITER_ENABLED=true
RATE_LIMITER_STORE=redis
RATE_LIMITER_POINTS=50
RATE_LIMITER_DURATION=1
# Відключити introspection GraphQL в production
GRAPHQL_INTROSPECTION=false
Графік
Налаштування GraphQL, агрегацій, Realtime підписок — 1–2 дні.







