274 lines
11 KiB
PHP
274 lines
11 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\AuditLog;
|
|
use App\Models\SystemSetting;
|
|
use App\Services\SettingsService;
|
|
use Illuminate\Http\Request;
|
|
|
|
class SystemSettingsController extends Controller
|
|
{
|
|
protected $settings;
|
|
|
|
public function __construct(SettingsService $settings)
|
|
{
|
|
$this->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', '進階設定已更新');
|
|
}
|
|
}
|