e8ffc5e45bd8e8de9f1c78347ea6b11fd4817a40
chmalee
  Mon Dec 2 12:37:53 2024 -0800
Generate api keys for each user and store them in hgcentral.hubSpaceKeys

diff --git src/hg/js/hgMyData.js src/hg/js/hgMyData.js
index 46b6a8d..173738c 100644
--- src/hg/js/hgMyData.js
+++ src/hg/js/hgMyData.js
@@ -1,29 +1,86 @@
 /* jshint esnext: true */
 var debugCartJson = true;
 
 function prettyFileSize(num) {
     if (!num) {return "n/a";}
     if (num < (1000 * 1024)) {
         return `${(num/1000).toFixed(1)}KB`;
     } else if (num < (1000 * 1000 * 1024)) {
         return `${((num/1000)/1000).toFixed(1)}MB`;
     } else {
         return `${(((num/1000)/1000)/1000).toFixed(1)}GB`;
     }
 }
 
+function generateApiKey() {
+    let apiKeyInstr = document.getElementById("apiKeyInstructions");
+    let apiKeyDiv = document.getElementById("apiKey");
+
+    if (!document.getElementById("spinner")) {
+        let spinner = document.createElement("i");
+        spinner.id = "spinner";
+        spinner.classList.add("fa", "fa-spinner", "fa-spin");
+        document.getElementById("generateApiKey").after(spinner);
+    }
+
+    let handleSuccess = function(reqObj) {
+        apiKeyDiv.textContent = reqObj.apiKey;
+        apiKeyInstr.style.display = "block";
+        let revokeDiv= document.getElementById("revokeDiv");
+        revokeDiv.style.display = "block";
+        document.getElementById("spinner").remove();
+
+        // remove the word 'already' from the message if we have just re-generated a key
+        let refreshSpan = document.getElementById("removeOnGenerate");
+        if (refreshSpan) {
+            refreshSpan.style.display = "none";
+        }
+    };
+
+    let cartData = {generateApiKey: {}};
+    cart.setCgi("hgHubConnect");
+    cart.send(cartData, handleSuccess);
+    cart.flush();
+}
+
+function revokeApiKeys() {
+    let apiKeyInstr = document.getElementById("apiKeyInstructions");
+    let apiKeyDiv = document.getElementById("apiKey");
+
+    if (!document.getElementById("spinner")) {
+        let spinner = document.createElement("i");
+        spinner.id = "spinner";
+        spinner.classList.add("fa", "fa-spinner", "fa-spin");
+        document.getElementById("revokeApiKeys").after(spinner);
+    }
+
+    let handleSuccess = function(req) {
+        apiKeyInstr.style.display = "none";
+        document.getElementById("spinner").remove();
+        let generateDiv = document.getElementById("generateDiv");
+        generateDiv.style.display = "block";
+        let revokeDiv = document.getElementById("revokeDiv");
+        revokeDiv.style.display = "none";
+    };
+
+    let cartData = {revokeApiKey: {}};
+    cart.setCgi("hgHubConnect");
+    cart.send(cartData, handleSuccess);
+    cart.flush();
+}
+
 // make our Uppy instance:
 const uppy = new Uppy.Uppy({
     debug: true,
     allowMultipleUploadBatches: false,
     onBeforeUpload: (files) => {
         // set all the fileTypes and genomes from their selects
         let doUpload = true;
         for (let [key, file] of Object.entries(files)) {
             if (!file.meta.genome) {
                 uppy.info(`Error: No genome selected for file ${file.name}!`, 'error', 2000);
                 doUpload = false;
                 continue;
             } else if  (!file.meta.fileType) {
                 uppy.info(`Error: File type not supported, please rename file: ${file.name}!`, 'error', 2000);
                 doUpload = false;