Επισκόπηση συστήματος
Από μια ενέργεια στον browser έως την αντίστοιχη αλλαγή στη βάση δεδομένων.
Τα δύο applications
Το repository περιλαμβάνει δύο εφαρμογές με σαφές όριο μεταξύ τους:
Browser
│ React UI, TanStack Router, TanStack Query, Axios
▼
Django REST API
│ authentication, membership, capabilities, serializers, services
▼
Database and email adaptersΤο frontend δεν εισάγει κώδικα Django και το Django δεν εισάγει κώδικα frontend. Επικοινωνούν μέσω του versioned HTTP API στο /api/v1/. Έτσι, ένας μελλοντικός mobile client, CLI ή community-built UI μπορεί να χρησιμοποιήσει το ίδιο API.
Τυπικό authenticated request
Για το αίτημα GET /api/v1/organizations/<id>/companies/:
- Ο browser στέλνει το request μέσω Axios.
- Το Axios διαβάζει το τρέχον access token από το in-memory Zustand store και προσθέτει την κεφαλίδα
Authorization: Bearer <access-token>. - Το Django SimpleJWT επικυρώνει το token και ορίζει το
request.user. - Το view βρίσκει το Organization χρησιμοποιώντας το ID του URL και τον συγκεκριμένο χρήστη.
- Ο resolver ελέγχει το membership και το απαιτούμενο capability.
- Το view κάνει query μόνο για τις Companies που ανήκουν στο Organization που βρέθηκε.
- Ο serializer μετατρέπει τα models στο δημόσιο JSON schema.
- Ο browser αποθηκεύει την απάντηση στο TanStack Query, σε query key που περιλαμβάνει το Organization ID.
Αν λήξει το access token, το Axios στέλνει ένα refresh request με το refresh token, ενημερώνει τα tokens στο Zustand και επαναλαμβάνει το αρχικό request. Αν αποτύχει το refresh, καθαρίζει το store και ο χρήστης πρέπει να συνδεθεί ξανά.
Ιδιοκτησία και απομόνωση δεδομένων
Το Organization ορίζει το όριο του tenant. Σε αυτό ανήκουν ή περιορίζονται τα εξής δεδομένα:
Organization
├── OrganizationMembership → User + role
├── Company
│ └── Contact
├── Automation
│ └── AutomationRun
├── OrganizationSettings
└── EmailAccountΤο Organization ID στο URL είναι στοιχείο αναζήτησης, όχι απόδειξη ότι ο χρήστης έχει πρόσβαση στον συγκεκριμένο tenant. Κάθε ανάγνωση ή αλλαγή δεδομένων που ανήκουν σε Organization περνά από ελέγχους membership και capability.
Επίπεδα του backend
Το backend ακολουθεί λίγα, σαφή επίπεδα:
- Model: πεδία που αποθηκεύονται, σχέσεις, περιορισμοί και invariants.
- Serializer: δημόσιο JSON contract και validation του request.
- View: HTTP method, συντονισμός request/response και status codes.
- Permission/resolver: έλεγχοι membership και capabilities.
- Service: επαναχρησιμοποιήσιμη επιχειρησιακή λογική, ανεξάρτητη από συγκεκριμένο HTTP request.
- Signal/event hook: χρησιμοποιείται μόνο όταν ένα πραγματικό domain event πρέπει να ενημερώσει άλλο subsystem. Η δουλειά του signal παραμένει μικρή και σαφής.
Για παράδειγμα, η δημιουργία μιας Company περνά από view και serializer. Έπειτα, το company-created signal στέλνει το event στο automation service. Το service επιλέγει τους ενεργούς κανόνες του ίδιου Organization, εκτελεί την ενέργεια και αποθηκεύει ένα AutomationRun.
Τι υποστηρίζουν σήμερα τα automations
Η υλοποίηση είναι σκόπιμα μικρότερη από τον μελλοντικό visual builder:
- trigger:
company.created - action:
send_email - εκτέλεση: σύγχρονα, μέσα στο request του Django
- ιστορικό: αποθηκεύεται σε
AutomationRun - queue: δεν υπάρχει
- retries: δεν υπάρχουν
- branching και loops: δεν υπάρχουν
- αυθαίρετο multi-step workflow: δεν έχει υλοποιηθεί
Το UI και η τεκμηρίωση δεν πρέπει να παρουσιάζουν το μελλοντικό workflow graph σαν διαθέσιμη λειτουργία. Δείτε τα Automations και το Automation Roadmap.
Database και email
Για τοπική εκκίνηση χωρίς πρόσθετη ρύθμιση χρησιμοποιείται SQLite. Υποστηρίζεται επίσης PostgreSQL μέσω του DATABASE_URL στο Django. Ο κώδικας της εφαρμογής πρέπει να χρησιμοποιεί το Django ORM, ώστε να παραμένει συμβατός και με τις δύο βάσεις.
Τα automations στέλνουν email μέσω του email backend που έχει ρυθμιστεί στο Django· τοπικά χρησιμοποιείται το console backend. Τα SMTP accounts του Organization έχουν ξεχωριστή, κρυπτογραφημένη ροή credentials και δοκιμαστικής αποστολής. Η δημιουργία SMTP account δεν αλλάζει προς το παρόν τον τρόπο αποστολής email των automations.
Από πού να ξεκινήσετε για ένα bug
| Σύμπτωμα | Ελέγξτε πρώτα |
|---|---|
| 401 κατά το login ή σε API request | settings.py, urls.py, accounts/auth_views.py, frontend/src/services/api.ts |
| 403/404 σε tenant-scoped route | access/permissions.py, Organization resolver, view queryset |
| Λάθος JSON schema ή validation | serializers.py της αντίστοιχης εφαρμογής |
| Λείπουν δεδομένα από λίστα | view queryset, tenant filter, TanStack Query key |
| Δεν εκτελείται automation | companies/signals.py, automations/apps.py, automations/services.py |
| Δεν εμφανίζεται email | Django email backend και output του runserver |
| Το frontend εμφανίζει παλιά δεδομένα | query key στο api.ts του feature και invalidation μετά το mutation |
