דלג לתוכן הראשי

סקירה ארכיטקטונית

מערכת 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 טיפוסית עוברת דרך השכבות הבאות:

  1. Fastify Middleware: helmet, cors, rateLimit.
  2. Global Guards:
    • JwtAuthGuard: מאמת את ה-Bearer Token.
    • PermissionsGuard: בודק את הדקורטור @Permissions() מול תפקידי המשתמש.
    • RateLimitGuard: הגנה מוגברת.
    • AccountLockoutGuard: אבטחת התחברות.
  3. Interceptors:
    • TenantInterceptor: מגדיר את הקשר ה-ALS.
    • TransformInterceptor: עוטף את התגובה במבנה { success: true, data: ... }.
  4. Validation Pipe: ZodValidationPipe מאמת את אובייקטי המידע (DTOs).
  5. Controller: מטפל בניתוב (Route).
  6. 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).