Add Files page upload flow with manual folders and duplicate handling.
Deploy Ladill Transfer / deploy (push) Successful in 44s

Users can create folders, upload files or folders, and choose replace or keep both on name conflicts instead of auto-grouping by transfer.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-06-08 21:27:39 +00:00
co-authored by Cursor
parent 19170d6bc7
commit f9b16f6b61
12 changed files with 746 additions and 127 deletions
+21 -3
View File
@@ -122,6 +122,24 @@ class TransferService
}
private function storeFile(User $user, Transfer $transfer, UploadedFile $file): TransferFile
{
return $this->storeFileWithName(
$user,
$transfer,
$file,
$file->getClientOriginalName() ?: ('file.'.($file->getClientOriginalExtension() ?: 'bin')),
);
}
public function addStorageFile(User $user, Transfer $transfer, UploadedFile $file, string $displayName): TransferFile
{
$stored = $this->storeFileWithName($user, $transfer, $file, $displayName);
$transfer->increment('storage_bytes', $stored->size_bytes);
return $stored;
}
private function storeFileWithName(User $user, Transfer $transfer, UploadedFile $file, string $displayName): TransferFile
{
$uuid = Str::uuid()->toString();
$ext = $file->getClientOriginalExtension() ?: 'bin';
@@ -131,7 +149,7 @@ class TransferService
return TransferFile::create([
'transfer_id' => $transfer->id,
'original_name' => $file->getClientOriginalName() ?: 'file.'.$ext,
'original_name' => $displayName,
'disk' => 'qr',
'path' => $path,
'mime_type' => $file->getMimeType() ?: 'application/octet-stream',
@@ -208,7 +226,7 @@ class TransferService
$transfer->decrement('storage_bytes', $size);
if ($transfer->files()->count() === 0) {
if ($transfer->files()->count() === 0 && ! $transfer->shouldPersistWhenEmpty()) {
$this->delete($transfer->fresh(['files', 'qrCode']));
}
});
@@ -248,7 +266,7 @@ class TransferService
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) {
if ($source && $source->files->isEmpty() && $source->status !== Transfer::STATUS_DELETED && ! $source->shouldPersistWhenEmpty()) {
$this->delete($source->fresh(['files', 'qrCode']));
}
}