GraphQL API
Elido надає кінцеву точку GraphQL разом із REST API. Кожне поле GraphQL реалізовано як тонкий прошарок до тих самих кінцевих точок api-core, які використовує REST, тому все, що ви можете робити через GraphQL, ви також можете робити через REST - обирайте те, що краще підходить для вашого інтерфейсу.
Кінцева точка - POST /graphql, розміщена на сервісі graphql-gateway. Автентифікація ідентична REST: надішліть свій API-токен або OAuth2 токен доступу в заголовку Authorization: Bearer <token>.
Це базовий випуск. Підписки (кліки в реальному часі), збережені запити, федерація та кешування відповідей є в планах розвитку - дивіться ADR-0031 для повного списку відкладених завдань.
Коли використовувати GraphQL замість REST
- Використовуйте GraphQL, коли екрану потрібно 4+ ресурси, об’єднані разом (робоча область + посилання + останні кліки + топ-N) - об’єднайте декілька запитів в один, сформований під потреби екрана.
- Використовуйте GraphQL для мобільних екранів, де обсяг даних та кількість запитів мають значення у нестабільних мережах.
- Використовуйте REST + SDK для всього іншого. Вебхуки, масове завантаження даних, вивантаження файлів та інструменти адміністрування орієнтовані на REST і залишаться такими.
Автентифікація
curl -X POST https://api.elido.app/graphql \
-H "Authorization: Bearer $ELIDO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query": "{ me { id email } }"}'API-токени ek_… (особисті токени доступу, токени робочих областей) та OAuth2 токени доступу працюють однаково. Публічні запити інтроспекції, як-от { __schema { types { name } } }, працюють без токена під час розробки; у продакшн-середовищах інтроспекція обмежена параметром GRAPHQL_INTROSPECTION=true.
Приклади
1. Головна панель керування - поточний користувач + список робочих областей
query DashboardLanding {
me {
id
email
fullName
timezone
}
workspaces {
id
name
role
planTier
}
}Один запит, дві кінцеві точки REST, об’єднані в одну відповідь. Мобільний додаток використовує це як перший автентифікований запит після входу.
2. Посилання робочої області - пагінація у стилі Relay
query WorkspaceLinks($workspaceId: ID!, $after: String) {
links(workspaceId: $workspaceId, first: 50, after: $after) {
edges {
node {
id
slug
destinationUrl
title
status
tags
createdAt
}
}
pageInfo {
endCursor
hasNextPage
}
}
}Передайте pageInfo.endCursor з попередньої відповіді як наступний параметр after, щоб отримати наступну сторінку. hasNextPage має значення false, коли ви досягли кінця. Курсори є непрозорими - не декодуйте їх.
3. Огляд аналітики - часові ряди + топові посилання одним запитом
query Overview(
$workspaceId: ID!
$from: DateTime!
$to: DateTime!
) {
timeseries(
workspaceId: $workspaceId
from: $from
to: $to
interval: "day"
) {
ts
count
}
topLinks(
workspaceId: $workspaceId
from: $from
to: $to
limit: 10
) {
slug
clicks
}
}from/to - це мітки часу ISO-8601. interval приймає значення "hour" або "day"; api-core перевіряє їх і повертає помилку для будь-яких інших значень. Екран огляду на панелі керування виконує саме цей запит - GraphQL об’єднує те, що раніше було двома викликами REST, в один.
4. Мутації - створення короткого посилання
mutation CreateLink($input: CreateLinkInput!) {
createLink(input: $input) {
id
slug
destinationUrl
createdAt
}
}Змінні:
{
"input": {
"workspaceId": "1",
"destinationUrl": "https://example.com/launch",
"tags": ["marketing", "q4"]
}
}Мутації посилань доповнюють updateLink(workspaceId, linkId, input) та deleteLink(workspaceId, linkId). Як і в REST, мутації є ідемпотентними на стороні сервера - шлюз пересилає заголовок Idempotency-Key, автоматично згенерований SDK.
Чого немає в цьому випуску
Це навмисні пропуски для початкової фази. Кожна функція з’явиться як окреме оновлення з приміткою щодо міграції:
- Підписки - події кліків у реальному часі. Транспорт WebSocket, мости до Redis, де analytics-api вже публікує
clicks:link:<id>. - Збережені запити - продакшн-збірки постачатимуться з маніфестом, хешованим тільки для довірених клієнтів. Наразі ad-hoc запити цілком прийнятні.
- Федерація - аналітика та білінг є хорошими кандидатами на володіння власними підграфами у майбутньому.
Ліміти та конвенції
- Такі самі ліміти запитів на токен, як і в REST (повідомляються через заголовки
X-RateLimit-*у відповіді GraphQL). - Помилки відповідають специфікації GraphQL - масив
errorsверхнього рівня; часткові дані все ще можуть бути присутніми вdata. - ID передаються як рядки (
"1", а не1), щоб підтримувати безпеку BigInt-ідентифікаторів у всій схемі.