ping(); $this->peerConnected = $result['connected']; $this->peerPath = $result['path']; $this->peerChecked = true; } public function runBackup(): void { $dbPath = database_path('database.sqlite'); if (! file_exists($dbPath)) { Notification::make() ->title(__('navigation.backup.failed')) ->danger() ->send(); return; } $timestamp = now()->format('Y-m-d_H-i-s'); $zipFilename = "matab-backup-{$timestamp}.zip"; $zipPath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . $zipFilename; $zip = new \ZipArchive(); if ($zip->open($zipPath, \ZipArchive::CREATE | \ZipArchive::OVERWRITE) !== true) { Notification::make() ->title(__('navigation.backup.failed')) ->danger() ->send(); return; } $noCompressExts = [ 'jpg', 'jpeg', 'png', 'gif', 'webp', 'mp4', 'mov', 'avi', 'mkv', 'webm', 'mp3', 'wav', 'ogg', 'opus', 'm4a', 'zip', 'gz', 'rar', '7z', ]; $addFile = function (string $realPath, string $zipEntry) use ($zip, $noCompressExts): void { $zip->addFile($realPath, $zipEntry); $index = $zip->locateName($zipEntry); $ext = strtolower(pathinfo($realPath, PATHINFO_EXTENSION)); if (in_array($ext, $noCompressExts, true)) { $zip->setCompressionIndex($index, \ZipArchive::CM_STORE); } else { $zip->setCompressionIndex($index, \ZipArchive::CM_DEFLATE, 9); } }; $addFile($dbPath, 'database/database.sqlite'); $publicPath = storage_path('app/public'); foreach (['files', 'initials'] as $folder) { $folderPath = $publicPath . '/' . $folder; if (! is_dir($folderPath)) { continue; } $iterator = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator($folderPath, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY ); foreach ($iterator as $file) { if ($file->isFile()) { $relativePath = str_replace('\\', '/', substr($file->getPathname(), strlen($folderPath) + 1)); $addFile($file->getPathname(), $folder . '/' . $relativePath); } } } $zip->close(); session(['backup_tmp_path' => $zipPath, 'backup_tmp_name' => $zipFilename]); $this->dispatch('backup-ready', url: route('backup.download')); Notification::make() ->title(__('navigation.backup.success')) ->success() ->send(); } public function runSync(): void { $service = SyncService::fromConfig(); if (! $service->isConfigured()) { $this->syncFailed = true; $this->reportLines = [__('navigation.sync.error_not_configured')]; $this->dispatch('sync-finished', success: false); return; } $result = $service->sync(); $this->reportLines = $result['report'] ?? []; if ($result['success']) { $this->syncSuccess = true; $this->dispatch('sync-finished', success: true); } else { $this->syncFailed = true; $this->dispatch('sync-finished', success: false); } } public function render() { return view('livewire.settings-dropdown'); } }