Skip to content

S3 File Browser v2 - #289

Open
F3l1x1vo wants to merge 33 commits into
feat/s3-file-browser-v1from
feat/s3-file-browser-v2
Open

F3l1x1vo wants to merge 33 commits into
feat/s3-file-browser-v1from
feat/s3-file-browser-v2

Conversation

@F3l1x1vo

Copy link
Copy Markdown
Collaborator

Closes #124 #180 #216

@F3l1x1vo
F3l1x1vo marked this pull request as draft August 13, 2026 10:13
@F3l1x1vo F3l1x1vo self-assigned this Aug 13, 2026
@F3l1x1vo
F3l1x1vo requested a review from dklOrdix August 13, 2026 11:18
@F3l1x1vo
F3l1x1vo marked this pull request as ready for review August 13, 2026 11:18
@lfrancke lfrancke mentioned this pull request Aug 25, 2026
5 of 17 tasks
dklOrdix and others added 20 commits September 1, 2026 08:05
* feat: Add basic search Modal

* fix: Update cleanup keys for cut and paste test to include destination file
* feat: Add basic search Modal

* feat: overhaul Storage Search Modal

* Search Regex and more backend functions (#291)

* #180 move filters to backend, restrict regex, move regex button, stream search results

* fix lint

* #180 add date and size filter to search

* #180 autofocus search bar, cancel search, dead i18n keys, session shortcut hint, userside regex validation

* fix arch

* #180 use daisyui dropdown, show datepicker below input

* add left padding to select

* fix lint

* make the input field as tall as the search select

* test: keep search modal open when closing date picker

---------

Co-authored-by: F3l1x1vo <fli@ordix.de>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
* feat: Add basic search Modal

* feat: overhaul Storage Search Modal

* feat: improve recent searches tab

* style: use text-white for open search button

* fix keybind targeting in search modal

* fix merge

* fix merge

* fix merge

---------

Co-authored-by: F3l1x1vo <fli@ordix.de>
* #124 add multipart download, add archived download

* #124 fix progress display, add download again button

* #124 download again only if cached archive not expired

* fix lint

* fix lint

* #124 restrict downloads to zip format

* #124 fix cancelled jobs running checks, show compression stage notice

* #128 enable download on right clicking a folder, fix worker display of multidownload

* #124 use noncompressed archive directly to browser instead of multipart download to server

* feat: remove duplicate code and improve download logic

* feat: remove duplicate code and improve download logic

* fix: changes to download history behaviour

* #124 use chevrons instead of text, hide folders, improve error messages

* #124 transmit final size to browser, link browser download to job

* #124 ui job improvements

* remove deprecated download history unit test

* pull from v2

---------

Co-authored-by: dklOrdix <dkl@ordix.de>
…at/s3-file-browser-v2

# Conflicts:
#	e2e/storage/permissions.spec.ts
#	src/lib/components/storage/explorer/OperationsButton.svelte
#	src/routes/(app)/settings/connections/+page.server.ts
@github-actions

github-actions Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

⚠️ Coverage report too large to inline, see the workflow summary.

@Bohreromir Bohreromir left a comment •

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Due to time constrains I can only supply you with a spot checked by me, clauded review for now.
Feel free to push back on any hallucinated ones ;)

High

  • src/lib/server/storage/operations.ts:121 – With destinationKey set (used by rename), only sourceKeys[0] is copied, so renaming a folder only moves its / marker and leaves the contents behind. Expand directory keys here the way computeDestinations does.
  • src/lib/server/storage/operations.ts:198 – Moves filter out keys ending in / before deleting, so the source folder marker survives and an empty folder stays visible. Delete the markers once all their children have moved.
  • src/lib/server/storage/preview/csv.ts:112,125,141 – Line offsets use JS string length (UTF-16) instead of UTF-8 byte length, so any non-ASCII character shifts every later offset and garbles rows. Count with TextEncoder().encode(line).length or scan the raw bytes for \n.
  • src/lib/server/auth.ts:97 – Regression: email: profile.email || '' dropped the preferred_username fallback. better-auth rejects an empty email (email_is_missing), so OIDC users without an email claim can't log in any more.

Medium

  • src/lib/server/storage/operations.ts:141 – uniqueDestKey runs per expanded child, not once for the folder root. Copying docs/ where docs/ already exists gives an empty docs (1)/, with the files landing in docs/ as a (1).txt.
  • src/lib/server/storage/preview/csv.ts:225 – Cached entries are never checked against the file's ETag or size, and nothing clears them. After a save or re-upload the preview reads the wrong ranges until the TTL expires.
  • src/lib/server/storage/connections-db.ts:21 – The fingerprint leaves out port, TLS and access style, so connecting to the same host on another port silently reuses the old connection. Add them to the hash.
  • src/routes/(app)/settings/connections/[id]/edit/+page.server.ts:170 – An edit re-encrypts the payload but never updates hash. A later connect with the old settings then matches the edited connection.
  • src/lib/storage/upload.ts:42 – Regression: checkObjectExists returns false on any non-2xx or network error, so a 401, 403 or 5xx skips the overwrite prompt. Restore the main behaviour: 404 means false, everything else throws (the docstring still says it throws).
  • src/lib/server/storage/download-manifests.ts:320 – The single-file download pipes into controller.enqueue with no backpressure, so a large file to a slow client is buffered in Node memory. Return download.stream directly or use pull.
  • src/routes/(app)/api/storage/download/manifests/[manifestId]/[part]/+server.ts:31 – The raw filename goes into filename="...", so non-Latin-1 names cause a 500 and a " breaks the header. Reuse contentDispositionFilename from download/+server.ts.
  • src/lib/server/storage/streaming.ts:57 – If operationPromise rejects (for example listAllKeys fails), the job is never failed and stays running until it expires. Wrap the call in try/catch → failJob, then error the stream.

Low

  • src/routes/(app)/settings/connections/[id]/edit/+page.server.ts:92 – If only one of access key or secret is filled in, the change is dropped and the page still reports success. Return a validation error instead.
  • src/routes/(app)/settings/connections/[id]/edit/+page.server.ts:155,162 – 'Connection not found' and 'Failed to read existing credentials' are hardcoded user-visible strings. Move them to messages/*.json.
  • src/lib/server/storage/download-manifests.ts:73 – expandKeys sends one getMetadata HEAD per key through Promise.all with no limit, so a large folder fires thousands at once. Use the sizes from the listing or cap concurrency.
  • src/lib/server/storage/connection.ts:38 – A connection-ID header that isn't a valid UUID reaches Postgres and returns 500. Validate it as a UUID first and return 400/401.

Comment thread package.json
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Filebrowser: Bucket Grid Search Filebrowser: Search Filebrowser: Add multi-download functionality to Filebrowser

4 participants