Architecture Overview
SnackBase follows Clean Architecture principles with clear separation between business logic and infrastructure concerns.Layer Structure
Key Architectural Patterns
- Repository Pattern: 17 repositories abstract data access
- Service Layer Pattern: 17 domain services contain business logic
- Hook System: 33+ events across 8 categories for extensibility (stable API v1.0)
- Rule Engine: Custom DSL for permission expressions
- Multi-Tenancy: Row-level isolation via
account_id - JWT Authentication: Access token (1h) + refresh token (7d)
- Configuration System: Hierarchical provider configuration with encryption at rest
- Email System: Multi-provider email with template rendering
Component Statistics
- 19 API Routers: auth, oauth, saml, accounts, collections, roles, permissions, users, groups, invitations, macros, dashboard, files, audit-logs, migrations, admin, email_templates, records, health
- 17 ORM Models: Account, User, Role, Permission, Collection, Macro, Group, Invitation, RefreshToken, UsersGroups, AuditLog, Configuration, OAuthState, EmailVerification, EmailTemplate, EmailLog
- 17 Repositories matching each model
- 17 Domain Entities + 17 Domain Services
- 10 React Pages + 40+ Components
- 14 ShadCN UI Components
Technology Stack
Major Systems
1. Configuration/Provider System
The configuration system provides hierarchical provider configuration for external services (authentication, email, storage). Architecture:- System-level configs: Use account_id
00000000-0000-0000-0000-000000000000for defaults - Account-level configs: Per-account overrides that take precedence
- Encryption at rest: All sensitive values encrypted using Fernet symmetric encryption
- 5-minute TTL cache: ConfigRegistry caches resolved configurations
2. Email Verification System
Handles email address verification with secure token-based workflow. Components:EmailVerificationTokenModel- Stores SHA-256 hashed tokensEmailVerificationRepository- Database operationsEmailVerificationService- Business logic for verification workflow- Token expiration: 24 hours
- Single-use tokens (marked as used after verification)
- User registers →
send_verification_email()generates token - Token stored as SHA-256 hash
- Email sent with verification URL
- User clicks link →
verify_email()validates token - User record updated:
email_verified=True,email_verified_at=now()
3. Email Template System
Multi-language email template system with Jinja2 variable support. Components:EmailTemplateModel- ORM model with locale supportEmailTemplateRepository- Template CRUD operationsTemplateRenderer- Jinja2-based renderingEmailService- Orchestrates sending with provider selection
email_verification- Email verification emailspassword_reset- Password reset emailsinvitation- User invitation emails
- Account-level templates override system defaults
- Multi-language support via
localefield - System variables injected:
app_name,app_url,support_email - Comprehensive logging via
EmailLogModel
4. Hook System (Stable API v1.0)
33+ Hook Events across 8 Categories:
Built-in Hooks:
timestamp_hook(priority: -100) - Setscreated_at/updated_ataccount_isolation_hook(priority: -200) - Enforcesaccount_idon recordscreated_by_hook(priority: -150) - Setscreated_by/updated_byaudit_capture_hook(priority: 100) - Captures audit trails for records- SQLAlchemy Event Listeners - Systemic audit logging for models
5. Audit Logging System
GxP-compliant audit logging with blockchain-style integrity chain. Features:- Configurable: Toggle via
SNACKBASE_AUDIT_LOGGING_ENABLED(default:true) - Column-level granularity: Each row represents a single column change
- Immutable: Database triggers prevent UPDATE/DELETE operations
- Blockchain integrity:
checksumandprevious_hashchain - Electronic signature support: CFR Part 11 compliant (
es_username,es_reason,es_timestamp) - Systemic capture: SQLAlchemy event listeners automatically log all model changes
- Record capture: Hooks automatically log all dynamic collection record changes
- SQLAlchemy event listener detects model change OR hook detects record change
AuditLogServicecreates audit entries for each changed columnAuditChecksumcomputes SHA-256 hash linking to previous entry- Entries written atomically with the operation
- Database triggers enforce immutability