134 lines
4.1 KiB
PHP
134 lines
4.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Livewire;
|
|
|
|
use App\Services\SyncService;
|
|
use Filament\Notifications\Notification;
|
|
use Livewire\Component;
|
|
|
|
class SettingsDropdown extends Component
|
|
{
|
|
public bool $syncSuccess = false;
|
|
public bool $syncFailed = false;
|
|
public array $reportLines = [];
|
|
|
|
public bool $peerConnected = false;
|
|
public ?string $peerPath = null;
|
|
public bool $peerChecked = false;
|
|
|
|
public function checkPeerStatus(): void
|
|
{
|
|
$result = SyncService::fromConfig()->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');
|
|
}
|
|
}
|