Dr-Panel/scripts/fix_storage.php

118 lines
3.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
define('LARAVEL_START', microtime(true));
$projectRoot = dirname(__DIR__);
require $projectRoot . '/vendor/autoload.php';
$app = require_once $projectRoot . '/bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
$kernel->bootstrap();
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
$dryRun = !in_array('--delete', $argv ?? []);
echo "\n=== ۱. Storage Link Fix ===\n\n";
$link = $projectRoot . DIRECTORY_SEPARATOR . 'public' . DIRECTORY_SEPARATOR . 'storage';
$target = $projectRoot . DIRECTORY_SEPARATOR . 'storage' . DIRECTORY_SEPARATOR . 'app' . DIRECTORY_SEPARATOR . 'public';
echo "Link : {$link}\n";
echo "Target : {$target}\n\n";
if (!is_dir($target)) {
echo "ERROR: Target directory not found!\n";
} else {
if (is_link($link) || (PHP_OS_FAMILY === 'Windows' && is_dir($link))) {
if (PHP_OS_FAMILY === 'Windows') {
exec('rmdir "' . $link . '"', $out, $code);
} else {
unlink($link);
}
echo "Old link removed.\n";
}
if (!file_exists($link) && !is_dir($link)) {
if (PHP_OS_FAMILY === 'Windows') {
exec('mklink /J "' . $link . '" "' . $target . '"', $out, $code);
if ($code === 0) {
echo "Junction created successfully! (no admin needed)\n";
} else {
echo "ERROR: " . implode("\n", $out) . "\n";
}
} else {
if (symlink($target, $link)) {
echo "Symlink created successfully!\n";
} else {
echo "ERROR: Could not create symlink.\n";
}
}
} else {
echo "OK: Link already exists and points to correct target.\n";
}
}
echo "\n=== ۲. Orphan Files Cleanup ===\n";
echo $dryRun ? "Mode: DRY RUN (add --delete to actually delete)\n\n" : "Mode: DELETE\n\n";
$referencedFiles = [];
$patients = DB::table('patients')->select('photos_before', 'photos_after', 'videos', 'audio_files')->get();
foreach ($patients as $p) {
foreach (['photos_before', 'photos_after', 'videos', 'audio_files'] as $field) {
foreach (json_decode($p->$field ?? '[]', true) ?? [] as $file) {
$referencedFiles[] = $file;
}
}
}
$initials = DB::table('osurg_initials')->select('attachment')->whereNotNull('attachment')->get();
foreach ($initials as $i) {
if ($i->attachment) {
$referencedFiles[] = $i->attachment;
}
}
$referencedFiles = array_filter($referencedFiles);
echo "Files referenced in DB: " . count($referencedFiles) . "\n\n";
$dirs = ['patients/photos-before', 'patients/photos-after', 'patients/videos', 'patients/audio', 'initials'];
$totalOrphans = 0;
$totalSize = 0;
foreach ($dirs as $dir) {
$diskFiles = Storage::disk('public')->files($dir);
if (empty($diskFiles)) {
echo "[{$dir}] No files.\n";
continue;
}
$orphans = array_values(array_filter($diskFiles, fn($f) => !in_array($f, $referencedFiles)));
echo "[{$dir}] total=" . count($diskFiles) . " orphans=" . count($orphans) . "\n";
foreach ($orphans as $orphan) {
$size = Storage::disk('public')->size($orphan);
$totalSize += $size;
$totalOrphans++;
echo " - {$orphan} (" . number_format($size / 1024, 1) . " KB)";
if (!$dryRun) {
Storage::disk('public')->delete($orphan);
echo " [DELETED]";
}
echo "\n";
}
}
echo "\n─────────────────────────────────\n";
echo "Orphan files : {$totalOrphans}\n";
echo "Wasted space : " . number_format($totalSize / 1024 / 1024, 2) . " MB\n";
if ($dryRun && $totalOrphans > 0) {
echo "\nبرای حذف اجرا کن:\n php scripts/fix_storage.php --delete\n";
}
echo "\nDone!\n";