Εισαγωγή: Η πρόκληση γνωστοποίησης στο SaaS

Τα σύγχρονα προϊόντα SaaS βασίζονται σε έγκαιρες, εξατομικευμένες ειδοποιήσεις για να συμμετάσχουν χρήστες, να ενεργοποιήσουν τη διατήρηση κίνησης και να επικοινωνήσουν κρίσιμα γεγονότα συστήματος. Οι χρήστες αναμένουν να λάβουν ειδοποιήσεις μέσω των προτιμούμενων καναλιών τους ⁇ email, SMS, ειδοποιήσεις ώθησης, μηνύματα εν εφαρμογή, ή ακόμα και webhooks σε υπηρεσίες τρίτων. Καθώς το προϊόν εξελίσσεται, ο αριθμός των καναλιών αυξάνεται, και η διαχείριση τους μέσω διάσπαρτης λογικής υπό όρους γίνεται εφιάλτης συντήρησης.

Directus, ένα ακέφαλο CMS και πλατφόρμα υποστήριξης ανοικτού κώδικα, παρέχει ένα ευέλικτο θεμέλιο για την οικοδόμηση εφαρμογών SaaS. Το μοντέλο δεδομένων, κινητήρα ροής, και εκτεταμένα άγκιστρα καθιστούν ένα ιδανικό περιβάλλον για την εφαρμογή ενός ισχυρού συστήματος κοινοποίησης. Με την εφαρμογή ενός κλασικού μοτίβου δημιουργίας ⁇ το Factory Pattern ⁇ μπορείτε να ενσωματώσετε τη λογική δημιουργίας-ειδική κανάλι, αποσυνδέστε τον βασικό κωδικό επιχείρησής σας από λεπτομέρειες παράδοσης, και χωρίς κόπο προσθέστε νέα κανάλια καθώς το προϊόν σας ωριμάζει.

Κατανόηση του Μοτίβου Εργοστάσιου

Το Factory Pattern είναι ένα μοτίβο δημιουργίας που παρέχει μια διεπαφή για τη δημιουργία αντικειμένων σε μια σούπερ-κατηγορία, αλλά επιτρέπει σε υποκλάσεις να αλλάξει τον τύπο των αντικειμένων που θα δημιουργηθούν. Προωθεί χαλαρή σύζευξη και προσκολλάται στην [[LFT:0]]] Open/Closed Principle[[LFT:1]]: οι οντότητες λογισμικού θα πρέπει να είναι ανοικτές για επέκταση αλλά κλειστές για τροποποίηση. Αντί να απορριφθεί η εφαρμογή σας με [[LFT:0]] ή [[LFT:1]] δηλώσεις για να αποφασίσει ποιο αντικείμενο κοινοποίησης να ακαριασθεί, μεταβιβάζετε την ευθύνη αυτή σε ένα ειδικό εργοστάσιο.

Αυτό το μοτίβο λάμπει όταν έχετε μια οικογένεια των σχετικών αντικειμένων και ο ακριβής τύπος για να instantiate καθορίζεται κατά το χρόνο εκτέλεσης με βάση τη δυναμική εισαγωγή ⁇ όπως οι προτιμήσεις ειδοποίησης ενός χρήστη ή το γεγονός που ενεργοποιείται. Σε ένα πλαίσιο κοινοποίησης, κάθε κανάλι είναι ένα διαφορετικό «προϊόν», ωστόσο όλα μοιράζονται μια κοινή διεπαφή (π.χ., μια μέθοδος).

Κανάλια κοινοποίησης σε ένα προϊόν SaaS

Οι κοινοί διαύλων κοινοποίησης περιλαμβάνουν:

  • Email ⁇ μηνύματα ηλεκτρονικού ταχυδρομείου συναλλαγών και μάρκετινγκ μέσω υπηρεσιών όπως SendGrid ή Mailgun.
  • SMS ⁇ σύντομα μηνύματα μέσω του Τουίλιο ή του Φονάζ.
  • Πιέζουν ειδοποιήσεις ⁇ web push, mobile push μέσω Firebase Cloud Messaging ή OneSignal.
  • In ⁇ App Notifications ⁇ UI pasts ή indam alerts.
  • 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 που μπορεί να προσαρμοστεί για μια Directus ⁇ based 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. Το εργοστάσιο ειδοποιήσεων

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);
}

Ο κώδικας πελατών δεν χρειάζεται ποτέ να γνωρίζει τον τύπο του σκυροδέματος. Εξαρτάται μόνο από τη διασύνδεση [[LFT:8]]. Αυτή η αποσύνδεση καθιστά τη δοκιμή μονάδας απλή ⁇ μπορείτε να χλευάσετε το αντικείμενο ειδοποίησης χωρίς να αγγίξετε το εργοστάσιο ή τις κατηγορίες σκυροδέματος.

Ενσωματώνοντας το πρότυπο Εργοστάσιο με Directus

Η Directus προσφέρει πολλαπλά σημεία εισόδου για την ενεργοποίηση των κοινοποιήσεων:

  • ⁇ Οπτικός αυτοματισμός που μπορεί να αποκαλεί τις προσαρμοσμένες λειτουργίες ή webhooks.
  • Hoks ⁇ ] ή αγκίστρια που τρέχουν σε γεγονότα CRUD.
  • Τελωνεία Τελικά σημεία ⁇ Διαδρομές Express που εισπράττονται στον εξυπηρετητή Directus.
  • Webhooks ⁇ Εξερχόμενη αποστολή webhook.

Σε ένα έργο Directus, μπορείτε να εγκαταστήσετε το εργοστάσιο ειδοποιήσεων σας ως υπηρεσία μέσα σε μια προσαρμοσμένη μονάδα ή μια επέκταση. Για παράδειγμα, μέσα σε ένα Flow θα μπορούσατε να καλέσετε ένα εσωτερικό τελικό σημείο API που στιγμιαία το σωστό κανάλι με βάση τις αποθηκευμένες προτιμήσεις ενός χρήστη. Εναλλακτικά, μπορείτε να τυλίξετε το εργοστάσιο σε ένα hook που πυροβολεί μετά από μια νέα εγγραφή χρήστη ⁇ και στέλνει ένα ευπρόσδεκτο email, μια επιβεβαίωση SMS, και μια ειδοποίηση ώθησης στην εφαρμογή κινητού.

Επειδή το εργοστάσιο ζει σε ένα μόνο μέρος, μπορείτε να ενημερώσετε τις χαρτογραφήσεις του χωρίς να αγγίζετε κάθε γάντζο ή ροή. Και δεδομένου ότι Directus Flows μπορεί να περάσει αυθαίρετα στοιχεία JSON, μπορείτε εύκολα να τροφοδοτήσετε το εργοστάσιο με αναγνωριστικά καναλιών από τη βάση δεδομένων σας.

Οφέλη της προσέγγισης μοτίβο Εργοστάσιο

Αυξομειωσιμότητα

Η προσθήκη ενός νέου καναλιού σημαίνει εγγραφή μιας νέας κατηγορίας που υλοποιεί ] και προσθήκη μιας γραμμής στη δήλωση του διακόπτη του εργοστασίου. Δεν απαιτούνται αλλαγές κωδικού πελάτη. Αυτό είναι ιδιαίτερα πολύτιμο σε προϊόντα πολυτενεκέ SaaS όπου διαφορετικοί ενοικιαστές μπορούν να επιτρέψουν διαφορετικά σύνολα καναλιών.

Διατήρηση

Η λογική της παράδοσης ειδοποιήσεων είναι απομονωμένη από τη λογική των επιχειρήσεων. Κάθε συγκεκριμένη κατηγορία μπορεί να διατηρηθεί ανεξάρτητα. Αν ο πάροχος SMS αλλάξει το API του, θα τροποποιήσετε μόνο . Το εργοστάσιο και όλοι οι καταναλωτές παραμένουν αμετάβλητοι.

Δοκιμές

Μπορείτε να ελέγξετε μονάδα κάθε κλάση ειδοποίησης μεμονωμένα, και μπορείτε να χλευάσετε τη διασύνδεση [[LFT:13]] κατά τη δοκιμή των λειτουργιών υψηλότερου επιπέδου. Το ίδιο το εργοστάσιο μπορεί να επαληθευτεί με μια απλή δοκιμή που ελέγχει ότι επιστρέφει τις περιπτώσεις του σωστού τύπου για κάθε κανάλι.

Ευελιξία

Για παράδειγμα, ίσως θέλετε να περάσετε τη διαμόρφωση (API keys, retry policy) κατά τη στιγμή της δημιουργίας. Μπορείτε να υπερφορτώσετε τη μέθοδο του εργοστασίου ή να χρησιμοποιήσετε ένα ]Builder μοτίβο μέσα στο εργοστάσιο για τη συναρμολόγηση πλήρως ρυθμισμένων αντικειμένων ειδοποίησης. Οι μεταβλητές περιβάλλοντος ή οι ρυθμίσεις βάσης δεδομένων του Directus (π.χ., ένας πίνακας) είναι ιδανικές πηγές για τέτοια διαμόρφωση.

Ενδεχόμενες Αναδρομές και Προβολές

Ενώ το πρότυπο του εργοστασίου είναι ένα ισχυρό εργαλείο, δεν είναι μια ασημένια σφαίρα:

  • Υπερ-μηχανική: Αν έχετε μόνο δύο κανάλια και δεν έχετε σχέδια να προσθέσετε περισσότερα, μια απλή υπό όρους μπορεί να είναι μια χαρά. Το μοτίβο εισάγει πρόσθετα αρχεία και αφηρημένες επιλογές.
  • Η λογική της απόφασης εξακολουθεί να υπάρχει: Το ίδιο το εργοστάσιο χρησιμοποιεί μια δήλωση διακόπτη. Αν έχετε δεκάδες κανάλια, εξετάστε ένα [[LFT:2]] μοτίβο Registry[[LFT:3]] όπου τα κανάλια αυτο-εγγραφέα, ή χρησιμοποιήστε ένα [[LFT:4]] μοτίβο στρατηγικής[[LFT:5]] που ανταλλάσσει αλγορίθμους και όχι αντικείμενα. Και τα δύο μπορούν να συμπληρώσουν το εργοστάσιο.
  • Ένταση αποτελεσματικότητας: Αν οι τάξεις ειδοποίησης εξαρτώνται από εξωτερικές υπηρεσίες (π.χ., πελάτης HTTP ή καταγραφέας), πρέπει να κάνετε ένεση σε αυτές τις εξαρτήσεις. Το εργοστάσιο πρέπει είτε να δεχτεί ένα δοχείο DI είτε να λάβει τις εξαρτήσεις ως παραμέτρους ⁇ κάτι για να προγραμματίσει για νωρίς.

Σε μια επέκταση Directus, μπορείτε να αξιοποιήσετε την ενσωματωμένη-σε ένεση εξάρτησης της πλατφόρμας (η [[LFT:15]] λειτουργία και υπηρεσίες) για να περάσετε κοινές περιπτώσεις όπως ο καταγραφέας ή πρόσβαση βάσης δεδομένων στο εργοστάσιο.

Πραγματικό ⁇ Παγκόσμιο Παράδειγμα: Πολυ-Κανάλι Γνωστοποιήσεις σε ένα B2B SaaS

Εξετάστε ένα εργαλείο διαχείρισης έργου που βασίζεται στο Directus. Όταν μια εργασία έχει ανατεθεί, το σύστημα πρέπει να ειδοποιεί:

  • ο εκχωρούμενος μέσω ηλεκτρονικού ταχυδρομείου (αν το προτιμούν)
  • ο εκχωρούμενος μέσω της τοστ σε εφαρμογή
  • το κανάλι έργου στο Slack

Χρησιμοποιώντας το εργοστάσιο, ο κωδικός που χρησιμοποιείται σε ένα άγκιστρο Directus γίνεται:

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[[LFT:1]] για τη δημιουργία προσαρμοσμένων γάντζων και υπηρεσιών. Για μια βαθύτερη κατανόηση του ίδιου του προτύπου του εργοστασίου, η [[LFT:2]]Αναπαράγοντα Guru σελίδα στη μέθοδο Εργοστάσιο[[LFT:3]]] είναι μια εξαιρετική πηγή. Μπορεί επίσης να σας ενδιαφέρει ο τρόπος με τον οποίο άλλες πλατφόρμες χειρίζονται την ενορχήστρωση ειδοποιήσεων ⁇ [[[LFT:4]]Twilio Ειδοποίηση[[[LFT:5]]] δείχνει μια παρόμοια έννοια στο επίπεδο της υποδομής.

Συμπέρασμα

Το Factory Pattern παρέχει έναν καθαρό, διατηρητέο τρόπο για να διαχειριστείτε πολλαπλά κανάλια ειδοποίησης σε ένα προϊόν SaaS. Με τη δημιουργία ενσωματώνοντας αντικείμενο, αποσυνδέετε τη λογική της εφαρμογής του πυρήνα σας από τις λεπτομέρειες παράδοσης, καθιστώντας εύκολο να προσθέσετε, να αφαιρέσετε, ή να τροποποιήσετε κανάλια χωρίς κυματισμούς σε όλη τη βάση κώδικα.

Είτε κατασκευάζετε ένα απλό ειδοποιητή email ή ένα σύνθετο πολυκάναλο κινητήρα, ξεκινώντας με το πρότυπο του εργοστασίου πληρώνει νωρίς καθώς το σύνολο χαρακτηριστικών σας επεκτείνεται. Η επένδυση σε ένα μικρό ποσό αφαίρεσης σήμερα εξοικονομεί ημέρες αναπαράγοντα αύριο.