This is an automated email from the ASF dual-hosted git repository.

nchung pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-sdap-nexus.git


The following commit(s) were added to refs/heads/master by this push:
     new 864e2bb  SDAP-363: Update SwaggerUI to display list of available 
datasets dynamically (#149)
864e2bb is described below

commit 864e2bb786e20ca08f313073b53e56375ceb6bae
Author: joshgarde <[email protected]>
AuthorDate: Tue Jan 18 10:38:00 2022 -0800

    SDAP-363: Update SwaggerUI to display list of available datasets 
dynamically (#149)
    
    * Initial work
    
    * Switch JsonSchema_string to original JsonSchemaForm
    
    * Populate insitu fields
    
    * Fix unpopulated dsMap issue
    
    * Fix /subsubset spec
    
    * Fix totaling
---
 analysis/webservice/apidocs/dataset-populate.js | 99 +++++++++++++++++++++++++
 analysis/webservice/apidocs/index.html          |  6 +-
 analysis/webservice/apidocs/openapi.yml         | 16 ++++
 3 files changed, 119 insertions(+), 2 deletions(-)

diff --git a/analysis/webservice/apidocs/dataset-populate.js 
b/analysis/webservice/apidocs/dataset-populate.js
new file mode 100644
index 0000000..6dbbe17
--- /dev/null
+++ b/analysis/webservice/apidocs/dataset-populate.js
@@ -0,0 +1,99 @@
+function DatasetPopulatePlugin(system) {
+  const DS_PATH = '/domslist'
+  const ACTION_UPDATE_DATASETS = 'UPDATE_DATASETS'
+  const ACTION_UPDATE_ERROR = 'UPDATE_ERROR'
+
+  async function loadDatasets() {
+    try {
+      let response = await fetch(DS_PATH)
+      if (!response.ok) {
+        system.dsPopulateActions.updateError(true)
+        console.error(`[DatasetPopulate] Unable to load dataset list from: 
${DS_PATH}; Status: ${response.status}`)
+      }
+
+      let results = await response.json()
+      let satellite = results.data.satellite
+      let insitu = results.data.insitu
+
+      let total = 0
+      let datasets = {
+        satellite: [],
+        insitu: []
+      }
+
+      for (const ds of satellite) {
+        datasets['satellite'].push(ds.shortName)
+        total++
+      }
+
+      for (const ds of insitu) {
+        datasets['insitu'].push(ds.name)
+        total++
+      }
+
+      datasets['satellite'].sort()
+      datasets['insitu'].sort()
+
+      system.dsPopulateActions.updateDatasets(datasets)
+      console.debug(`[DatasetPopulate] Lists populated; count: ${total}`)
+    } catch (err) {
+      system.dsPopulateActions.updateError(true)
+      console.error(`[DatasetPopulate] Error retreiving dataset list: 
${err.message}`);
+    }
+  }
+
+  return {
+    statePlugins: {
+      dsPopulate: {
+        actions: {
+          updateDatasets: (list) => {
+            return {
+              type: ACTION_UPDATE_DATASETS,
+              payload: list
+            }
+          },
+          updateError: (error) => {
+            return {
+              type: ACTION_UPDATE_ERROR,
+              payload: error
+            }
+          }
+        },
+        reducers: {
+          [ACTION_UPDATE_DATASETS]: (state, action) => state.set('datasets', 
action.payload),
+          [ACTION_UPDATE_ERROR]: (state, action) => state.set('error', 
action.payload)
+        },
+        selectors: {
+          datasets: (state) => state.get('datasets'),
+          hasError: (state) => state.get('error')
+        }
+      }
+    },
+    wrapComponents: {
+      JsonSchemaForm: (Original, system) => (props) => {
+        let dsPopulate = props.schema.get('x-dspopulate') ? 
props.schema.get('x-dspopulate') : false
+
+        if (!dsPopulate || system.dsPopulateSelectors.hasError())
+          return system.React.createElement(Original, props)
+
+        let datasetMap = system.dsPopulateSelectors.datasets()
+        if (!datasetMap)
+          return system.React.createElement(Original, props) 
+
+        let datasets = []
+        for (const datasetName of dsPopulate.toArray()) {
+          datasets.push(...datasetMap[datasetName])
+        }
+
+        datasets.sort()
+
+        props.schema = props.schema.set('enum', datasets)
+        return system.React.createElement(Original, props)
+      }
+    },
+    afterLoad: (system) => {
+      system.dsPopulateActions.updateError(false)
+      loadDatasets()
+    }
+  }
+}
\ No newline at end of file
diff --git a/analysis/webservice/apidocs/index.html 
b/analysis/webservice/apidocs/index.html
index f899b84..82ce1f0 100644
--- a/analysis/webservice/apidocs/index.html
+++ b/analysis/webservice/apidocs/index.html
@@ -31,8 +31,9 @@
   <body>
     <div id="swagger-ui"></div>
 
-    <script 
src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.52.0/swagger-ui-bundle.min.js";
 
integrity="sha512-5Om3SqdVpHoZ1gYajhWvokmdj4Qr3YnMtCkgxOxraWo5tU4L40tyMHG+ZDmOS8AB+oEtF/0mA3FymbkYCOdZ7Q=="
 crossorigin="anonymous" referrerpolicy="no-referrer"></script>
+    <script 
src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.1.3/swagger-ui-bundle.min.js";
 
integrity="sha512-yNSFkZpMlHmyfyHN1cNSq7+jguocLrAndVKs0bWHvBiH6gJNmJ89E1x270xH6Or3aXtgBgs+IJ8HvBMIPpPIzw=="
 crossorigin="anonymous" referrerpolicy="no-referrer"></script>
     <script 
src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.52.0/swagger-ui-standalone-preset.min.js";
 
integrity="sha512-Pa5TWsES4T1o6gHBRqi9I5+quIPpDBjThcQLO7rvvaNYquPvAntd0Gtm7nOWGMQKY5ds6PeqccVBC6KAHqN+fQ=="
 crossorigin="anonymous" referrerpolicy="no-referrer"></script>
+    <script src="dataset-populate.js"></script>
     <script>
     window.onload = function() {
       // Begin Swagger UI call region
@@ -45,7 +46,8 @@
           SwaggerUIStandalonePreset
         ],
         plugins: [
-          SwaggerUIBundle.plugins.DownloadUrl
+          SwaggerUIBundle.plugins.DownloadUrl,
+          DatasetPopulatePlugin
         ],
         syntaxHighlight: {
           activated: false
diff --git a/analysis/webservice/apidocs/openapi.yml 
b/analysis/webservice/apidocs/openapi.yml
index f68f1c2..8a7392b 100644
--- a/analysis/webservice/apidocs/openapi.yml
+++ b/analysis/webservice/apidocs/openapi.yml
@@ -29,6 +29,8 @@ paths:
           required: true
           schema:
             type: string
+            x-dspopulate:
+             - satellite
           example: 
avhrr-l4-glob-v2-daily-ncei-ghrsst-sstblend-avhrr-oi-glob-v020-fv020
         - in: query
           name: secondary
@@ -40,6 +42,9 @@ paths:
           required: true
           schema:
             type: string
+            x-dspopulate:
+             - satellite
+             - insitu
           example: icoads
         - in: query
           name: startTime
@@ -184,6 +189,8 @@ paths:
           required: false
           schema:
             type: string
+            x-dspopulate:
+             - satellite
           example: MAVHRR_OI_L4_GHRSST_NCEI
         - in: query
           name: insitu
@@ -193,6 +200,8 @@ paths:
           required: false
           schema:
             type: string
+            x-dspopulate:
+             - insitu
           example: icoads,samos,spurs,spurs2
         - in: query
           name: startTime
@@ -302,6 +311,8 @@ paths:
           required: true
           schema:
             type: string
+            x-dspopulate:
+             - satellite
           example: 
avhrr-l4-glob-v2-daily-ncei-ghrsst-sstblend-avhrr-oi-glob-v020-fv020
         - in: query
           name: startTime
@@ -425,6 +436,8 @@ paths:
           required: true
           schema:
             type: string
+            x-dspopulate:
+              - insitu
           example: samos
         - in: query
           name: startTime
@@ -531,6 +544,9 @@ paths:
           required: true
           schema:
             type: string
+            x-dspopulate:
+             - satellite
+             - insitu
           example: MUR25-JPL-L4-GLOB-v04.2
         - in: query
           name: minLat

Reply via email to