# Configuration and Settings Specification ## Overview Comprehensive configuration management system using Laravel's settings with database storage, environment variables, and runtime configuration for flexible application behavior. ## Configuration Architecture ### Configuration Sources (Priority Order) 1. **Runtime Settings** (Database) - User-configurable application behavior 2. **Environment Variables** (`.env`) - Sensitive and environment-specific settings 3. **Configuration Files** (`config/`) - Framework and package defaults 4. **Hardcoded Defaults** - Fallback values in code ``` ┌─────────────────────────────────────────────────────────┐ │ Runtime Settings (Database) │ │ • User-configurable behavior │ │ • Admin-managed settings │ │ • Feature flags and toggles │ └─────────────────────┬───────────────────────────────────┘ │ Priority 1 (Highest) ▼ ┌─────────────────────────────────────────────────────────┐ │ Environment Variables (.env) │ │ • Sensitive credentials │ │ • Environment-specific configuration │ │ • Deployment-specific settings │ └─────────────────────┬───────────────────────────────────┘ │ Priority 2 ▼ ┌─────────────────────────────────────────────────────────┐ │ Configuration Files (config/) │ │ • Laravel framework settings │ │ • Package configurations │ │ • Default application behavior │ └─────────────────────┬───────────────────────────────────┘ │ Priority 3 ▼ ┌─────────────────────────────────────────────────────────┐ │ Hardcoded Defaults │ │ • Fallback values in code │ │ • Emergency defaults │ └─────────────────────────────────────────────────────────┘ ``` ## Settings Model ### Database Structure **Table**: `settings` **Schema**: ```sql CREATE TABLE settings ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, key VARCHAR(255) UNIQUE NOT NULL, value LONGTEXT NULL, created_at TIMESTAMP NULL, updated_at TIMESTAMP NULL ); ``` **Model**: `app/Models/Setting.php` **Key Features**: - Unique constraint on `key` field - `value` stored as LONGTEXT for flexibility (JSON, arrays, large strings) - Automatic timestamps for audit trail ### Setting Access Patterns **Simple Value Retrieval**: ```php $value = Setting::where('key', 'app_name')->first()->value ?? 'Default Name'; ``` **Type-Safe Access**: ```php // Boolean setting $enabled = Setting::getBoolean('feature_enabled', false); // Integer setting $maxImages = Setting::getInteger('max_images_per_user', 100); // JSON setting $parameters = Setting::getJson('api_parameters', []); ``` ## Configuration Categories ### 1. Application Settings **Core Application Behavior**: ```php // Application Identity 'app_name' => 'AI StyleGallery' 'app_description' => 'Transform images with AI styles' 'app_url' => 'https://your-domain.com' // Gallery Behavior 'gallery_heading' => 'Meine Bildergalerie' 'default_style_id' => 1 'new_image_timespan_minutes' => 60 'image_refresh_interval' => 5 // seconds // Upload Configuration 'max_upload_size' => 10 // MB 'allowed_image_types' => 'jpeg,jpg,png,webp' 'auto_process_uploaded_images' => false // UI Configuration 'show_print_button' => true 'default_theme' => 'light' 'default_locale' => 'de' ``` ### 2. AI Processing Settings **Processing Behavior**: ```php // Timeout Configuration 'comfyui_timeout' => 180 // seconds 'runwareai_timeout' => 60 // seconds 'max_processing_time' => 300 // seconds // Retry Configuration 'max_retry_attempts' => 3 'retry_delay' => 1000000 // microseconds // Queue Management 'max_concurrent_processes' => 3 'process_queue_enabled' => true // Quality Settings 'default_output_quality' => 95 // JPEG quality 'enable_progressive_jpeg' => true ``` ### 3. Storage Configuration **File Management**: ```php // Storage Paths 'upload_path' => 'uploads/' 'style_preview_path' => 'style_previews/' 'temp_path' => 'temp/' // Cleanup Settings 'auto_cleanup_temp_files' => true 'temp_file_retention_hours' => 24 'max_storage_per_user_gb' => 5 // CDN Configuration 'cdn_enabled' => false 'cdn_base_url' => 'https://cdn.your-domain.com' ``` ### 4. Notification Settings **Communication Preferences**: ```php // Email Settings 'email_notifications_enabled' => true 'admin_notification_email' => 'admin@your-domain.com' 'notification_from_email' => 'noreply@your-domain.com' // Processing Notifications 'notify_on_processing_start' => false 'notify_on_processing_complete' => true 'notify_on_processing_error' => true // Admin Alerts 'alert_on_high_error_rate' => true 'error_rate_threshold' => 10 // percentage ``` ### 5. Security Settings **Security Configuration**: ```php // Session Security 'session_lifetime' => 120 // minutes 'admin_session_lifetime' => 60 // minutes 'enable_session_fixation_protection' => true // Rate Limiting 'login_attempts_per_minute' => 5 'api_rate_limit_per_hour' => 1000 // Content Security 'enable_csp' => true 'csp_report_only' => false ``` ### 6. Performance Settings **Performance Optimization**: ```php // Caching 'cache_enabled' => true 'cache_ttl' => 3600 // seconds 'style_cache_ttl' => 7200 // seconds // Image Optimization 'enable_lazy_loading' => true 'thumbnail_size' => 300 // pixels 'preview_quality' => 80 // JPEG quality // Database Optimization 'query_cache_enabled' => true 'eager_loading_enabled' => true ``` ## Environment Configuration ### Sensitive Configuration (`.env`) ```bash # Application APP_NAME="AI StyleGallery" APP_ENV=production APP_KEY=base64:your-app-key-here APP_URL=https://your-domain.com # Database DB_CONNECTION=sqlite DB_DATABASE=/path/to/database.sqlite # Mail Configuration MAIL_MAILER=smtp MAIL_HOST=smtp.your-provider.com MAIL_PORT=587 MAIL_USERNAME=your-email@domain.com MAIL_PASSWORD=your-app-password MAIL_ENCRYPTION=tls # Redis (for caching) REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 # Broadcasting (for real-time features) BROADCAST_DRIVER=pusher PUSHER_APP_ID=your-pusher-id PUSHER_APP_KEY=your-pusher-key PUSHER_APP_SECRET=your-pusher-secret PUSHER_HOST=your-pusher-host PUSHER_PORT=443 PUSHER_SCHEME=https # AI Service Credentials COMFYUI_API_URL=https://your-comfyui-server.com COMFYUI_API_KEY=your-comfyui-key RUNWAREAI_API_URL=https://api.runwareai.com RUNWAREAI_API_TOKEN=your-runwareai-token ``` ## Configuration Files ### Laravel Configuration (`config/`) #### `config/app.php` ```php 'locale' => env('APP_LOCALE', 'de'), 'timezone' => env('APP_TIMEZONE', 'Europe/Berlin'), 'key' => env('APP_KEY'), 'cipher' => 'AES-256-CBC', ``` #### `config/filesystems.php` ```php 'public' => [ 'driver' => 'local', 'root' => public_path('storage'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ], ``` #### `config/filament.php` ```php 'brand' => [ 'name' => env('APP_NAME', 'AI StyleGallery'), 'logo' => '/images/logo.png', ], 'auth' => [ 'guard' => 'web', 'pages' => [ 'login' => \App\Filament\Pages\Login::route('/login'), ], ], ``` ## Runtime Configuration Management ### Setting Access Helpers **Location**: `app/Services/SettingsService.php` **Core Methods**: #### `get(string $key, $default = null)` - Retrieves setting value with optional default - Automatic type casting for common types #### `set(string $key, $value): void` - Stores or updates setting value - Handles type conversion and validation #### `getBoolean(string $key, bool $default = false): bool` - Retrieves boolean setting with fallback #### `getInteger(string $key, int $default = 0): int` - Retrieves integer setting with fallback #### `getJson(string $key, $default = []): array` - Retrieves JSON setting as associative array **Usage Examples**: ```php // Application settings $appName = Settings::get('app_name', 'AI StyleGallery'); $maxCopies = Settings::getInteger('max_print_copies', 10); $features = Settings::getJson('enabled_features', []); // Feature flags $printEnabled = Settings::getBoolean('show_print_button', true); $notificationsEnabled = Settings::getBoolean('email_notifications_enabled', true); ``` ### Configuration Caching **Cache Strategy**: - Settings cached in Redis/memory for performance - Automatic cache invalidation on setting changes - Separate TTL for different setting categories **Implementation**: ```php // Cache key pattern 'settings:' . $key => $value // Cache TTL by category 'application_settings' => 3600, // 1 hour 'ai_settings' => 1800, // 30 minutes 'security_settings' => 7200, // 2 hours ``` ## Admin Configuration Interface ### Filament Settings Management **Settings Resource**: `app/Filament/Resources/SettingResource.php` **Features**: - **CRUD Interface**: Create, read, update, delete settings - **Type Validation**: Ensure setting values match expected types - **Bulk Operations**: Mass update related settings - **Import/Export**: Backup and restore configuration - **Validation**: Prevent invalid configuration values **Setting Types**: - **Text**: Simple string values - **Number**: Integer and float values - **Boolean**: True/false toggles - **JSON**: Complex configuration objects - **Select**: Predefined option lists ### Settings Categories **Organization**: - **General**: Application name, description, URLs - **Gallery**: Image handling, display options - **AI Processing**: Provider settings, timeouts, quality - **Storage**: File paths, cleanup, CDN settings - **Notifications**: Email, alerts, communication - **Security**: Authentication, rate limiting, privacy - **Performance**: Caching, optimization, limits ## Dynamic Configuration ### Feature Flags **Implementation**: ```php // Feature flag checking if (Settings::getBoolean('enable_batch_processing', false)) { // Enable batch processing features } // Environment-specific features if (app()->environment('production')) { $features = Settings::getJson('production_features', []); } else { $features = Settings::getJson('development_features', []); } ``` **Common Feature Flags**: - `enable_printing`: Show/hide print functionality - `enable_batch_processing`: Allow multiple image processing - `enable_social_features`: User sharing capabilities - `enable_advanced_styles`: Premium style options ### Environment-Based Configuration **Automatic Configuration**: ```php // Different settings per environment $environment = app()->environment(); switch ($environment) { case 'production': $settings = Settings::getJson('production_overrides', []); break; case 'staging': $settings = Settings::getJson('staging_overrides', []); break; default: $settings = Settings::getJson('development_overrides', []); } ``` ## Configuration Validation ### Setting Validation Rules **Validation Framework**: ```php $rules = [ 'app_name' => 'required|string|max:255', 'max_upload_size' => 'required|integer|min:1|max:100', 'allowed_image_types' => 'required|string', 'comfyui_timeout' => 'required|integer|min:30|max:600', 'cdn_enabled' => 'boolean', 'api_parameters' => 'nullable|json', ]; ``` **Validation Implementation**: ```php // Validate before saving $validator = Validator::make($settings, $rules); if ($validator->fails()) { throw new ValidationException($validator->errors()); } // Type conversion $sanitizedValue = match($setting->type) { 'boolean' => (bool) $value, 'integer' => (int) $value, 'json' => json_decode($value, true), default => (string) $value, }; ``` ## Configuration Migration ### Version Management **Configuration Versions**: - Track configuration schema versions - Automatic migration of configuration values - Backup before major configuration changes **Migration Example**: ```php // Configuration migration for new version if ($currentVersion < 2.0) { // Migrate old 'upload_size' to 'max_upload_size' $oldValue = Settings::get('upload_size'); if ($oldValue) { Settings::set('max_upload_size', $oldValue * 1024 * 1024); // Convert MB to bytes Settings::forget('upload_size'); } } ``` ### Backup and Restore **Configuration Backup**: ```php // Export all settings $allSettings = Settings::all(); $backup = [ 'version' => config('app.version'), 'timestamp' => now()->toISOString(), 'settings' => $allSettings->pluck('value', 'key')->toArray(), ]; // Save to file Storage::put('config-backup-' . date('Y-m-d-H-i-s') . '.json', json_encode($backup)); ``` ## Monitoring and Analytics ### Configuration Monitoring **Change Tracking**: - Log all configuration changes - Track who made changes and when - Alert on critical configuration modifications **Performance Impact**: - Monitor configuration load times - Track cache hit/miss ratios - Alert on configuration-related errors ### Analytics Integration **Usage Analytics**: ```php // Track feature usage if (Settings::getBoolean('analytics_enabled', false)) { Analytics::track('feature_used', [ 'feature' => 'style_application', 'style_id' => $style->id, 'user_id' => auth()->id(), ]); } ``` ## Security Considerations ### Sensitive Configuration **Encryption**: - Encrypt sensitive setting values in database - Use Laravel's encryption helpers for sensitive data - Separate encryption keys for different environments **Access Control**: - Restrict sensitive settings to admin users only - Audit trail for sensitive configuration changes - Automatic masking in logs and exports ### Configuration Injection Prevention **Input Sanitization**: - Validate all configuration inputs - Prevent code injection through configuration - Escape special characters in configuration values ## Deployment Configuration ### Environment-Specific Settings **Deployment Pipeline**: ```php // Production deployment Settings::set('app_environment', 'production'); Settings::set('cdn_enabled', true); Settings::set('debug_mode', false); // Development deployment Settings::set('app_environment', 'development'); Settings::set('cdn_enabled', false); Settings::set('debug_mode', true); ``` ### Configuration Synchronization **Multi-Server Setup**: - Synchronize configuration across web servers - Handle configuration updates without downtime - Validate configuration consistency ## Troubleshooting Configuration ### Common Issues **Configuration Not Loading**: - Check database connectivity - Verify settings table exists - Validate setting key names **Performance Issues**: - Monitor configuration cache hit rates - Check for configuration-related database queries - Optimize frequently accessed settings **Type Mismatches**: - Ensure proper type casting in code - Validate setting types in admin interface - Handle legacy configuration gracefully ### Debug Tools **Configuration Inspector**: ```php // Development-only configuration debugging if (app()->environment('local')) { Route::get('/admin/config-debug', function () { return [ 'all_settings' => Settings::all(), 'environment' => app()->environment(), 'cached_settings' => Cache::get('settings:*'), ]; }); } ``` ## Future Configuration Enhancements ### Advanced Features **Configuration Templates**: - Predefined configuration sets for different use cases - One-click configuration application - Configuration comparison and diff tools **Dynamic Configuration**: - Real-time configuration updates - Hot-reloading of configuration changes - A/B testing for configuration options **External Configuration**: - Integration with external configuration management systems - Cloud-based configuration storage - Configuration sharing across projects ### Configuration API **RESTful Configuration Management**: - API endpoints for configuration management - Version control for configuration changes - Configuration validation via API **Webhook Integration**: - Notify external systems of configuration changes - Trigger deployments on configuration updates - Integrate with monitoring and alerting systems