Вступ: Виклик повідомлень у СааС

Сучасні продукти SaaS швидко реагують на своєчасному, персоналізованих повідомлень, щоб залучити користувачів, зберігання диска та спілкуватися критичні події системи. Користувачі очікують отримувати сповіщення через свої кращі канали—email, SMS, push повідомлень, в додатку повідомлення або навіть вебхоки на сторонні послуги. Як продукт розвивається, кількість каналів зростає, а управління ними через розсіяну умовну логіку стає обов'язковою. Чистий, масштабований архітектури необхідний.

Прямий, відкритий вихідний CMS і платформи Backend, забезпечує гнучкий фундамент для побудови додатків SaaS. Його модель даних, двигуни Flows і посилені гачки роблять його ідеальним середовищем для реалізації надійної системи сповіщення. Використовуючи класичний дизайн шаблону - завод Pattern - ви можете capsulate канал-специфічний творіння логіку, декупувати ваш основний бізнес-код від деталей доставки, і легко додати нові канали, як ваш продукт зрілий.

Розуміння шаблону заводу

Патерн Фабричний шаблон є створенням шаблону дизайну, який надає інтерфейс для створення об'єктів в супер-класі, але дозволяє підкласи змінювати тип об'єктів, які будуть створені. Він сприяє розпушуванню та дотримується Відкрити/Розкритий Принцип]: суб-єкти програмного забезпечення повинні бути відкриті для розширення, але закриті для модифікації. Замість загартування вашої програми з або заяви, які оповідають об'єкт, щоб миттєво, ви делегуєте, що відповідальність перед заводом.

Цей шаблон сяє коли у вас є сім'я суміжних об'єктів і точний тип для миттєвого використання визначається в режимі пуску на основі динамічного введення - наприклад, уподобання повідомлення користувача або події, що тривають. У контексті повідомлення кожен канал є різним "продуктом", але всі вони діляться загальним інтерфейсом (наприклад, ]]).

Канали сповіщення в продукті SaaS

До каналів повідомлення відносяться:

  • Email] – транзакційні та маркетингові електронні листи через послуги, такі як SendGrid або Mailgun.
  • SMS] – короткі повідомлення через Twilio або Vonage.
  • Push Notifications – веб-шрифт, мобільний поштовх по Firebase Cloud Messaging або OneSignal.
  • In‐App Notifications – UI toasts або dashboard оповіщення.
  • Webhooks] – HTTP-запити на зовнішні точки для інтеграції.
  • Slack / Discord – команда-орієнтована месенджеризація.

Якщо ви хочете, щоб зробити це, ви можете переглянути цей код:

function sendNotification(channel, message, recipient) {
 if (channel === 'email') {
 // Email logic here
 } else if (channel === 'sms') {
 // SMS logic here
 } else if (channel === 'push') {
 // Push logic here
 } else {
 throw new Error('Unknown channel');
 }
}

Цей підхід працює для декількох каналів, але кожен новий канал змушує вас змінити свою функцію відправки і перепротестувати всі існуючі логіки. Заводський візерунок виключає цю крихкість.

Реалізація заводу шаблону для повідомлень

Нижче ми проходимо через впровадження TypeScript, який може бути адаптований для Directus‐на основі SaaS. TypeScript є природним для Directus, оскільки платформа, яка побудована з нею, і забезпечує багату систему типу.

1. Визначення інтерфейсу сповіщення

interface Notification {
 send(message: string, recipient: string): Promise<void>
}

2. Бетонні класифікації

class EmailNotification implements Notification {
 async send(message: string, recipient: string): Promise<void> {
 // Use Directus’s internal mailer or an external SDK
 console.log(`Sending email to ${recipient}: ${message}`);
 }
}

class SMSNotification implements Notification {
 async send(message: string, recipient: string): Promise<void> {
 // Call Twilio API
 console.log(`Sending SMS to ${recipient}: ${message}`);
 }
}

class PushNotification implements Notification {
 async send(message: string, recipient: string): Promise<void> {
 // Use Firebase or OneSignal SDK
 console.log(`Sending push to ${recipient}: ${message}`);
 }
}

3. Завод Notification

type ChannelType = 'email' | 'sms' | 'push';

class NotificationFactory {
 static createNotification(channel: ChannelType): Notification {
 switch (channel) {
 case 'email':
 return new EmailNotification();
 case 'sms':
 return new SMSNotification();
 case 'push':
 return new PushNotification();
 default:
 throw new Error(`Unknown notification channel: ${channel}`);
 }
 }
}

4. Використання заводу у вашому додатку

async function notifyUser(event: string, userId: string, channel: ChannelType) {
 const notification = NotificationFactory.createNotification(channel);
 await notification.send(event, userId);
}

Код клієнта ніколи не повинен знати конкретний тип. Він залежить від інтерфейсу. Цей декоулінг робить блок тестування прямопередбачуваних, ви можете змусити об'єкт повідомлення без дотику заводу або бетонних класів.

Інтеграція шаблону заводу з напрямком

Directus пропонує декілька точок входу для викликів:

  • ] – Автоматизація, яка може викликати користувацькі операції або вебоки.
  • Hooks] – або гачки, які запускаються на події CRUD.
  • Custom Endpoints – Експрес маршрути, введені в сервер Directus.
  • Webhooks] – Виїзні вебок-відправники.

У проекті Directus ви можете встановити свій завод повідомлень як послугу всередині користувацького модуля або розширення. Наприклад, всередині ви можете викликати внутрішню API кінцеву точку, яка миттєво відмовляється від правильного каналу на основі збережених уподобань користувача. Крім того, ви можете обгорнути завод в hook], який вогонь після нового входу користувача і надішлемо вітання електронної пошти, підтвердження SMS і поштове повідомлення до мобільного додатку.

Оскільки завод живе в одному місці, ви можете оновити свої картографічні карти без дотику кожного гака або потоку. І оскільки Directus Flows може пройти довільні дані JSON, ви можете легко годувати завод з ідентифікаторами каналів з бази даних.

Переваги заводу шаблонного підходу

Можливість

Додавання нового каналу означає написання нового класу, який реалізує і додавання однієї лінії до звіту про перемикання заводу. Не потрібні зміни коду клієнта. Це особливо цінний в багатосторонньому продукті SaaS, де різні штани можуть дозволити різні комплекти каналів.

Гарантійність

Логіка доставки повідомлень ізольована від логіки бізнесу. Кожен конкретний клас може підтримуватися самостійно. Якщо провайдер SMS змінює API, ви змінили лише . Завод і всі споживачі залишаються незмінними.

Тестування

Ви можете встановити тест кожного класу сповіщення ізоляцією, і ви можете відмітити інтерфейс при тестуванні більших функцій рівня. Сам завод може бути перевірений простим тестом, який перевіряє, що він повертає екземпляри правильного типу для кожного каналу.

Гнучкість

Завод може бути розширений для побудови складних об'єктів. Наприклад, ви можете знадобитися перенести конфігурацію ( ключі, політики трейдингу) в час створення. Ви можете перевантажити заводський метод або використовувати Будильник] в заводі, щоб зібрати повністю налаштовані об'єкти повідомлень. Звичайні зміни середовища або налаштування бази даних (наприклад, таблицю ) є ідеальними джерелами для такої конфігурації.

Потенційні недоліки та роздуми

Під час фабричної візерунка є потужним інструментом, він не є срібною кулею:

  • Over‐engineering: Якщо у вас є тільки два канали і не планує додати більше, простий умовний може бути тонким. Патерн вводить додаткові файли і анотації.
  • Децизійна логіка все ще існує: Завод використовує протоколи вимикача. Якщо у вас є десятки каналів, розгляньте реєстр шаблон]], де канали саморегістр, або скористайтеся стратегічний візерунок, що застібає алгоритми, а не об'єкти. Обидва можуть доповнювати завод.
  • Вприскування подвійних даних: Якщо ваші класи сповіщення залежать від зовнішніх послуг (наприклад, HTTP-клієнт або logger), вам потрібно вводити ці залежності. Завод повинен приймати або приймати контейнери DI або отримати залежності, як параметри, які починають планувати.

У продовження Директиви можна ввімкнути вбудовану залежність платформи (] функції та послуги) для проходження спільних екземплярів, таких як logger або доступ до бази даних до заводу.

Приклад реального світу: багатомовні сповіщення в B2B SaaS

Розглянемо інструмент управління проектом, побудований на Директиві. При призначенні завдання система повинна повідомити:

  • Відправлення через електронну пошту (якщо вони віддають перевагу)
  • Гарантований за допомогою аутсорса
  • канал проекту на Slack

Використання заводу, код під прямим приводом гачок стає:

import { NotificationFactory } from './services/NotificationFactory';

async function onTaskCreate(payload, { accountability }) {
 const { assigneeId } = payload;
 const userPreferences = await getUserNotificationPreferences(assigneeId);
 for (const channel of userPreferences.channels) {
 const notifier = NotificationFactory.createNotification(channel);
 await notifier.send(`You have a new task!`, assigneeId);
 }
}

Кожен клас повідомлень ручить власну ідіоматичну доставку. Завод залишається єдиним джерелом правди на картографування каналів.

Щоб побачити повну реалізацію такої системи, див. Офіційна документація «Прямокут» ] на створення користувальницьких гачків та послуг. Для більш глибокого розуміння самої фабрики, Рефакторинг сторінки Гуру на заводському методі] є відмінним ресурсом. Ви також можете зацікавити, як інші платформи ручать симфонію.Twilioify]]], наведено аналогічну концепцію на рівні інфраструктури.

Висновок

Патерн заводу забезпечує чистий, безпечний спосіб управління декількома каналами повідомлення в продукті SaaS. За допомогою створення об'єктів, ви декупуєте логіку основного додатка з специфікацій доставки, що дозволяє легко додати, видаляти або змінювати канали без використання ripple через бази коду. При поєднанні з гнучкими гаками і люками Directus ви отримуєте архітектуру повідомлень, яка масштабує з зростанням вашого продукту.

Якщо ви будуєте простий електронний вивід або комплексний багатоканальний двигун, починаючи з заводу, шаблон рано окупається як ваш набір функцій розширюється. Інвестиції в невелику кількість абстрагації сьогодні економить дні рефакторингу завтра.