dbc7d6bb2237141fdbea01fff6c265ade6738c57 chmalee Fri Oct 6 13:03:41 2023 -0700 Start on trackHubWizard module diff --git src/hg/hgHubConnect/trackHubWizard.c src/hg/hgHubConnect/trackHubWizard.c new file mode 100644 index 0000000..24fd686 --- /dev/null +++ src/hg/hgHubConnect/trackHubWizard.c @@ -0,0 +1,151 @@ +/* trackHubWizard -- a user interface for creating a track hubs configuration files */ + +/* Copyright (C) 2019 The Regents of the University of California + * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */ + +#include "common.h" +#include "cart.h" +#include "cheapcgi.h" +#include "hdb.h" +#include "hgConfig.h" +#include "md5.h" +#include "trashDir.h" +#include "hgHubConnect.h" +#include "jsHelper.h" +#include "web.h" +#include "wikiLink.h" +#include "customTrack.h" +#include "userdata.h" + +void doTrackHubWizard() +/* Offer an upload form so users can upload all their hub files */ +{ +char *tusdBasePath = cfgOption("tusdBasePath"); +char *tusdPort = cfgOption("tusdPort"); +/* +if (!(tusdPort && tusdBasePath)) + errAbort("tusd not installed or not running"); +*/ +jsIncludeFile("utils.js", NULL); +jsIncludeFile("ajax.js", NULL); +jsIncludeFile("lodash.3.10.0.compat.min.js", NULL); +jsIncludeFile("cart.js", NULL); +jsIncludeFile("tus.min.js", NULL); +jsIncludeFile("hgMyData.js", NULL); +webIncludeResourceFile("../style/bootstrap.min.css"); +webIncludeResourceFile("../style/gb.css"); +puts("<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css\">\n"); +puts("<div id='hubUpload' class='hubList'>\n"); + +puts("<div class='row'>\n"); +puts("<div class='col-md-6'>\n"); +puts("<div class='row'>\n"); +puts("<div class='tabSection'>\n"); +puts("<h4>Create your own hub</h4>\n"); +puts("<p>After choosing files, click \"Create Hub\" to begin uploading the files to our server</p>\n"); +puts("<div class='buttonDiv' id='chooseAndSendFilesRow'>\n"); +puts("<label id='btnForInput' class='button' for=\"uploadedFiles\">Choose files</label>\n"); +puts("</div>\n"); // .buttonDiv +puts("<div id='fileList'></div>\n"); +puts("</div>"); // .tabSection +puts("</div>\n"); // row + +puts("<div class='row'>\n"); +puts("<div class='tabSection'>"); +puts("For information on making track hubs, see the following pages: \n " + "<ul>\n" + "<li><a href='../goldenPath/help/hubQuickStart.html' style='color:#121E9A' target=_blank>Quick Start Guide</a></li>\n" + "<li><a href=\"../goldenPath/help/hgTrackHubHelp.html\" style='color:#121E9A' TARGET=_blank>Track Hub User's Guide</a></li>\n" + "<li><a href=\"../goldenPath/help/hgTrackHubHelp#Hosting\" style='color:#121E9A' target=_blank>Where to Host Your Track Hub</a></li>\n" + "<li><a href=\"../goldenPath/help/trackDb/trackDbHub.html\" style='color:#121E9A' target=_blank>Track Hub Settings Reference</a></li>\n" + "<li><a href=\"../goldenPath/help/publicHubGuidelines.html\" style='color:#121E9A' target=_blank>Guidelines for Submitting a Public Hub</a></li>\n" + "</ul>\n" + "<BR>You may also <a href='../contacts.html' style='color:#121E9A'>contact us</a> if you have any " + "issues or questions on hub development."); +puts("</div>"); // .tabSection +puts("</div>\n"); // col-md-6 +puts("</div>\n"); // row + +puts("<div id='uploadedFilesSection' style=\"display: none\" class='col-md-6 tabSection'>"); +puts("<h4>Your uploaded hubs</h4>"); +webIncludeFile("inc/hgMyData.html"); +//webIncludeResourceFile("../style/gbStatic.css"); +puts("</div>\n"); +puts("</div>\n"); // row +puts("</div>\n"); // row + +jsInlineF("const tusdBasePath=\"%s\";\nconst tusdPort=\"%s\";\n", tusdBasePath, tusdPort); +jsInline("$(document).ready(function() {\nhubCreate.init();\n})"); +puts("</div>"); +} + +char *prepBigData(struct cart *cart, char *fileName, char *binVar, char *fileVar) +{ +fprintf(stderr, "prepping bigData for %s\n", fileName); +//return NULL; +//if (!customTrackIsBigData(fileName)) +// return NULL; +char buf[1024]; +char *retFileName = NULL; +char *cFBin = cartOptionalString(cart, binVar); +char *cF = cartOptionalString(cart, fileVar); +char *offset = NULL; +unsigned long size = 0; +if (cFBin) + { + // cFBin already contains memory offset and size (search for __binary in cheapcgi.c) + safef(buf,sizeof(buf),"memory://%s %s", fileName, cFBin); + char *split[3]; + int splitCount = chopByWhite(cloneString(cFBin), split, sizeof(split)); + if (splitCount > 2) {errAbort("hgCustom: extra garbage in %s", binVar);} + offset = (char *)sqlUnsignedLong(split[0]); + size = sqlUnsignedLong(split[1]); + } +else + { + safef(buf, sizeof(buf),"memory://%s %lu %lu", + fileName, (unsigned long) cF, (unsigned long) strlen(cF)); + offset = (char *)sqlUnsignedLong(cF); + size = (unsigned long)strlen(cF); + } +if (cfgOptionBooleanDefault("storeUserFiles", FALSE)) + { + //dumpStack("prepBigData: fileName = '%s'\n", fileName); + //errAbort("prepBigData: fileName = '%s'\n", fileName); + // figure out if user is logged in: + // 1. if so, save 'fileName', which is really a pointer to memory, to username encoded directory + // 2. Turn buf into a web accessible url to this data so it will be parsed + // as a track correctly + char *userName = (loginSystemEnabled() || wikiLinkEnabled()) ? wikiLinkUserName() : NULL; + if (userName) + { + // storeUserFiles returns a URL to a track + // after sucessfully saving the data into /userdata + retFileName = storeUserFile(userName, fileName, offset, size); + } + } +return retFileName; +} + +#define FILEVAR "userFile__filename" +#define FILEVARBIN "userFile__binary" +void doCreateHub(struct cart *cart) +/* Called asynchronously when the user has submitted some files, return a json response of where + * the files live and the new quota */ +{ +// cheapcgi.c renames form variables as var__filename or var__binary for binary data, why? +char *fileName = cartOptionalString(cart, FILEVAR); +/* +struct hashEl *hel, *helList = hashElListHash(cart->hash); +for (hel = helList; hel != NULL; hel = hel->next) +{ +fprintf(stderr, "hashEl name: '%s', value: '%s'\n", (char *)hel->name, (char *)hel->val); +} +*/ +fprintf(stderr, "fileName is: %s\n", fileName); +fflush(stderr); +char *pathToFile = prepBigData(cart, fileName, FILEVARBIN, FILEVAR); +puts("Content-Type:text/javascript\n"); +printf("{\"status\": \"%s is uploaded to %s\"}\n", cgiOptionalString("userFile__filename"), pathToFile); +fflush(stdout); +}