סקירה ארכיטקטונית
מערכת BT Management היא אפליקציית SaaS מרובת דיירים (Multi-Tenant) שתוכננה לשרת מספר בתי כנסת מתוך התקנה אחת. הארכיטקטורה מבודדת בקפדנות את הנתונים לכל דייר (Tenant) תוך אפשור שימוש בתשתיות משותפות.
מימוש Multi-Tenancy
1. AsyncLocalStorage (ALS)
אנו משתמשים ב-AsyncLocalStorage של Node.js באמצעות AlsService (src/common/als/) לשמירת ההקשר של הבקשה (מזהה משתמש, תפקיד) באופן גלובלי למשך מחזור חיי הבקשה. זה מונע את הצורך ב-"Prop Drilling" של הקשר המשתמש דרך כל מתודה בשירותים.
2. TenantInterceptor
ה-TenantInterceptor הוא שומר הסף לאכלוס ההקשר.
- הוא מחלץ את מזהה המשתמש מתוך ה-JWT Token (דרך
request.user). - עבור מנהלי מערכת (Admins), הוא בודק את הכותרת
x-customer-context. אם היא קיימת, הוא מגדיר את ההקשר למשתמש אליו מתחזים. - הוא מאתחל את ה-Store של
AlsServiceעם{ userId, isAdmin }.
3. Prisma Middleware (בידוד נתונים)
זוהי שכבת האבטחה הקריטית. אנו מחברים Middleware לשירות ה-Prisma שמיירט את כל שאילתות המסד.
- לפני כל שאילתה (
findMany,countוכו'), הוא בודק אם המודל נמצא ברשימתtenantModels. - אם זהו מודל תלוי-דייר, הוא מזריק אוטומטית את הסינון
where: { userId: currentUserId }. - עקיפת מנהל: אם
AlsServiceמציין שזהו מנהל (ושאינו במצב התחזות), הסינון הזה מדולג.
כלל קריטי
לעולם אין לסנן ידנית לפי userId ב-Controllers או Services עבור מודלים תלויי-דייר. סמוך על ה-Middleware למניעת זליגת מידע.
זרימת בקשה (Request Pipeline)
בקשת HTTP טיפוסית עוברת דרך השכבות הבאות:
- Fastify Middleware:
helmet,cors,rateLimit. - Global Guards:
JwtAuthGuard: מאמת את ה-Bearer Token.PermissionsGuard: בודק את הדקורטור@Permissions()מול תפקידי המשתמש.RateLimitGuard: הגנה מוגברת.AccountLockoutGuard: אבטחת התחברות.
- Interceptors:
TenantInterceptor: מגדיר את הקשר ה-ALS.TransformInterceptor: עוטף את התגובה במבנה{ success: true, data: ... }.
- Validation Pipe:
ZodValidationPipeמאמת את אובייקטי המידע (DTOs). - Controller: מטפל בניתוב (Route).
- Service: מבצע את הלוגיקה העסקית (שאילתות Prisma מסוננות אוטומטית).
סטאק טכנולוגי
- Backend: NestJS (עם מתאם Fastify).
- Database: MongoDB (דרך Prisma ORM).
- Caching: Redis.
- Real-time: MQTT (Mosquitto) למכשירים, Socket.IO ללקוחות.
- Frontend: React (Vite) + Material UI.
- Mobile: React Native (Android TV).