Skip to content
Snippets Groups Projects

Populate Mirador catalog with files from /data

Merged Loïs Poujade requested to merge 8-populate-manifest-catalog into main
All threads resolved!
2 files
+ 31
31
Compare changes
  • Side-by-side
  • Inline

Files

+ 30
30
@@ -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}`);
});
}
}
Loading