Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz Source: /opt/alga-psa on psa.joliet.tech
8.8 KiB
8.8 KiB
File Storage System Implementation
This implementation provides a robust, multi-tenant file storage system with support for multiple storage providers and strong security controls.
Core Features
Multi-tenant File Storage
- Tenant isolation through RLS policies
- Tenant-specific storage configuration
- Separate storage paths per tenant
Storage Provider Support
Community Edition:
- Base provider interface
- Extensible provider architecture
- Core file management features
Enterprise Edition:
- S3 provider implementation
- Advanced provider features
- Cloud storage integration
File Metadata Tracking
- File metadata storage
- Original filename preservation
- MIME type tracking
- File size tracking
- Upload/modification timestamps
Entity Relationship Management
- File references to business entities
- Many-to-many relationship support
- Reference tracking and cleanup
Security Features
- Tenant isolation
- MIME type validation
- File size restrictions
- Storage quota management
- Access control through user relationships
PDF Preview Caching
- Tenant-isolated preview caching
- Automatic cache expiration
- Performance metrics tracking
- Configurable cache settings
- File-based caching system
Architecture Components
Database Schema
- storage_providers: Storage provider configuration
- storage_buckets: Storage location configuration
- file_stores: File metadata storage
- file_references: Entity relationships
- provider_events: Provider operation monitoring
- document_content: Large text content storage for documents
- document_block_content: Block-based JSON content storage for documents
Content Storage
The system provides three approaches for storing document content:
-
File Storage:
- Binary files (PDFs, images, etc.)
- Managed through storage providers
- File metadata tracking
-
Text Content Storage:
- Large text content stored in document_content table
- 1-to-1 relationship with documents
- Tenant isolation through RLS
- Efficient querying and updates
- Separation from core document metadata
-
Block-Based Content Storage:
- Structured JSON content stored in document_block_content table
- 1-to-1 relationship with documents
- Tenant isolation through RLS
- Integration with BlockNote editor:
- Rich text editing capabilities
- Block-based content structure
- Standardized JSON format:
interface BlockContent { blocks: Block[]; // BlockNote's native block format version: number; // Document format version (e.g., 1) time: string; // ISO timestamp of last update }
- Version-aware content storage:
- Optional version_id reference to document_versions
- Allows tracking block content changes across versions
- Supports reverting to previous versions
- Maintains version history without duplicating content
- Enables gradual adoption of versioning
- Enables future features like collaborative editing
- UI Components:
- TextEditor: Core editing component using BlockNote
- Documents: Container component managing document state and UI
- Supports manual save with validation
- Real-time content updates
- Error handling and validation
- Drawer-based editing interface
-
Document Versioning:
- Version tracking through document_versions table
- Features:
- Unique version numbers per document
- Active version flagging
- Creation metadata (timestamp, user)
- Tenant isolation through RLS
- Composite foreign key to documents
- Integration with block content:
- Optional version references
- Flexible content organization
- Efficient storage without content duplication
- Benefits:
- Track document evolution
- Maintain version history
- Support content rollback
- Enable review workflows
- Facilitate auditing
Models
- StorageProviderModel: Provider management
- StorageBucketModel: Bucket management
- FileStoreModel: File metadata management
- FileReferenceModel: Entity reference management
- ProviderEventModel: Event tracking
Storage Providers
Community Edition:
- Base provider interface
- Provider factory
- Error handling and retry logic
Enterprise Edition:
- S3 provider implementation with:
- Automatic retries
- Error handling
- Streaming support
- Metadata management
Services
- StorageService: Core business logic
- File operation coordination
- Validation and error handling
- Event tracking
Server Actions
- File upload handling
- File download processing
- File deletion management
- File listing and filtering
- Validation checks
UI Components
- FileManager: Main file management component
- Drag & drop support
- Progress tracking
- Error handling
- File listing and management
Usage
Setting Up a Storage Provider (Enterprise Edition)
const provider = await StorageProviderModel.create({
provider_type: 's3',
provider_name: 'Main Storage',
config: {
s3: {
region: 'us-west-2',
bucket: 'company-files',
access_key: process.env.AWS_ACCESS_KEY,
secret_key: process.env.AWS_SECRET_KEY
}
}
});
Creating a Storage Bucket
const bucket = await StorageBucketModel.create({
provider_id: provider.provider_id,
bucket_name: 'Customer Files',
bucket_path: '/customer-files',
allowed_mime_types: ['image/jpeg', 'image/png', 'application/pdf'],
max_file_size: 10 * 1024 * 1024 // 10MB
});
Using the FileManager Component
<FileManager
bucketId="bucket-id"
entityType="ticket"
entityId="ticket-id"
userId="user-id"
onUploadComplete={(file) => {
console.log('File uploaded:', file);
}}
onDeleteComplete={(fileId) => {
console.log('File deleted:', fileId);
}}
/>
Using the Preview Cache System
import { CacheFactory } from '../lib/cache/CacheFactory';
// Get a cache instance for a tenant
const cache = CacheFactory.getPreviewCache('tenant-id');
// Check if preview exists
const exists = await cache.exists('file-id');
// Get cached preview path
const previewPath = await cache.get('file-id');
// Cache a new preview
await cache.set('file-id', previewBuffer);
// Get cache metrics
const metrics = cache.getMetrics();
Security Considerations
-
Tenant Isolation
- RLS policies on all tables
- Tenant-specific storage paths
- Access control validation
-
File Validation
- MIME type checking
- File size limits
- Bucket-specific restrictions
-
Access Control
- User-based permissions
- Entity-based access control
- Audit trail through events
-
Storage Security
- Provider-level security
- Secure credential management
- Path sanitization
Enterprise Edition Features
The S3 storage provider is available in the Enterprise Edition and includes:
-
AWS S3 Integration
- Direct S3 bucket access
- AWS credentials management
- Region configuration
-
Advanced Features
- Automatic retries
- Error handling
- Streaming support
- Metadata management
-
Performance
- Optimized uploads
- Efficient downloads
- Proper cleanup
Maintenance
-
Monitoring
- Provider event tracking
- Error logging
- Performance metrics
-
Cleanup
- Soft deletion support
- Reference cleanup
- Storage quota management
-
Backup
- Database backups
- File backups through providers
- Metadata consistency checks
Future Considerations
Cache System Enhancements
-
Distributed Caching
- Redis-based caching implementation
- Cluster support for high availability
- Cache synchronization across nodes
-
Cache Management
- Automated cache cleanup jobs
- Size-based eviction policies
- Priority-based caching strategies
-
Performance Optimizations
- Memory-mapped file support
- Compression algorithms
- Streaming preview generation
-
Monitoring and Analytics
- Real-time cache statistics
- Performance metrics dashboard
- Cache efficiency analysis
Implementation Details
- Cache Directory Structure
/tmp/preview-cache/
├── tenant1/
│ ├── file1.png
│ └── file2.png
├── tenant2/
│ └── file3.png
└── .gitignore
- Environment Configuration
PREVIEW_CACHE_DIR=/tmp/preview-cache
PREVIEW_CACHE_MAX_AGE=604800000 # 7 days in milliseconds
PREVIEW_CACHE_MAX_SIZE=5368709120 # 5GB in bytes
- Cache Metrics Collection
- Hit/miss ratios
- Error rates
- Cache size monitoring
- Access patterns analysis
- Cleanup Strategies
- Time-based expiration
- LRU eviction policy
- Size-based cleanup
- Manual purge capabilities
- Error Handling
- Disk space monitoring
- Corrupted cache detection
- Automatic recovery
- Fallback mechanisms