settings = $settings; } /** * Redirect to general settings */ public function index() { return redirect()->route('admin.settings.general'); } /** * Show general settings page */ public function general() { $settings = [ 'system_name' => $this->settings->get('general.system_name', 'Usher Management System'), 'timezone' => $this->settings->get('general.timezone', 'Asia/Taipei'), ]; return view('admin.settings.general', compact('settings')); } /** * Update general settings */ public function updateGeneral(Request $request) { $validated = $request->validate([ 'system_name' => 'required|string|max:255', 'timezone' => 'required|string|max:255', ]); SystemSetting::set('general.system_name', $validated['system_name'], 'string', 'general'); SystemSetting::set('general.timezone', $validated['timezone'], 'string', 'general'); AuditLog::create([ 'user_id' => auth()->id(), 'action' => 'settings.general.updated', 'description' => 'Updated general settings', 'ip_address' => $request->ip(), ]); return redirect()->route('admin.settings.general')->with('status', '一般設定已更新'); } /** * Show document features settings page */ public function features() { $settings = [ 'qr_codes_enabled' => $this->settings->isFeatureEnabled('qr_codes'), 'tagging_enabled' => $this->settings->isFeatureEnabled('tagging'), 'expiration_enabled' => $this->settings->isFeatureEnabled('expiration'), 'bulk_import_enabled' => $this->settings->isFeatureEnabled('bulk_import'), 'statistics_enabled' => $this->settings->isFeatureEnabled('statistics'), 'version_history_enabled' => $this->settings->isFeatureEnabled('version_history'), ]; return view('admin.settings.features', compact('settings')); } /** * Update features settings */ public function updateFeatures(Request $request) { $features = [ 'qr_codes_enabled', 'tagging_enabled', 'expiration_enabled', 'bulk_import_enabled', 'statistics_enabled', 'version_history_enabled', ]; foreach ($features as $feature) { $value = $request->has($feature) ? true : false; SystemSetting::set("features.{$feature}", $value, 'boolean', 'features'); } AuditLog::create([ 'user_id' => auth()->id(), 'action' => 'settings.features.updated', 'description' => 'Updated document features settings', 'ip_address' => $request->ip(), ]); return redirect()->route('admin.settings.features')->with('status', '功能設定已更新'); } /** * Show security & limits settings page */ public function security() { $settings = [ 'rate_limit_authenticated' => $this->settings->getDownloadRateLimit(true), 'rate_limit_guest' => $this->settings->getDownloadRateLimit(false), 'max_file_size_mb' => $this->settings->getMaxFileSize(), 'allowed_file_types' => $this->settings->getAllowedFileTypes(), ]; return view('admin.settings.security', compact('settings')); } /** * Update security settings */ public function updateSecurity(Request $request) { $validated = $request->validate([ 'rate_limit_authenticated' => 'required|integer|min:1|max:1000', 'rate_limit_guest' => 'required|integer|min:1|max:1000', 'max_file_size_mb' => 'required|integer|min:1|max:100', 'allowed_file_types' => 'nullable|string', ]); SystemSetting::set('security.rate_limit_authenticated', $validated['rate_limit_authenticated'], 'integer', 'security'); SystemSetting::set('security.rate_limit_guest', $validated['rate_limit_guest'], 'integer', 'security'); SystemSetting::set('security.max_file_size_mb', $validated['max_file_size_mb'], 'integer', 'security'); // Process allowed file types if ($request->filled('allowed_file_types')) { $types = array_map('trim', explode(',', $validated['allowed_file_types'])); SystemSetting::set('security.allowed_file_types', $types, 'json', 'security'); } AuditLog::create([ 'user_id' => auth()->id(), 'action' => 'settings.security.updated', 'description' => 'Updated security and limits settings', 'ip_address' => $request->ip(), ]); return redirect()->route('admin.settings.security')->with('status', '安全性設定已更新'); } /** * Show notifications settings page */ public function notifications() { $settings = [ 'enabled' => $this->settings->areNotificationsEnabled(), 'expiration_alerts_enabled' => $this->settings->get('notifications.expiration_alerts_enabled', true), 'expiration_recipients' => $this->settings->getExpirationNotificationRecipients(), 'archive_notifications_enabled' => $this->settings->get('notifications.archive_notifications_enabled', true), 'new_document_alerts_enabled' => $this->settings->get('notifications.new_document_alerts_enabled', false), ]; return view('admin.settings.notifications', compact('settings')); } /** * Update notifications settings */ public function updateNotifications(Request $request) { $validated = $request->validate([ 'enabled' => 'boolean', 'expiration_alerts_enabled' => 'boolean', 'expiration_recipients' => 'nullable|string', 'archive_notifications_enabled' => 'boolean', 'new_document_alerts_enabled' => 'boolean', ]); SystemSetting::set('notifications.enabled', $request->has('enabled'), 'boolean', 'notifications'); SystemSetting::set('notifications.expiration_alerts_enabled', $request->has('expiration_alerts_enabled'), 'boolean', 'notifications'); SystemSetting::set('notifications.archive_notifications_enabled', $request->has('archive_notifications_enabled'), 'boolean', 'notifications'); SystemSetting::set('notifications.new_document_alerts_enabled', $request->has('new_document_alerts_enabled'), 'boolean', 'notifications'); // Process email recipients if ($request->filled('expiration_recipients')) { $emails = array_map('trim', explode(',', $validated['expiration_recipients'])); $emails = array_filter($emails, fn($email) => filter_var($email, FILTER_VALIDATE_EMAIL)); SystemSetting::set('notifications.expiration_recipients', $emails, 'json', 'notifications'); } else { SystemSetting::set('notifications.expiration_recipients', [], 'json', 'notifications'); } AuditLog::create([ 'user_id' => auth()->id(), 'action' => 'settings.notifications.updated', 'description' => 'Updated notification settings', 'ip_address' => $request->ip(), ]); return redirect()->route('admin.settings.notifications')->with('status', '通知設定已更新'); } /** * Show advanced settings page */ public function advanced() { $settings = [ 'qr_code_size' => $this->settings->getQRCodeSize(), 'qr_code_format' => $this->settings->getQRCodeFormat(), 'statistics_time_range' => $this->settings->getStatisticsTimeRange(), 'statistics_top_n' => $this->settings->getStatisticsTopN(), 'audit_log_retention_days' => $this->settings->getAuditLogRetentionDays(), 'max_versions_retain' => $this->settings->getMaxVersionsToRetain(), 'default_expiration_days' => $this->settings->getDefaultExpirationDays(), 'expiration_warning_days' => $this->settings->getExpirationWarningDays(), 'auto_archive_enabled' => $this->settings->isAutoArchiveEnabled(), 'max_tags_per_document' => $this->settings->get('documents.max_tags_per_document', 10), 'default_access_level' => $this->settings->getDefaultAccessLevel(), ]; return view('admin.settings.advanced', compact('settings')); } /** * Update advanced settings */ public function updateAdvanced(Request $request) { $validated = $request->validate([ 'qr_code_size' => 'required|integer|min:100|max:1000', 'qr_code_format' => 'required|in:png,svg', 'statistics_time_range' => 'required|integer|min:7|max:365', 'statistics_top_n' => 'required|integer|min:5|max:100', 'audit_log_retention_days' => 'required|integer|min:30|max:3650', 'max_versions_retain' => 'required|integer|min:0|max:100', 'default_expiration_days' => 'required|integer|min:0|max:3650', 'expiration_warning_days' => 'required|integer|min:1|max:365', 'auto_archive_enabled' => 'boolean', 'max_tags_per_document' => 'required|integer|min:1|max:50', 'default_access_level' => 'required|in:public,members,admin,board', ]); SystemSetting::set('advanced.qr_code_size', $validated['qr_code_size'], 'integer', 'advanced'); SystemSetting::set('advanced.qr_code_format', $validated['qr_code_format'], 'string', 'advanced'); SystemSetting::set('advanced.statistics_time_range', $validated['statistics_time_range'], 'integer', 'advanced'); SystemSetting::set('advanced.statistics_top_n', $validated['statistics_top_n'], 'integer', 'advanced'); SystemSetting::set('advanced.audit_log_retention_days', $validated['audit_log_retention_days'], 'integer', 'advanced'); SystemSetting::set('advanced.max_versions_retain', $validated['max_versions_retain'], 'integer', 'advanced'); SystemSetting::set('documents.default_expiration_days', $validated['default_expiration_days'], 'integer', 'documents'); SystemSetting::set('documents.expiration_warning_days', $validated['expiration_warning_days'], 'integer', 'documents'); SystemSetting::set('documents.auto_archive_enabled', $request->has('auto_archive_enabled'), 'boolean', 'documents'); SystemSetting::set('documents.max_tags_per_document', $validated['max_tags_per_document'], 'integer', 'documents'); SystemSetting::set('documents.default_access_level', $validated['default_access_level'], 'string', 'documents'); AuditLog::create([ 'user_id' => auth()->id(), 'action' => 'settings.advanced.updated', 'description' => 'Updated advanced settings', 'ip_address' => $request->ip(), ]); return redirect()->route('admin.settings.advanced')->with('status', '進階設定已更新'); } }