ali-flmngr-server-fixed
Version:
> Node.js Backend for Flmngr file manager
188 lines (187 loc) • 8.51 kB
JavaScript
"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