removing promises inside promise constructors to events instead
This commit is contained in:
@@ -141,6 +141,20 @@ class DbUtil {
|
||||
return file;
|
||||
};
|
||||
|
||||
setThumbnail = async (fileID: string, thumbnailID: string) => {
|
||||
const file = await File.findOneAndUpdate(
|
||||
{ _id: new ObjectId(fileID), "metadata.hasThumbnail": false },
|
||||
{
|
||||
$set: {
|
||||
"metadata.hasThumbnail": true,
|
||||
"metadata.thumbnailID": thumbnailID,
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
return file;
|
||||
};
|
||||
|
||||
removeOneTimePublicLink = async (
|
||||
fileID: string | mongoose.Types.ObjectId
|
||||
) => {
|
||||
|
||||
@@ -1,29 +1,115 @@
|
||||
import mongoose from "../../../db/connections/mongoose";
|
||||
import crypto from "crypto";
|
||||
import Thumbnail from "../../../models/thumbnail-model";
|
||||
import sharp from "sharp";
|
||||
import { FileInterface } from "../../../models/file-model";
|
||||
import { UserInterface } from "../../../models/user-model";
|
||||
import fs, { write } from "fs";
|
||||
import uuid from "uuid";
|
||||
import env from "../../../enviroment/env";
|
||||
import { ObjectId } from "mongodb";
|
||||
import File from "../../../models/file-model";
|
||||
import { createGenericParams } from "./storageHelper";
|
||||
import { S3Actions } from "../actions/S3-actions";
|
||||
import { FilesystemActions } from "../actions/file-system-actions";
|
||||
import { EventEmitter } from "stream";
|
||||
import FileDB from "../../../db/mongoDB/fileDB";
|
||||
|
||||
const conn = mongoose.connection;
|
||||
const fileDB = new FileDB();
|
||||
|
||||
const storageActions =
|
||||
env.dbType === "s3" ? new S3Actions() : new FilesystemActions();
|
||||
|
||||
const waitTimer = () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
resolve(null);
|
||||
}, 5000);
|
||||
});
|
||||
const processData = (
|
||||
file: FileInterface,
|
||||
filename: string,
|
||||
user: UserInterface
|
||||
) => {
|
||||
const eventEmitter = new EventEmitter();
|
||||
|
||||
try {
|
||||
const password = user.getEncryptionKey();
|
||||
|
||||
let CIPHER_KEY = crypto.createHash("sha256").update(password!).digest();
|
||||
|
||||
const thumbnailFilename = uuid.v4();
|
||||
|
||||
const thumbnailIV = crypto.randomBytes(16);
|
||||
|
||||
const params = createGenericParams({
|
||||
filePath: file.metadata.filePath,
|
||||
Key: file.metadata.s3ID,
|
||||
});
|
||||
|
||||
const readStream = storageActions.createReadStream(params);
|
||||
|
||||
const { writeStream, emitter } = storageActions.createWriteStream(
|
||||
params,
|
||||
readStream,
|
||||
thumbnailFilename
|
||||
);
|
||||
|
||||
const decipher = crypto.createDecipheriv(
|
||||
"aes256",
|
||||
CIPHER_KEY,
|
||||
file.metadata.IV
|
||||
);
|
||||
|
||||
const imageResize = sharp().resize(300);
|
||||
|
||||
const handleFinish = async () => {
|
||||
const thumbnailModel = new Thumbnail({
|
||||
name: filename,
|
||||
owner: user._id,
|
||||
IV: thumbnailIV,
|
||||
path: env.fsDirectory + thumbnailFilename,
|
||||
s3ID: thumbnailFilename,
|
||||
});
|
||||
|
||||
await thumbnailModel.save();
|
||||
|
||||
const updatedFile = await fileDB.setThumbnail(
|
||||
file._id!.toString(),
|
||||
thumbnailModel._id.toString()
|
||||
);
|
||||
|
||||
if (!updatedFile) {
|
||||
throw new Error("Thumbnail Not Set");
|
||||
}
|
||||
|
||||
eventEmitter.emit("finish", updatedFile);
|
||||
};
|
||||
|
||||
const handleError = (e: Error) => {
|
||||
eventEmitter.emit("error", e);
|
||||
};
|
||||
|
||||
readStream.on("error", handleError);
|
||||
|
||||
writeStream.on("error", handleError);
|
||||
|
||||
decipher.on("error", handleError);
|
||||
|
||||
imageResize.on("error", handleError);
|
||||
|
||||
const thumbnailCipher = crypto.createCipheriv(
|
||||
"aes256",
|
||||
CIPHER_KEY,
|
||||
thumbnailIV
|
||||
);
|
||||
|
||||
readStream
|
||||
.pipe(decipher)
|
||||
.pipe(imageResize)
|
||||
.pipe(thumbnailCipher)
|
||||
.pipe(writeStream);
|
||||
|
||||
if (emitter) {
|
||||
emitter.on("finish", handleFinish);
|
||||
} else {
|
||||
writeStream.on("finish", handleFinish);
|
||||
}
|
||||
} catch (e) {
|
||||
eventEmitter.emit("error", e);
|
||||
}
|
||||
|
||||
return eventEmitter;
|
||||
};
|
||||
|
||||
const createThumbnail = (
|
||||
@@ -31,122 +117,15 @@ const createThumbnail = (
|
||||
filename: string,
|
||||
user: UserInterface
|
||||
) => {
|
||||
return new Promise<FileInterface>(async (resolve, reject) => {
|
||||
try {
|
||||
const password = user.getEncryptionKey();
|
||||
|
||||
let CIPHER_KEY = crypto.createHash("sha256").update(password!).digest();
|
||||
|
||||
const thumbnailFilename = uuid.v4();
|
||||
|
||||
const thumbnailIV = crypto.randomBytes(16);
|
||||
|
||||
console.log("file metadata", file.metadata);
|
||||
|
||||
// if (env.dbType === "s3") {
|
||||
// await waitTimer();
|
||||
// }
|
||||
|
||||
const params = createGenericParams({
|
||||
filePath: file.metadata.filePath,
|
||||
Key: file.metadata.s3ID,
|
||||
});
|
||||
|
||||
const readStream = storageActions.createReadStream(params);
|
||||
|
||||
const { writeStream, emitter } = storageActions.createWriteStream(
|
||||
params,
|
||||
readStream,
|
||||
thumbnailFilename
|
||||
);
|
||||
|
||||
const decipher = crypto.createDecipheriv(
|
||||
"aes256",
|
||||
CIPHER_KEY,
|
||||
file.metadata.IV
|
||||
);
|
||||
|
||||
const imageResize = sharp().resize(300);
|
||||
|
||||
const handleFinish = async () => {
|
||||
try {
|
||||
const thumbnailModel = new Thumbnail({
|
||||
name: filename,
|
||||
owner: user._id,
|
||||
IV: thumbnailIV,
|
||||
path: env.fsDirectory + thumbnailFilename,
|
||||
s3ID: thumbnailFilename,
|
||||
});
|
||||
|
||||
await thumbnailModel.save();
|
||||
if (!file._id) {
|
||||
return reject();
|
||||
}
|
||||
const updateFileResponse = await File.updateOne(
|
||||
{ _id: new ObjectId(file._id), "metadata.owner": user._id },
|
||||
{
|
||||
$set: {
|
||||
"metadata.hasThumbnail": true,
|
||||
"metadata.thumbnailID": thumbnailModel._id,
|
||||
},
|
||||
}
|
||||
);
|
||||
if (updateFileResponse.modifiedCount === 0) {
|
||||
return reject();
|
||||
}
|
||||
|
||||
const updatedFile = await File.findById({
|
||||
_id: new ObjectId(file._id),
|
||||
"metadata.owner": user._id,
|
||||
});
|
||||
|
||||
if (!updatedFile) return reject();
|
||||
|
||||
resolve(updatedFile?.toObject());
|
||||
} catch (e) {
|
||||
console.log("thumbnail error", e);
|
||||
resolve(file);
|
||||
}
|
||||
};
|
||||
|
||||
const handleError = (e: Error) => {
|
||||
console.log("thumbnail stream error", e);
|
||||
resolve(file);
|
||||
};
|
||||
|
||||
readStream.on("error", handleError);
|
||||
|
||||
writeStream.on("error", handleError);
|
||||
|
||||
decipher.on("error", handleError);
|
||||
|
||||
imageResize.on("error", handleError);
|
||||
|
||||
const thumbnailCipher = crypto.createCipheriv(
|
||||
"aes256",
|
||||
CIPHER_KEY,
|
||||
thumbnailIV
|
||||
);
|
||||
|
||||
readStream
|
||||
.pipe(decipher)
|
||||
.pipe(imageResize)
|
||||
.pipe(thumbnailCipher)
|
||||
.pipe(writeStream);
|
||||
|
||||
if (emitter) {
|
||||
emitter.on("finish", async () => {
|
||||
await handleFinish();
|
||||
});
|
||||
} else {
|
||||
writeStream.on("finish", async () => {
|
||||
await handleFinish();
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
console.log("File service upload thumbnail error", e);
|
||||
return new Promise<FileInterface>((resolve, _) => {
|
||||
const eventEmitter = processData(file, filename, user);
|
||||
eventEmitter.on("error", (e) => {
|
||||
console.log("Error creating thumbnail", e);
|
||||
resolve(file);
|
||||
}
|
||||
});
|
||||
eventEmitter.on("finish", (updatedFile: FileInterface) => {
|
||||
resolve(updatedFile);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -140,12 +140,10 @@ const processData = (busboy: any, user: UserInterface) => {
|
||||
);
|
||||
|
||||
writeStream.on("error", (e: Error) => {
|
||||
console.log("write stream error", e);
|
||||
reject(e);
|
||||
});
|
||||
|
||||
cipher.on("error", (e: Error) => {
|
||||
console.log("cipher error", e);
|
||||
reject(e);
|
||||
});
|
||||
|
||||
@@ -177,7 +175,7 @@ const processData = (busboy: any, user: UserInterface) => {
|
||||
|
||||
fileDataMap[currentFile!.index] = {
|
||||
...fileDataMap[currentFile!.index],
|
||||
uploadedFileId: file._id.toString(),
|
||||
uploadedFileId: file._id!.toString(),
|
||||
};
|
||||
|
||||
filesProcessed++;
|
||||
@@ -187,7 +185,6 @@ const processData = (busboy: any, user: UserInterface) => {
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.log("error", e);
|
||||
eventEmitter.emit("error", e);
|
||||
}
|
||||
|
||||
@@ -228,11 +225,9 @@ const processData = (busboy: any, user: UserInterface) => {
|
||||
);
|
||||
|
||||
busboy.on("error", (e: Error) => {
|
||||
console.log("busboy error", e);
|
||||
eventEmitter.emit("error", e);
|
||||
});
|
||||
} catch (e) {
|
||||
console.log("get folder busboy data error", e);
|
||||
eventEmitter.emit("error", e);
|
||||
}
|
||||
|
||||
|
||||
@@ -32,12 +32,12 @@ const UploadItem: React.FC<UploadItemType> = (props) => {
|
||||
const ProgressBar = memo(() => {
|
||||
if (completed) {
|
||||
return <div className="custom-progress-success"></div>;
|
||||
} else if (canceled) {
|
||||
return <div className="custom-progress-failed"></div>;
|
||||
} else if (type === "file") {
|
||||
return (
|
||||
<progress className="custom-progress" value={progress} max="100" />
|
||||
);
|
||||
} else if (canceled) {
|
||||
return <div className="custom-progress-failed"></div>;
|
||||
} else {
|
||||
return <progress className="custom-progress indeterminate" />;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user