Add transfer search and OneDrive-style Files storage UI.
Deploy Ladill Transfer / deploy (push) Successful in 29s
Deploy Ladill Transfer / deploy (push) Successful in 29s
Transfers now lists all shares with filters and pagination; Files becomes a selectable cloud view with download, share, delete, move, and open-in-email actions. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -197,4 +197,65 @@ class TransferService
|
||||
$transfer->update(['status' => Transfer::STATUS_DELETED]);
|
||||
});
|
||||
}
|
||||
|
||||
public function deleteFile(TransferFile $file): void
|
||||
{
|
||||
DB::transaction(function () use ($file) {
|
||||
$transfer = $file->transfer()->lockForUpdate()->first();
|
||||
Storage::disk($file->disk)->delete($file->path);
|
||||
$size = $file->size_bytes;
|
||||
$file->delete();
|
||||
|
||||
$transfer->decrement('storage_bytes', $size);
|
||||
|
||||
if ($transfer->files()->count() === 0) {
|
||||
$this->delete($transfer->fresh(['files', 'qrCode']));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/** @param list<TransferFile> $files */
|
||||
public function deleteFiles(array $files): void
|
||||
{
|
||||
foreach ($files as $file) {
|
||||
$this->deleteFile($file);
|
||||
}
|
||||
}
|
||||
|
||||
/** @param list<TransferFile> $files */
|
||||
public function moveFiles(Transfer $destination, array $files): void
|
||||
{
|
||||
if ($files === []) {
|
||||
return;
|
||||
}
|
||||
|
||||
DB::transaction(function () use ($destination, $files) {
|
||||
$destination = Transfer::query()->lockForUpdate()->findOrFail($destination->id);
|
||||
$movedBytes = 0;
|
||||
$sourceAdjustments = [];
|
||||
|
||||
foreach ($files as $file) {
|
||||
if ($file->transfer_id === $destination->id) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$sourceId = $file->transfer_id;
|
||||
$movedBytes += $file->size_bytes;
|
||||
$sourceAdjustments[$sourceId] = ($sourceAdjustments[$sourceId] ?? 0) + $file->size_bytes;
|
||||
$file->update(['transfer_id' => $destination->id]);
|
||||
}
|
||||
|
||||
foreach ($sourceAdjustments as $sourceId => $bytes) {
|
||||
Transfer::query()->whereKey($sourceId)->decrement('storage_bytes', $bytes);
|
||||
$source = Transfer::query()->with('files')->find($sourceId);
|
||||
if ($source && $source->files->isEmpty() && $source->status !== Transfer::STATUS_DELETED) {
|
||||
$this->delete($source->fresh(['files', 'qrCode']));
|
||||
}
|
||||
}
|
||||
|
||||
if ($movedBytes > 0) {
|
||||
$destination->increment('storage_bytes', $movedBytes);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user