Skip to content

Commit a6421dd

Browse files
committed
WIP files: implement RemoteTransfer
1 parent ea4b1b1 commit a6421dd

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

invenio_records_resources/services/files/transfer.py

+43
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,47 @@ def set_file_content(self, record, file, file_key, stream, content_length):
123123
super().set_file_content(record, file, file_key, stream, content_length)
124124

125125

126+
class RemoteTransfer(BaseTransfer):
127+
"""Remote transfer."""
128+
129+
def __init__(self, **kwargs):
130+
"""Constructor."""
131+
super().__init__(TransferType.REMOTE, **kwargs)
132+
133+
def init_file(self, record, file_metadata):
134+
"""Initialize a file."""
135+
uri = file_metadata.pop("uri", None)
136+
if not uri:
137+
raise Exception("`uri` is required for remote files.")
138+
139+
file = record.files.create(
140+
key=file_metadata.pop("key"),
141+
obj={
142+
"file": {
143+
"uri": uri,
144+
"storage_class": "R",
145+
# TODO: We should accept size and checksum, so that we could verify
146+
# it below on commit.
147+
"size": None,
148+
"checksum": None,
149+
}
150+
},
151+
data=file_metadata,
152+
)
153+
154+
return file
155+
156+
def set_file_content(self, *args, **kwargs):
157+
"""Do nothing since it's a remote file."""
158+
pass
159+
160+
def commit_file(self, record, file_key):
161+
"""Commit a file."""
162+
# TODO: Try to verify (or populate) the size and checksum in a
163+
# lightweight fashion (e.g. via a HEAD request to the remote)
164+
record.files.commit(file_key)
165+
166+
126167
class FetchTransfer(BaseTransfer):
127168
"""Fetch transfer."""
128169

@@ -171,6 +212,8 @@ def get_transfer(cls, file_type, **kwargs):
171212
"""Get transfer type."""
172213
if file_type == TransferType.FETCH:
173214
return FetchTransfer(**kwargs)
215+
elif TransferType.REMOTE:
216+
return RemoteTransfer(**kwargs)
174217
else: # default to local
175218
return LocalTransfer(**kwargs)
176219

0 commit comments

Comments
 (0)