Skip to content

Commit dc05c1f

Browse files
Merge pull request #493 from VH-Lab/feature-update-upload-files-for-dataset-documents
Update `uploadFilesForDatasetDocuments` to Conditionally Upload and Return Status
2 parents 7b7b235 + 73f4a12 commit dc05c1f

File tree

3 files changed

+55
-7
lines changed

3 files changed

+55
-7
lines changed

.github/badges/code_issues.svg

Lines changed: 1 addition & 1 deletion
Loading

.github/badges/tests.svg

Lines changed: 1 addition & 1 deletion
Loading
Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
function uploadFilesForDatasetDocuments(cloudDatasetId, ndiDataset, dataset_documents, options)
1+
function [success, message] = uploadFilesForDatasetDocuments(cloudDatasetId, ndiDataset, dataset_documents, options)
22
% uploadFilesForDatasetDocuments - Upload a set of files belonging to a set of dataset documents
33
arguments
44
cloudDatasetId (1,1) string
@@ -7,13 +7,44 @@ function uploadFilesForDatasetDocuments(cloudDatasetId, ndiDataset, dataset_docu
77
options.Verbose (1,1) logical = true
88
options.FileUploadStrategy (1,1) string ...
99
{mustBeMember(options.FileUploadStrategy, ["serial", "batch"])} = "batch"
10+
options.updateMissing (1,1) logical = true
1011
end
1112

13+
success = true;
14+
message = '';
15+
1216
file_manifest = ...
1317
ndi.database.internal.list_binary_files(...
1418
ndiDataset, dataset_documents, options.Verbose);
1519
[file_manifest(:).is_uploaded] = deal(false);
1620

21+
if options.updateMissing
22+
[b, answer] = ndi.cloud.api.datasets.getDataset(cloudDatasetId);
23+
if b && isfield(answer, 'files')
24+
remote_files = containers.Map();
25+
for i=1:numel(answer.files)
26+
remote_files(answer.files(i).uid) = 1;
27+
end
28+
29+
files_to_upload = struct('uid',{},'bytes',{},'file_path',{},'is_uploaded',{});
30+
for i=1:numel(file_manifest)
31+
if ~isKey(remote_files, file_manifest(i).uid)
32+
files_to_upload(end+1) = file_manifest(i);
33+
end
34+
end
35+
file_manifest = files_to_upload;
36+
else
37+
success = false;
38+
message = 'Could not retrieve remote dataset file list.';
39+
return;
40+
end
41+
end
42+
43+
if isempty(file_manifest)
44+
message = 'All files are already on the remote.';
45+
return;
46+
end
47+
1748
totalSizeKb = sum([file_manifest.bytes]) / 1e3;
1849

1950
switch options.FileUploadStrategy
@@ -23,13 +54,30 @@ function uploadFilesForDatasetDocuments(cloudDatasetId, ndiDataset, dataset_docu
2354
app.addBar('Label','Uploading document-associated binary files','tag',uuid,'Auto',true);
2455
for i=1:numel(file_manifest)
2556
if file_manifest(i).is_uploaded==false
26-
[success,uploadURL]=ndi.cloud.api.files.getFileUploadURL(cloudDatasetId,file_manifest(i).uid);
27-
if ~success, warning('Failed to get upload URL'); continue; end
28-
[~] = ndi.cloud.api.files.putFiles(uploadURL,file_manifest(i).file_path);
57+
[url_success,uploadURL]=ndi.cloud.api.files.getFileUploadURL(cloudDatasetId,file_manifest(i).uid);
58+
if ~url_success
59+
warning('Failed to get upload URL');
60+
if success
61+
message = ['Failed to get upload URL for ' file_manifest(i).uid];
62+
end
63+
success = false;
64+
continue;
65+
end
66+
[put_success] = ndi.cloud.api.files.putFiles(uploadURL,file_manifest(i).file_path);
67+
if ~put_success
68+
if success
69+
message = ['Failed to upload file ' file_manifest(i).uid];
70+
end
71+
success = false;
72+
end
2973
end
3074
app.updateBar(uuid,i/numel(file_manifest));
3175
end
3276
case "batch"
33-
[~, ~] = ndi.cloud.upload.zipForUpload(ndiDataset, file_manifest, totalSizeKb, cloudDatasetId);
77+
[batch_success, batch_message] = ndi.cloud.upload.zipForUpload(ndiDataset, file_manifest, totalSizeKb, cloudDatasetId);
78+
if ~batch_success
79+
success = false;
80+
message = batch_message;
81+
end
3482
end
3583
end

0 commit comments

Comments
 (0)