Розробка кастомних розширень Directus під ключ
При впровадженні Directus в корпоративну інфраструктуру часто виникає необхідність інтеграції з обліковими системами: 1С, CRM, складськими базами. Стандартні REST та GraphQL API не завжди покривають специфіку бізнес-логіки — потрібні нестандартні обробники подій, кастомні ендпоінти або складна валідація. Саме тут допомагають кастомні розширення Directus: вони дозволяють розширити функціонал без модифікації ядра. Типовий приклад: при створенні замовлення потрібно відправити дані в CRM, згенерувати PDF-рахунок і внести запис у лог. Hook-розширення впорається з цим за кілька рядків TypeScript, а Operation в Flows запустить ланцюжок дій.
Ми розробляємо кастомні розширення Directus вже багато років і реалізували понад 30 рішень для синхронізації з 1С, генерації PDF-звітів, інтеграції з Telegram-ботами. Всі розширення пишуться на TypeScript з використанням офіційного SDK.
Кастомні розширення Directus: типи та приклади коду
Типи розширень
| Тип розширення | Призначення | Приклад використання |
|---|---|---|
| Hook | Реагує на події (створення, оновлення) | Синхронізація замовлень з CRM |
| Endpoint | Додає кастомні API-маршрути | Генерація звітів у CSV |
| Operation | Крок для Flows (автоматизація) | Відправка SMS через провайдера |
| Interface | Кастомне поле в адмінці | Color picker |
| Display | Відображення даних у списку | Картка з прев'ю |
Порівняння кастомних розширень і готових плагінів
| Параметр | Кастомне розширення | Готовий плагін |
|---|---|---|
| Адаптація | Під будь-яку бізнес-логіку | Обмежений налаштуваннями |
| Швидкість розробки | 2–5 днів | Миттєво |
| Сумісність з оновленнями | Повна (через SDK) | Залежить від автора |
| Надлишковість | Зайвого коду немає | Часто надлишковий |
Як Hook-розширення синхронізують дані в реальному часі?
Hook-розширення підписуються на події action (після зміни) або filter (до збереження). У типовому кейсі — при створенні замовлення відправляємо дані в CRM. Код обробника виглядає так:
// extensions/hooks/lifecycle-events/index.ts import type { HookExtensionContext } from '@directus/types' export default ({ action, filter, schedule, init }: HookExtensionContext) => { action('items.create', async ({ collection, item, accountability }) => { if (collection === 'orders') { await fetch(process.env.CRM_WEBHOOK!, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ event: 'order_created', orderId: item.id, total: item.total }) }) } }) } Цей код можна доповнити обробкою помилок та повторною відправкою при збоях — ми включаємо такі сценарії в розробку.
Що таке Endpoint-розширення та як його створити?
Endpoint-розширення дозволяють додати свої маршрути Express. Наприклад, для побудови звіту по продажах з фільтрацією за датами:
// extensions/endpoints/reports/index.ts import type { EndpointExtensionContext } from '@directus/types' import { Router } from 'express' export default (router: Router, { services, getSchema }: EndpointExtensionContext) => { router.get('/sales', async (req, res) => { const schema = await getSchema() const { ItemsService } = services const ordersService = new ItemsService('orders', { schema, accountability: req.accountability }) const orders = await ordersService.readByQuery({ filter: { status: { _eq: 'completed' } }, fields: ['id', 'total', 'date_created'] }) const totalRevenue = orders.reduce((sum, o) => sum + (o.total || 0), 0) res.json({ totalOrders: orders.length, totalRevenue }) }) } Ми часто додаємо пагінацію, сортування та кешування. Наші ендпоінти проходять навантажувальне тестування.
Як Operation-розширення автоматизують бізнес-процеси?
Operation-розширення використовуються в Flows. Вони складаються з двох файлів: серверна логіка та UI для побудовника Flows.
// extensions/operations/send-sms/index.ts (сервер) export default { id: 'send-sms', handler: async ({ phone, message }, context) => { const response = await fetch('https://api.sms-provider.com/send', { method: 'POST', headers: { Authorization: `Bearer ${process.env.SMS_API_KEY}` }, body: JSON.stringify({ to: phone, text: message }) }) if (!response.ok) throw new Error('SMS failed') return { sent: true } } } // extensions/operations/send-sms/app.ts (UI) export default { id: 'send-sms', name: 'Send SMS', icon: 'sms', description: 'Відправити SMS через провайдера', options: [ { field: 'phone', type: 'string', meta: { interface: 'input', required: true } }, { field: 'message', type: 'text', meta: { interface: 'input-multiline', required: true } } ] } Чому кастомні розширення кращі за готові плагіни?
Готові плагіни часто не відповідають специфіці бізнесу: вони або надлишкові, або не вистачає функції. Кастомне розширення пишеться точно під задачу. Наприклад, Hook може не тільки відправити дані в CRM, але й перевірити дублікати, а Endpoint — згенерувати складний звіт з фільтрацією. Ви отримуєте саме те, що потрібно, без зайвого коду.
Наші проекти показують, що кастомне рішення скорочує час на інтеграцію в середньому на 40% порівняно з доопрацюванням готових плагінів. При цьому ймовірність збоїв при оновленні знижується на 60%. Для типових сценаріїв у нас є готові шаблони — зв'яжіться з нами, щоб отримати їх.
Етапи розробки розширення під ключ
- Аналіз вимог (1 день) — інтерв'ю з замовником, виявлення точок інтеграції та форматів даних.
- Прототип (1 день) — створення заготовки Hook та тестового ендпоінту, узгодження API.
- Розробка (1–3 дні) — написання коду, модульні тести, інтеграція із зовнішніми сервісами.
- Staging (1 день) — розгортання в тестовому середовищі, перевірка з реальними даними.
- Документація (0.5 дня) — детальний README, інструкція з встановлення та конфігурації.
Приклад структури директорій
extensions/ ├── hooks/sync-to-crm/ │ ├── index.ts │ └── package.json ├── endpoints/reports/ │ ├── index.ts │ └── package.json Що входить до розробки кастомних розширень
- Вихідний код у вашому репозиторії (TypeScript, з коментарями).
- Документація з встановлення, налаштування та використання.
- Тестування в staging-середовищі.
- Гарантія виправлення помилок протягом місяця.
- Консультації з інтеграції та подальшої підтримки.
Терміни та орієнтовна вартість
Розробка одного розширення (Hook або Endpoint) займає від 2 до 4 днів. Комплексний набір із трьох розширень (Hook + Endpoint + Operation) — 3–5 днів. Вартість розраховується індивідуально залежно від складності. Зв'яжіться з нами для точної оцінки.
Замовте розробку кастомного розширення — отримайте готове рішення з документацією та гарантією.







