diff --git a/apps/backend/internal/blob/fs_store.go b/apps/backend/internal/blob/fs_store.go index 304a4f1..78c9ce8 100644 --- a/apps/backend/internal/blob/fs_store.go +++ b/apps/backend/internal/blob/fs_store.go @@ -16,8 +16,7 @@ type FSStore struct { } type FSStoreConfig struct { - Root string - UploadURL string + Root string } func NewFSStore(config FSStoreConfig) *FSStore { @@ -28,10 +27,6 @@ func (s *FSStore) Initialize(ctx context.Context) error { return os.MkdirAll(s.config.Root, 0755) } -func (s *FSStore) GenerateUploadURL(ctx context.Context, key Key, opts UploadURLOptions) (string, error) { - return s.config.UploadURL, nil -} - func (s *FSStore) Put(ctx context.Context, key Key, reader io.Reader) error { path := filepath.Join(s.config.Root, string(key)) @@ -149,3 +144,11 @@ func (s *FSStore) Move(ctx context.Context, srcKey, dstKey Key) error { return nil } + +func (s *FSStore) SupportsDirectUpload() bool { + return false +} + +func (s *FSStore) GenerateUploadURL(ctx context.Context, key Key, opts UploadURLOptions) (string, error) { + return "", nil +} diff --git a/apps/backend/internal/blob/store.go b/apps/backend/internal/blob/store.go index caf2c15..0538f3f 100644 --- a/apps/backend/internal/blob/store.go +++ b/apps/backend/internal/blob/store.go @@ -16,7 +16,6 @@ type UpdateOptions struct { type Store interface { Initialize(ctx context.Context) error - GenerateUploadURL(ctx context.Context, key Key, opts UploadURLOptions) (string, error) Put(ctx context.Context, key Key, reader io.Reader) error Update(ctx context.Context, key Key, opts UpdateOptions) error Delete(ctx context.Context, key Key) error @@ -25,4 +24,10 @@ type Store interface { Read(ctx context.Context, key Key) (io.ReadCloser, error) ReadRange(ctx context.Context, key Key, offset, length int64) (io.ReadCloser, error) ReadSize(ctx context.Context, key Key) (int64, error) + + // SupportsDirectUpload returns true if the store allows files to be uploaded directly to the blob store. + SupportsDirectUpload() bool + + // GenerateUploadURL generates a URL that can be used to upload a file directly to the blob store. If unsupported, returns an empty string with no error. + GenerateUploadURL(ctx context.Context, key Key, opts UploadURLOptions) (string, error) } diff --git a/apps/backend/internal/upload/service.go b/apps/backend/internal/upload/service.go index 0b7f607..57fb31b 100644 --- a/apps/backend/internal/upload/service.go +++ b/apps/backend/internal/upload/service.go @@ -58,12 +58,17 @@ func (s *Service) CreateUpload(ctx context.Context, db bun.IDB, accountID uuid.U return nil, err } - uploadURL, err := s.blobStore.GenerateUploadURL(ctx, node.BlobKey, blob.UploadURLOptions{ - Duration: 1 * time.Hour, - }) - if err != nil { - _ = s.vfs.PermanentlyDeleteNode(ctx, db, node) - return nil, err + var uploadURL string + if s.blobStore.SupportsDirectUpload() { + uploadURL, err = s.blobStore.GenerateUploadURL(ctx, node.BlobKey, blob.UploadURLOptions{ + Duration: 1 * time.Hour, + }) + if err != nil { + _ = s.vfs.PermanentlyDeleteNode(ctx, db, node) + return nil, err + } + } else { + uploadURL = "" } upload := &Upload{