From 72553a2d8b5fa094a5edd5e6ec15b5125a052016 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Wed, 16 Feb 2022 00:55:04 +0100 Subject: assume and use "$schema" properties in item definitions --- html/install.js | 37 +++++++++++++++++++++---------------- html/item_preview.html | 4 ++++ html/item_preview.js | 12 ++++++++++++ html/repo_query.html | 8 +++++++- html/repo_query.js | 28 ++++++++++++---------------- 5 files changed, 56 insertions(+), 33 deletions(-) (limited to 'html') diff --git a/html/install.js b/html/install.js index 2a72662..7b3f3fe 100644 --- a/html/install.js +++ b/html/install.js @@ -47,8 +47,7 @@ #FROM common/browser.js IMPORT browser #FROM html/DOM_helpers.js IMPORT clone_template, Showable -#FROM common/entities.js IMPORT item_id_string, version_string, get_files, \ - is_valid_version +#FROM common/entities.js IMPORT item_id_string, version_string, get_files #FROM common/misc.js IMPORT sha256_async AS compute_sha256 const coll = new Intl.Collator(); @@ -114,6 +113,19 @@ async function init_work() { new Promise((...cbs) => [work.resolve_cb, work.reject_cb] = cbs)]; } +function _make_url_reg(item_type) { + return new RegExp( + `^https://hydrilla\\.koszko\\.org/schemas/api_${item_type}_description-1\\.([1-9][0-9]*\\.)*schema\\.json$` + ); +} + +const _regexes = {}; + +function item_schema_url_regex(item_type) { + _regexes[item_type] = _regexes[item_type] || _make_url_reg(item_type); + return _regexes[item_type]; +} + function InstallView(tab_id, on_view_show, on_view_hide) { Showable.call(this, on_view_show, on_view_hide); @@ -191,26 +203,19 @@ function InstallView(tab_id, on_view_show, on_view_hide) { "Repository's response is not valid JSON :("); } - if (!is_valid_version(response.json.api_schema_version)) { - var bad_api_ver = ""; - } else if (response.json.api_schema_version > [1]) { - var bad_api_ver = - ` (${version_string(response.json.api_schema_version)})`; - } else { - var bad_api_ver = false; - } + const captype = item_type[0].toUpperCase() + item_type.substring(1); + const reg = item_schema_url_regex(item_type); - if (bad_api_ver !== false) { - const captype = item_type[0].toUpperCase() + item_type.substring(1); - const msg = `${captype} ${item_id_string(id, ver)} was served using unsupported Hydrilla API version${bad_api_ver}. You might need to update Haketilo.`; + if (!response.json["$schema"]) { + const msg = `${captype} ${item_id_string(id, ver)} was served using a nonconforming response format.`; + return work.err(null, msg); + } else if (!reg.test(response.json["$schema"])) { + const msg = `${captype} ${item_id_string(id, ver)} was served using unsupported Hydrilla API version. You might need to update Haketilo.`; return work.err(null, msg); } /* TODO: JSON schema validation should be added here. */ - delete response.json.api_schema_version; - delete response.json.api_schema_revision; - const scripts = item_type === "resource" && response.json.scripts; const files = response.json.source_copyright.concat(scripts || []); diff --git a/html/item_preview.html b/html/item_preview.html index 34ce6e1..356ee62 100644 --- a/html/item_preview.html +++ b/html/item_preview.html @@ -46,6 +46,8 @@

resource preview

+ + ... ... @@ -68,6 +70,8 @@

mapping preview

+ + ... ... diff --git a/html/item_preview.js b/html/item_preview.js index 1da9492..b67455a 100644 --- a/html/item_preview.js +++ b/html/item_preview.js @@ -73,6 +73,12 @@ function resource_preview(resource, preview_object, link_cb=make_file_link) { if (preview_object === undefined) preview_object = clone_template("resource_preview"); + preview_object.conforms_to.innerHTML = ""; + const schema_link = document.createElement("a"); + schema_link.href = resource.$schema; + schema_link.innerText = resource.$schema; + preview_object.conforms_to.append(schema_link); + preview_object.identifier.innerText = resource.identifier; preview_object.long_name.innerText = resource.long_name; preview_object.uuid.innerText = resource.uuid; @@ -104,6 +110,12 @@ function mapping_preview(mapping, preview_object, link_cb=make_file_link) { if (preview_object === undefined) preview_object = clone_template("mapping_preview"); + preview_object.conforms_to.innerHTML = ""; + const schema_link = document.createElement("a"); + schema_link.href = mapping.$schema; + schema_link.innerText = mapping.$schema; + preview_object.conforms_to.append(schema_link); + preview_object.identifier.innerText = mapping.identifier; preview_object.long_name.innerText = mapping.long_name; preview_object.uuid.innerText = mapping.uuid; diff --git a/html/repo_query.html b/html/repo_query.html index b9c9269..67158cc 100644 --- a/html/repo_query.html +++ b/html/repo_query.html @@ -61,6 +61,10 @@ background-color: #f0f0f0; } + .repo_query_info_div { + margin: 0.5em; + } + .repo_query_result_li { margin: 0; padding: 0.2em; @@ -134,7 +138,9 @@
- Querying repository... +
+ Querying repository... +
    diff --git a/html/repo_query.js b/html/repo_query.js index a4b8890..d2f0e9b 100644 --- a/html/repo_query.js +++ b/html/repo_query.js @@ -45,8 +45,7 @@ #FROM common/browser.js IMPORT browser #FROM html/DOM_helpers.js IMPORT clone_template, Showable -#FROM common/entities.js IMPORT item_id_string, version_string, \ - is_valid_version +#FROM common/entities.js IMPORT item_id_string, version_string #FROM html/install.js IMPORT InstallView const coll = new Intl.Collator(); @@ -69,6 +68,10 @@ function ResultEntry(repo_entry, mapping_ref) { this.install_but.addEventListener("click", cb); } +const query_schema_url_regex = new RegExp( + "^https://hydrilla\\.koszko\\.org/schemas/api_query_result-1\\.([1-9][0-9]*\\.)*schema\\.json$" +); + function RepoEntry(query_view, repo_url) { Object.assign(this, clone_template("repo_query_single_repo")); Object.assign(this, {query_view, repo_url}); @@ -91,17 +94,10 @@ function RepoEntry(query_view, repo_url) { if ("error_json" in response) throw "Repository's response is not valid JSON :("; - if (!is_valid_version(response.json.api_schema_version)) { - var bad_api_ver = ""; - } else if (response.json.api_schema_version > [1]) { - var bad_api_ver = - ` (${version_string(response.json.api_schema_version)})`; - } else { - var bad_api_ver = false; - } - - if (bad_api_ver !== false) - throw `Results were served using unsupported Hydrilla API version${bad_api_ver}. You might need to update Haketilo.`; + if (!response.json["$schema"]) + throw "Results were served using a nonconforming response format."; + if (!query_schema_url_regex.test(response.json["$schema"])) + throw "Results were served using unsupported Hydrilla API version. You might need to update Haketilo."; /* TODO: here we should perform JSON schema validation! */ @@ -114,7 +110,7 @@ function RepoEntry(query_view, repo_url) { try { var results = await query_results(); } catch(e) { - this.info_span.innerText = e; + this.info_div.innerText = e; return; } @@ -122,12 +118,12 @@ function RepoEntry(query_view, repo_url) { if (this.result_entries.length > 0) { this.results_list.classList.remove("hide"); - this.info_span.remove(); + this.info_div.remove(); const to_append = this.result_entries.map(re => re.main_li); this.results_list.append(...to_append); } else { - this.info_span.innerText = "No results :("; + this.info_div.innerText = "No results :("; } } -- cgit v1.2.3