Skip to content
Snippets Groups Projects
Verified Commit f39e6396 authored by Loïs Poujade's avatar Loïs Poujade
Browse files

Handle arbitrary depth, not only first level

parent 4c5b39c0
Branches
No related tags found
1 merge request!7Populate Mirador catalog with files from /data
......@@ -6,48 +6,48 @@
*/
export default {
get_initial_catalog: function(url = '/data/') {
// url: relative or absolute path
// depth: maximum depth for search of .json (use 0 to search only at root, 1 for first-level folders, etc)
// subfolder: only for internal usage
get_initial_catalog: function(url = '/data', depth=1, subfolder='') {
if (depth < 0) {
return;
}
const req_init = {headers: {'Accept': 'application/json'}};
return fetch(url, req_init)
// fetch root ressources & try to parse it to json
return fetch(`${url}/${subfolder}`, req_init)
.then(response => {
if (!response.ok)
throw new Error(`failed to list manifests from '${document.location}/data', http response code: ${reponse.status}`);
if (!response.ok) {
throw new Error(`failed to list manifests from ${url}, http response code: ${reponse.status}`);
}
return response.json();
})
.then(async (response_json) => {
let items = [['/', response_json]];
// handle caddy response, which is like:
// [ {name: file1, props: ...}, {name: file2, props: ...}, {name: dir1, props: ...} ]
if (typeof(response_json[0].name) != 'undefined')
// handling caddy response, which is like
// [{name: "first.json", ...}, {name: "second.json", ...}, ...]
if (response_json.length >= 1 && response_json[0].hasOwnProperty('name')) {
response_json = response_json.map(e => e.name.replace(/\/$/, ''));
}
// try to GET on "folders", parse responses to json,
// and return them as an array [folder_name, json_responses_array]
// (assuming files not ending in .json are folder; errors are ignored)
let res = await Promise.allSettled(response_json
// assume all files which don't end in .json are folder
let subfolders_content = await Promise.allSettled(response_json
.filter(e => !e.endsWith('.json'))
.map(folder => fetch(url + folder, req_init)
.then(e => e.json())
.then(e => [folder, e])
)
.map(folder => this.get_initial_catalog(url, depth - 1, folder))
);
// extract only successful responses values
items = items.concat(res
.filter(p => p.status === "fulfilled")
.map(p => p.value));
// filter files from current folder
// & append files from subfolders
let items = response_json
.filter(e => e.endsWith('.json'))
.concat(subfolders_content
// get only successfull queries & with a content
.filter(p => p.status === "fulfilled" && p.value != null)
.map(p => p.value)
).flat();
// return each entry ending in .json with current location,
// and folder if needed
// prepend with original url only if we are at the root folder,
// else prepend only with current folder
return items
.flatMap(([folder, entries]) => entries
.map(e => typeof(e.name) != 'undefined' ? e.name : e) // handling caddy response
.filter(e => e.endsWith('.json'))
.map(e => {
return {'manifestId': document.location + 'data' + (folder == '/' ? '/' : `/${folder}/`) + e};
})
);
.map(e => subfolder == '' ? `${url}/${e}` : `${subfolder}/${e}`);
});
}
}
......@@ -37,6 +37,6 @@ LocalCatalog.get_initial_catalog()
catalog.forEach(manifest =>
// setTimeout avoid UI freeze
setTimeout(() => store.dispatch(actions.addResource(manifest.manifestId)), 0)
setTimeout(() => store.dispatch(actions.addResource(manifest)), 0)
);
})
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment