Skip to content

Conversation

@oatkins8
Copy link
Contributor

@oatkins8 oatkins8 commented Feb 3, 2026

What Issue Does This PR Cover, If Any?

Resolves: #568

What Changed? And Why Did It Change?

Beacons need to download documents that are attached to their associated topics. Previously there was no endpoint to serve these files with proper authentication and authorization. This PR adds a files endpoint that allows beacons to download documents only from topics they have access to. The endpoint uses ActiveStorage streaming to support both full file downloads and partial content requests via Range headers, which is important for efficient delivery of large files.

The accessible_blobs method was added to the Beacon model to provide the authorization layer, ensuring beacons can only access documents from their own topics. The namespace was also standardised from beacons to beacon for consistency across the API.

How Has This Been Tested?

Comprehensive request specs cover authentication, authorization, full downloads, Range header support with single and multiple byte ranges, not found scenarios, and cross-beacon authorization checks. Model specs verify the accessible_blobs method correctly scopes files to the beacon's topics.

@oatkins8 oatkins8 changed the title Add authenticated file download endpoint for beacons [WIP] Add authenticated file download endpoint for beacons Feb 3, 2026
@oatkins8 oatkins8 marked this pull request as draft February 3, 2026 16:23
end

def accessible_blobs
ActiveStorage::Blob
Copy link
Member

Choose a reason for hiding this comment

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

Do we want to use sql in this query? I know it is faster but it is less accessible to everyone. (Not saying don't use sql, asking the question)

Copy link
Member

Choose a reason for hiding this comment

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

Also, I know this is in draft and not finished so ignore this ;)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Good shout - just changed it to ActiveRecord 👍

@oatkins8 oatkins8 changed the title [WIP] Add authenticated file download endpoint for beacons Add authenticated file download endpoint for beacons Feb 4, 2026
@oatkins8 oatkins8 force-pushed the feature/file-download-endpoint branch from 5621b6e to 8a9bcf5 Compare February 4, 2026 14:30
Beacons need to scope file access to only documents attached
to their associated topics. The accessible_blobs method provides
this authorisation layer by joining through the attachments and
beacon_topics associations to ensure beacons cannot access files
from topics belonging to other beacons.
Beacons receive a manifest listing files they need, then download
each file individually via this endpoint. The controller validates
that the requesting beacon has access through its assigned topics
and supports resumable downloads via Range headers for reliability
on unstable connections.
@oatkins8 oatkins8 force-pushed the feature/file-download-endpoint branch from 8a9bcf5 to 5aa9416 Compare February 4, 2026 14:36
@oatkins8 oatkins8 changed the title Add authenticated file download endpoint for beacons Add file download endpoint for beacons Feb 4, 2026
@oatkins8 oatkins8 marked this pull request as ready for review February 4, 2026 14:37
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.

File Download Endpoint

3 participants