Table of Contents
مقدمه: چالش اعلان در SaaS
محصولات مدرن SaaS به اعلان های به موقع و شخصی برای تعامل با کاربران، حفظ درایو و برقراری ارتباط رویدادهای سیستم بحرانی متکی هستند. کاربران انتظار دارند که از طریق کانال های ترجیحی خود هشدار دریافت کنند - ایمیل، SMS، اعلان های فشار، پیام های درون برنامه، یا حتی وب را به خدمات شخص ثالث منتقل کنند.
Directus، یک CMS بدون منبع باز و پلت فرم backend، یک پایه انعطاف پذیر برای ساخت برنامه های SaaS فراهم می کند، مدل داده آن، موتور جریان، و قلاب های غیر قابل استخراج آن را یک محیط ایده آل برای پیاده سازی یک سیستم اطلاع رسانی قوی را با استفاده از یک الگوی طراحی کلاسیک - الگوی کارخانه - شما می توانید منطق خاص ایجاد کانال، جدا کردن کد اصلی خود را به عنوان کانال های تحویل محصول جدید اضافه کنید.
درک الگوی کارخانه
الگوی کارخانه یک الگوی طراحی آفرینش است که رابط ایجاد اشیاء را در یک طبقه فوق العاده فراهم می کند، اما اجازه می دهد زیر کلاس ها را به تغییر نوع اشیاء که ایجاد خواهد شد، تغییر دهند و به جای آن به یک اعلان فوری (FLT:0 باز / Closed اصل ::: نهادهای نرم افزار باید برای تمدید باز باشند، اما برای اصلاح بسته شده است که به جای آن، دستور کار داده می شود.
این الگو زمانی می درخشد که شما یک خانواده از اشیاء مرتبط و نوع دقیق به فوری در زمان اجرا بر اساس ورودی پویا تعیین می شود - مانند تنظیمات اطلاع رسانی کاربر یا رویداد ماشه.در یک زمینه اطلاع رسانی، هر کانال یک محصول متفاوت است، اما همه آنها یک رابط مشترک (به عنوان مثال، یک روش (FLT:2) به اشتراک می گذارند.
کانال های اعلان در یک محصول SaaS
کانال های اطلاع رسانی مشترک شامل:
- ایمیل - ایمیل های معامله و بازاریابی از طریق خدمات مانند SendGrid یا Mailgun.
- [در این باره] [[۱]]] [[۱۰]]] [۱]] [۱]] [۱]] [۱۰] [۱]] [۱]] [۱۰] [۱]] [۱۰] [۱] [۱]] [۱۰] [۱] [۱] [۱] [۱] [۱] [۱] [۱۰] [۳] [۱] [۲] [۲] [۲] [۵] [۱] [۱] [۱] [۲] [۲] [۱] [۱] [۲] [۲] [۲] [۱] [۱] [۱] [۱]] [۲] [۱] [۱] [۱] [۱] [۲] [۱] [۱] [۱] [۱] [۱] [۱] [۲] [۲] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۲] [۲] [۲] [۱] [۲] [۲] [۱] [۲] [۱] [
- (فَلَّهُمَهُمَهُمَهُمَهُمَهُمَهُمَهُمَهُمَهُوا مَنَهُمَهُمَهُمَهُوا مَهُمَهُمَهُمَهُمَهُوا مَهُمَهُمَهُمَهُمَهُوا مَهُوا مَهُوَهُوا مَهُمْهُمَهُوا مَهُمَهُمَهُمَهُمْهُمْهُوَهُوَهُوَهُوَهُمْهُوا مَهُمَهُوَهُوَهُمَهُمَهُمَهُوا مَهُوَهُمَهُوَهُوَهُمَهُوَهُوَهُوَهُوَهُوَهُوَهُوَ
- (در این باره، آیات قرآن و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و روایات و
- Webhooks - درخواست HTTP POST برای نقاط انتهایی خارجی برای ادغام.
- [در این میان] [از [بر روی] [به] [به] [به] [به] [به] [به]] [به] [مشرکان]] [به]] [به] [مشرکان]]] [به] پیام های گروهی [بر [به] [به [مشرکانت] [به] [و [به] [به [و] [به [به] [به [و] [به [و] [به [به [به] لینک های [به [به] لینک های] [و]] [به [به [و] [به [به]]]]]] [به [به [و [به [به [به [به [به [به [و]]]]]]]]]]]]]]]]]] [به [به [به [به [به [به [به [به [به [از [از [به [به [به [به [به [به [به [به [به [به [به [به]]]]]]]]] [به [به [به [به [به [به [
بدون یک الگو، کد شما ممکن است شبیه به این باشد:
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 پیاده روی می کنیم که می تواند برای یک SaaS. TypeScript مبتنی بر Directus سازگار شود، زیرا پلتفرم خود با آن ساخته شده و یک سیستم نوع غنی را فراهم می کند.
۱- رابط اعلان (Cons notification Interface) را تعریف کنید
interface Notification {
send(message: string, recipient: string): Promise<void>
}
۲- کلاس های اعلانی
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}`);
}
}
کارخانه اطلاع رسانی
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}`);
}
}
}
۴- استفاده از کارخانه در درخواست شما
async function notifyUser(event: string, userId: string, channel: ChannelType) {
const notification = NotificationFactory.createNotification(channel);
await notification.send(event, userId);
}
کد مشتری هرگز نیازی به شناخت نوع بتن ندارد، بلکه تنها به رابط بستگی دارد.این برش زدن باعث می شود تست واحد ساده انجام شود - شما می توانید بدون لمس کارخانه یا کلاس های بتنی، شیء اطلاع رسانی را به تمسخر بگیرید.
ادغام الگوی کارخانه با Directus
Directus چندین نقطه ورود برای اعلان های ماشه ای را ارائه می دهد:
- Flows - اتوماسیون بصری که می تواند عملیات سفارشی یا وب را به صدا در آورد.
- [[۱] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰]] [۱۰]] [۱۰] [۱]] [۱۰]] [۳]] [۳] [۳] [۳] [۳]] [۱۰] [۳] [۳] [۳] [۳] [۱] [۱] [۳] [۳] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳]
- نقطه انتهایی مشتری – مسیرهای اکسپرس به سرور Directus تزریق می شوند.
- [در این باره] Webhooks [FLT:] [به] [FLOW] ارسال کنندگان وب سایت (Surys)
در یک پروژه Directus، شما ممکن است کارخانه اعلان خود را به عنوان یک سرویس در داخل یک ماژول سفارشی یا یک افزونه نصب کنید، به عنوان مثال، در داخل یک Flow شما می توانید یک نقطه پایان API داخلی را که کانال صحیح را بر اساس ترجیحات ذخیره شده کاربر ارسال می کند، به طور جایگزین، شما می توانید کارخانه را در یک اعلان تلفن همراه (F:2) بسته بندی کنید.
از آنجا که کارخانه در یک مکان زندگی می کند، می توانید نقشه های خود را بدون لمس هر قلاب یا جریان به روز کنید و از آنجایی که Directus Flows می تواند داده های JSON دلخواه را منتقل کند، به راحتی می توانید کارخانه را با شناسه های کانال از پایگاه داده خود تغذیه کنید.
مزایای رویکرد الگوی کارخانه
مقیاس پذیری
اضافه کردن یک کانال جدید به معنای نوشتن یک کلاس جدید است که از آن استفاده می کند (FLT 11) و اضافه کردن یک خط به بیانیه سوئیچ کارخانه، هیچ تغییر کد مشتری لازم نیست.این به ویژه در محصولات چند دهم SaaS که در آن مستاجران مختلف ممکن است مجموعه های مختلف کانال ها را فعال کنند، ارزشمند است.
قابلیت حفظ
منطق تحویل اعلان از منطق کسب و کار جدا شده است، هر کلاس بتنی می تواند به طور مستقل حفظ شود، اگر ارائه دهنده SMS API خود را تغییر دهد، شما فقط تغییر می دهید (FLT:12) کارخانه و تمام مصرف کنندگان بدون تغییر باقی می مانند.
آزمون پذیری
شما می توانید هر کلاس اعلان را به صورت جداگانه تست کنید و می توانید رابط [FLT13] را هنگام تست عملکرد سطح بالاتر، به صورت جداگانه استخراج کنید.کارخانه خود را می توان با یک آزمایش ساده تأیید کرد که بررسی می کند که نمونه های صحیح برای هر کانال را باز می گرداند.
انعطاف پذیری
برای مثال، کارخانه می تواند برای ساخت اشیاء پیچیده گسترش یابد، ممکن است بخواهید پیکربندی (API کلیدی، سیاست های تجدید نظر) را در زمان ایجاد انتقال دهید.شما می توانید روش کارخانه را اضافه کنید یا از یک (FLT:0:Builder الگوی داخل کارخانه برای جمع آوری کامل اشیاء اطلاع رسانی پیکربندی شده است.
پتانسیل های بالقوه جذب و ملاحظات
در حالی که الگوی کارخانه یک ابزار قدرتمند است، گلوله نقره ای نیست:
- مهندسی: اگر شما فقط دو کانال دارید و هیچ برنامه ای برای اضافه کردن بیشتر، یک شرطی ساده ممکن است خوب باشد.
- منطق تصمیم هنوز وجود دارد؛ کارخانه خود را از یک بیانیه سوئیچ استفاده می کند، اگر شما ده ها کانال دارید، الگوی انضباطی را در نظر بگیرید که در آن کانال های خود را به عنوان خود را تکمیل می کنند، یا از یک الگوی [F:4strategy] [F5:5 که الگوریتم های کارخانه را به جای هر دو می توانند تکمیل کنند.
- [FLT: 1] اگر کلاس های اطلاع رسانی شما به خدمات خارجی (به عنوان مثال، یک مشتری HTTP یا یک لاگر) بستگی دارد، شما باید این وابستگی ها را تزریق کنید.کارخانه باید یا یک ظرف DI را بپذیرد یا وابستگی ها را به عنوان پارامترهای دریافت کند - چیزی که برای برنامه ریزی اولیه برنامه ریزی می کند.
در یک پسوند Directus، می توانید از تزریق وابستگی داخلی پلتفرم (FLT:15 تابع و خدمات) برای عبور موارد مشترک مانند ورود به کارخانه یا دسترسی پایگاه داده به کارخانه استفاده کنید.
مثال واقعی جهانی: اعلان های چند منظوره در B2B SaaS
یک ابزار مدیریت پروژه را در Directus در نظر بگیرید، زمانی که یک کار اختصاص داده می شود، سیستم باید اطلاع دهد:
- • درخواست از طریق ایمیل (اگر آنها آن را ترجیح می دهند)
- از طریق In-app
- کانال پروژه در Slack
استفاده از کارخانه، کد زیر یک Directus (FLT:16 قلاب تبدیل می شود:
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);
}
}
هر کلاس اعلانی تحویل اصطلاحی خود را اداره می کند.کارخانه همچنان منبع واحدی از حقیقت برای نقشه برداری کانال است.
برای مشاهده یک اجرای کامل از چنین سیستمی، به اسناد رسمیDirectus در ایجاد قلاب ها و خدمات سفارشی اشاره کنید، برای درک عمیق تر از خود الگوی کارخانه، refactoring Guru page در روش کارخانه [FLT3] یک منبع عالی است.
نتیجه گیری
الگوی کارخانه یک راه تمیز و قابل نگهداری برای مدیریت کانال های اطلاع رسانی چندگانه در یک محصول SaaS فراهم می کند. با ایجاد شیء یکپارچه، منطق برنامه اصلی خود را از تحویل خاص جدا می کنید، و آن را آسان برای اضافه کردن، حذف یا اصلاح کانال بدون اثرات در سراسر کد پایه، هنگامی که با قلاب های انعطاف پذیر Directus ترکیب شده و جریان، شما یک اطلاع رسانی که مقیاس های رشد محصول خود را به دست می آورید.
این که آیا شما یک ابزار ایمیل ساده یا یک موتور پیچیده چند کاناله ایجاد می کنید، با الگوی کارخانه شروع به کار کنید، زیرا ویژگی شما گسترش می یابد.سرمایه گذاری در مقدار کمی از انتزاع امروز، روزهای بازسازی فردا را صرفه جویی می کند.