- FileObserver: 파일 생성/삭제 시 tenant.storage_used 자동 업데이트 - RecalculateTenantStorageCommand: 기존 데이터 재계산 명령어 - php artisan tenant:recalculate-storage [--tenant=ID] [--dry-run] - 음수 storage_used 방지 로직 포함 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
77 lines
2.2 KiB
PHP
77 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace App\Observers;
|
|
|
|
use App\Models\Boards\File;
|
|
use App\Models\Tenants\Tenant;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
/**
|
|
* 파일 생성/삭제 시 테넌트 저장소 사용량 자동 업데이트
|
|
*/
|
|
class FileObserver
|
|
{
|
|
/**
|
|
* 파일 생성 시 - 테넌트 storage_used 증가
|
|
*/
|
|
public function created(File $file): void
|
|
{
|
|
$this->updateTenantStorage($file->tenant_id, $file->file_size);
|
|
}
|
|
|
|
/**
|
|
* 파일 소프트 삭제 시 - 테넌트 storage_used 감소
|
|
*/
|
|
public function deleted(File $file): void
|
|
{
|
|
$this->updateTenantStorage($file->tenant_id, -$file->file_size);
|
|
}
|
|
|
|
/**
|
|
* 파일 복원 시 - 테넌트 storage_used 증가
|
|
*/
|
|
public function restored(File $file): void
|
|
{
|
|
$this->updateTenantStorage($file->tenant_id, $file->file_size);
|
|
}
|
|
|
|
/**
|
|
* 파일 영구 삭제 시 - 이미 deleted에서 처리되므로 추가 작업 불필요
|
|
* forceDelete는 deleted 이벤트를 트리거하지 않으므로 별도 처리
|
|
*/
|
|
public function forceDeleting(File $file): void
|
|
{
|
|
// 소프트 삭제되지 않은 상태에서 바로 forceDelete하는 경우만 처리
|
|
if (! $file->trashed()) {
|
|
$this->updateTenantStorage($file->tenant_id, -$file->file_size);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 테넌트 저장소 사용량 업데이트
|
|
*/
|
|
private function updateTenantStorage(?int $tenantId, int $sizeDelta): void
|
|
{
|
|
if (! $tenantId || $sizeDelta === 0) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
$tenant = Tenant::find($tenantId);
|
|
if ($tenant) {
|
|
// 음수가 되지 않도록 보호
|
|
$newSize = max(0, ($tenant->storage_used ?? 0) + $sizeDelta);
|
|
$tenant->storage_used = $newSize;
|
|
$tenant->save();
|
|
|
|
Log::debug("Tenant {$tenantId} storage updated: {$sizeDelta} bytes (total: {$newSize})");
|
|
}
|
|
} catch (\Exception $e) {
|
|
Log::error("Failed to update tenant storage: {$e->getMessage()}", [
|
|
'tenant_id' => $tenantId,
|
|
'size_delta' => $sizeDelta,
|
|
]);
|
|
}
|
|
}
|
|
}
|