2f0d3fa3d2bcbf3e23e834ca68565c470f73939d chmalee Mon Oct 21 12:32:08 2024 -0700 Back end for auto-generating a hub with every user upload done diff --git src/hg/hgHubConnect/trackHubWizard.c src/hg/hgHubConnect/trackHubWizard.c index ed4d0f3..635b358 100644 --- src/hg/hgHubConnect/trackHubWizard.c +++ src/hg/hgHubConnect/trackHubWizard.c @@ -28,89 +28,74 @@ char *fileName = prefixUserFile(userName, cgiEncodeFull(cgiFileName)); if (fileExists(fileName)) { fprintf(stderr, "deleting file: '%s'\n", fileName); removeFileForUser(fileName, userName); fflush(stderr); } else { fprintf(stderr, "file '%s' does not exist\n", fileName); fflush(stderr); } } void removeHubDir(char *userName, char *cgiFileName) -/* Remove one single file for userName */ +/* Remove one single hub for userName */ { -char *fileName = prefixUserFile(userName, cgiEncodeFull(cgiFileName)); -if (fileExists(fileName)) +char *hubDir = prefixUserFile(userName, cgiEncodeFull(cgiFileName)); +if (isDirectory(hubDir)) { - fprintf(stderr, "deleting file: '%s'\n", fileName); - removeHubForUser(fileName, userName); + fprintf(stderr, "deleting directory: '%s'\n", hubDir); + removeHubForUser(hubDir, userName); fflush(stderr); } } void doRemoveFile(struct cartJson *cj, struct hash *paramHash) /* Process the request to remove a file */ { char *userName = getUserName(); if (userName) { - struct jsonElement *deleteJson = hashFindVal(paramHash, "fileNameList"); - //struct jsonWrite *errors = jsonWriteNew(); - // TODO: Check request is well-formed - char *fname = ((struct jsonElement *)(deleteJson->val.jeList->val))->val.jeString; - boolean isHub = sameString("hub", ((struct jsonElement *)(deleteJson->val.jeList->next->val))->val.jeString); + // our array of objects, each object represents a track file + struct jsonElement *deleteJson = hashFindVal(paramHash, "fileList"); + struct slRef *f, *fileList = deleteJson->val.jeList; jsonWriteListStart(cj->jw, "deletedList"); - if (isHub) - removeHubDir(userName, fname); - else - removeOneFile(userName, fname); - jsonWriteString(cj->jw, NULL, fname); + for (f = fileList; f != NULL; f = f->next) + { + struct jsonElement *fileObj = (struct jsonElement *)f->val; + char *fileName = jsonStringField(fileObj, "fileName"); + //char *fileType = jsonStringField(fileObj, "fileType"); + //struct slName *hubList = slNameListFromComma(jsonStringField(fileObj, "hubNameList")); + removeOneFile(userName, fileName); + jsonWriteString(cj->jw, NULL, fileName); + } jsonWriteListEnd(cj->jw); + /* + //for now don't worry about this: + //if (isHub) + // removeHubDir(userName, fname); + */ } } void doMoveFile(struct cartJson *cj, struct hash *paramHash) /* Move a file to a new hub */ { } -static void writeHubText(char *path, char *userName, char *encodedHubName, char *hubName, char *db) -/* Create a hub.txt file, optionally creating the directory holding it */ -{ -int oldUmask = 00; -oldUmask = umask(0); -makeDirsOnPath(path); -// restore umask -umask(oldUmask); -// now make the hub.txt with some basic information -char *hubFile = catTwoStrings(path, "/hub.txt"); -FILE *f = mustOpen(hubFile, "w"); -//fprintf(stderr, "would write \"hub %s\nemail %s\nshortLabel %s\nlongLabel %s\nuseOneFile on\n\ngenome %s\n\n\" to %s", hubName, emailForUserName(userName), hubName, hubName, db, hubFile); -fprintf(f, "hub %s\n" - "email %s\n" - "shortLabel %s\n" - "longLabel %s\n" - "useOneFile on\n\n" - "genome %s\n\n", - encodedHubName, emailForUserName(userName), hubName, hubName, db); -carefulClose(&f); -} - void doCreateHub(struct cartJson *cj, struct hash *paramHash) /* Make a new hub.txt with the parameters from the JSON request */ { char *userName = getUserName(); if (userName) { struct jsonWrite *errors = jsonWriteNew(); // verify the arguments: (void)cartJsonRequiredParam(paramHash, "createHub", errors, "doCreateHub"); // paramHash is an object with everything necessary to create a hub: name and assembly char *db = jsonStringVal(hashFindVal(paramHash, "db"), "db"); char *name = jsonStringVal(hashFindVal(paramHash, "name"), "name"); char *encodedName = cgiEncodeFull(name); fprintf(stderr, "creating hub '%s' for db '%s'\n", encodedName, db); fflush(stderr); @@ -147,68 +132,72 @@ struct jsonWrite *jw = jsonWriteNew(); // the JSON to return for the client javascript jsonWriteObjectStart(jw, NULL); if (userName) { // the url for this user: jsonWriteString(jw, "userUrl", webDataDir(userName)); jsonWriteListStart(jw, "fileList"); struct hubSpace *file, *fileList = listFilesForUser(userName); for (file = fileList; file != NULL; file = file->next) { jsonWriteObjectStart(jw, NULL); cgiDecodeFull(file->fileName, file->fileName, strlen(file->fileName)); jsonWriteString(jw, "fileName", file->fileName); jsonWriteNumber(jw, "fileSize", file->fileSize); jsonWriteString(jw, "fileType", file->fileType); - jsonWriteString(jw, "hub", ""); + jsonWriteString(jw, "hub", file->hubNameList); jsonWriteString(jw, "genome", file->db); jsonWriteString(jw, "lastModified", file->lastModified); jsonWriteString(jw, "uploadTime", file->creationTime); jsonWriteObjectEnd(jw); } jsonWriteListEnd(jw); + /* jsonWriteListStart(jw, "hubList"); struct userHubs *hub, *hubList = listHubsForUser(userName); for (hub = hubList; hub != NULL; hub = hub->next) { jsonWriteObjectStart(jw, NULL); cgiDecodeFull(hub->hubName, hub->hubName, strlen(hub->hubName)); jsonWriteString(jw, "hubName", hub->hubName); jsonWriteString(jw, "genome", hub->genome); + jsonWriteNumber(jw, "lastModified", getHubLatestTime(hub)); jsonWriteObjectEnd(jw); } jsonWriteListEnd(jw); + */ } jsonWriteObjectEnd(jw); +jsInlineF("var isLoggedIn = %s\n", getUserName() ? "true" : "false"); jsInlineF("var userFiles = %s;\n", dyStringCannibalize(&jw->dy)); jsonWriteFree(&jw); } void doTrackHubWizard(char *database) /* Offer an upload form so users can upload all their hub files */ { jsIncludeFile("utils.js", NULL); jsIncludeFile("ajax.js", NULL); jsIncludeFile("lodash.3.10.0.compat.min.js", NULL); jsIncludeFile("cart.js", NULL); jsIncludeFile("tus.js", NULL); jsIncludeFile("hgMyData.js", NULL); puts("<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css\">\n"); puts("<link rel=\"stylesheet\" type=\"text/css\" " "href=\"https://cdn.datatables.net/2.1.3/css/dataTables.dataTables.min.css\">\n"); puts("<script type=\"text/javascript\" " "src=\"https://cdn.datatables.net/2.1.3/js/dataTables.min.js\"></script>"); puts("<link rel=\"stylesheet\" type=\"text/css\" " "href=\"https://cdn.datatables.net/buttons/3.1.1/css/buttons.dataTables.min.css\">\n"); puts("<script type=\"text/javascript\" " "src=\"https://cdn.datatables.net/buttons/3.1.1/js/dataTables.buttons.min.js\"></script>"); // the skeleton HTML: webIncludeFile("inc/hgMyData.html"); webIncludeResourceFile("hgMyData.css"); // get the current files stored for this user outFilesForUser(); -jsInlineF("\nvar cartDb=\"%s %s\";\n", hGenome(database), trackHubSkipHubName(database)); +jsInlineF("\nvar cartDb=\"%s %s\";\n", trackHubSkipHubName(hGenome(database)), database); jsInline("$(document).ready(function() {\nhubCreate.init();\n})"); puts("</div>"); }