UNPKG

ali-flmngr-server-fixed

Version:

> Node.js Backend for Flmngr file manager

188 lines (187 loc) 8.51 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ActionUploadCommit = void 0; const AActionUploadId_1 = require("../action/AActionUploadId"); const RespOk_1 = require("../action/resp/RespOk"); const MessageException_1 = require("../MessageException"); const Message_1 = require("../action/resp/Message"); const fsx = __importStar(require("fs-extra")); const RespUploadCommit_1 = require("../action/resp/RespUploadCommit"); const FileUploaded_1 = require("../file/FileUploaded"); const RespFail_1 = require("../action/resp/RespFail"); class ActionUploadCommit extends AActionUploadId_1.AActionUploadId { constructor() { super(...arguments); this.filesCommited = []; } getName() { return "uploadCommit"; } validateSize(size, sizeName) { size["enlarge"] = this.validateBoolean(size["enlarge"], sizeName === "preview"); size["width"] = this.validateInteger(size["width"], 0); size["height"] = this.validateInteger(size["height"], 0); } validateSizes(req) { if (req["sizes"] == null) { req["sizes"] = {}; } else { let sizesNames = ["full", "preview"]; for (let i = 0; i < sizesNames.length; i++) if (sizesNames[i] in req["sizes"]) this.validateSize(req["sizes"][sizesNames[i]], sizesNames[i]); } } normalizeNoEndSeparator(dir) { if (dir.indexOf("..") > -1) return null; if (dir.length > 0 && dir.substr(0, 1) === "/") dir = dir.substr(1); return dir; } /* public async run(request: Req): Promise<RespOk> { return new Promise<RespOk>( (resolve, reject) => { } ); } */ run(request, onFinish) { let req = request; this.validateUploadId(req); this.validateSizes(req); req["doCommit"] = this.validateBoolean(req["doCommit"], true); req["autoRename"] = this.validateBoolean(req["autoRename"], false); req["dir"] = this.validateString(req["dir"], ""); if (this.normalizeNoEndSeparator(req["dir"]) == null) throw new MessageException_1.MessageException(Message_1.Message.createMessage(Message_1.Message.DIR_DOES_NOT_EXIST, req["dir"])); req["dir"] = this.normalizeNoEndSeparator(req["dir"]) + "/"; let dir = this.m_config.getBaseDir() + req["dir"]; if (!fsx.existsSync(dir)) throw new MessageException_1.MessageException(Message_1.Message.createMessage(Message_1.Message.DIR_DOES_NOT_EXIST, req["dir"])); if (req["files"] == null || req["files"].length === 0) throw new MessageException_1.MessageException(Message_1.Message.createMessage(Message_1.Message.FILES_NOT_SET)); let filesToCommit = []; for (let i = 0; i < req["files"].length; i++) { let fileDef = req["files"][i]; if (fileDef["name"] == null) throw new MessageException_1.MessageException(Message_1.Message.createMessage(Message_1.Message.MALFORMED_REQUEST)); if (fileDef["newName"] == null) fileDef["newName"] = fileDef["name"]; let file = new FileUploaded_1.FileUploaded(this.m_config, req["uploadId"], fileDef["name"], fileDef["newName"]); filesToCommit.push(file); if (!file.isImage() && Object.keys(req["sizes"]).length !== 0) file.addCustomError(Message_1.Message.createMessage(Message_1.Message.FILE_IS_NOT_IMAGE)); } // Check there are no equal names for (let i = 0; i < filesToCommit.length; i++) { let name = filesToCommit[i].getNewName(); for (let j = 0; j < filesToCommit.length; j++) { let name2 = filesToCommit[j].getNewName(); if (i !== j && name === name2) { filesToCommit[i].addCustomError(Message_1.Message.createMessage(Message_1.Message.DUPLICATE_NAME)); break; } } } // Check files for errors for (let i = 0; i < filesToCommit.length; i++) { let file = filesToCommit[i]; file.checkForErrors(true); if (!req["autoRename"]) file.checkForConflicts(req["dir"]); } let filesToCommitWithErrors = []; for (let i = 0; i < filesToCommit.length; i++) if (filesToCommit[i].getErrors().length > 0) filesToCommitWithErrors.push(filesToCommit[i].getData()); if (filesToCommitWithErrors.length > 0) throw new MessageException_1.MessageException(Message_1.Message.createMessageByFiles(Message_1.Message.FILES_ERRORS, filesToCommitWithErrors)); // Validation ended if (!req["doCommit"]) { onFinish(new RespOk_1.RespOk()); return; } // 1. Commit this.filesCommitedCount = 0; this.filesCommited = []; for (let i = 0; i < filesToCommit.length; i++) { let fileToCommit = filesToCommit[i]; let fileCommited = fileToCommit.commit(req["dir"], req["autoRename"]); this.filesCommited.push(fileCommited); } this.applySizes(req["sizes"], (e) => { if (e != null) { if (e instanceof MessageException_1.MessageException) onFinish(new RespFail_1.RespFail(e.getFailMessage())); else onFinish(new RespFail_1.RespFail(Message_1.Message.createMessage(Message_1.Message.INTERNAL_ERROR))); return; } // 2. Remove uploadAndCommit directory if (!this.m_config.doKeepUploads()) { try { fsx.removeSync(this.m_config.getTmpDir() + "/" + req["uploadId"]); } catch (e) { console.log(e); // throw new MessageException(new Message(Message.UNABLE_TO_DELETE_UPLOAD_DIR)); // do not throw anything - we've commited files and need to return them } } // 3. Send response with the list of files copied let files = []; for (let i = 0; i < this.filesCommited.length; i++) files.push(this.filesCommited[i].getData()); let resp = new RespUploadCommit_1.RespUploadCommit(); resp["files"] = files; onFinish(resp); }); } applySizes(sizes, onFinish) { if (this.filesCommitedCount === this.filesCommited.length) { onFinish(null); } else { try { this.filesCommited[this.filesCommitedCount].applySizes(sizes, (e) => { if (e != null) { for (let j = 0; j < this.filesCommited.length; j++) this.filesCommited[j].delete(); onFinish(e); } this.filesCommitedCount++; this.applySizes(sizes, onFinish); }); } catch (e) { for (let j = 0; j < this.filesCommited.length; j++) this.filesCommited[j].delete(); onFinish(e); } } } } exports.ActionUploadCommit = ActionUploadCommit; //# sourceMappingURL=ActionUploadCommit.js.map