Add transfer search and OneDrive-style Files storage UI.
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:
isaacclad
2026-06-08 20:59:05 +00:00
co-authored by Cursor
parent b36148eeb6
commit 19170d6bc7
15 changed files with 1083 additions and 59 deletions
+61
View File
@@ -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);
}
});
}
}