From ee7f5f42d6747b100f7056cacacdf6cd823a3744 Mon Sep 17 00:00:00 2001 From: subnub Date: Thu, 30 Apr 2020 19:17:59 -0400 Subject: [PATCH] Added delete folders, and delete all to S3/Filesystem, also removed the need for serperate file controllers, now it only uses one file controller, with the chunk service passed through the constructor --- backend/controllers/file.ts | 115 +--- backend/controllers/fileS3.ts | 593 ------------------ backend/controllers/fileSystem.ts | 589 ----------------- backend/controllers/folder.ts | 16 +- backend/express-routers/file.ts | 21 +- backend/express-routers/folder.ts | 28 +- .../ChunkService/FileSystemService.ts | 72 +++ backend/services/ChunkService/MongoService.ts | 74 +++ backend/services/ChunkService/S3Service.ts | 72 +++ backend/services/FolderService/index.ts | 368 ----------- backend/services/UserService/index.ts | 71 --- 11 files changed, 289 insertions(+), 1730 deletions(-) delete mode 100644 backend/controllers/fileS3.ts delete mode 100644 backend/controllers/fileSystem.ts diff --git a/backend/controllers/file.ts b/backend/controllers/file.ts index de5b0b4..6e71547 100644 --- a/backend/controllers/file.ts +++ b/backend/controllers/file.ts @@ -1,29 +1,27 @@ import { Request, Response } from "express"; - -//const FileService = require("../services/FileService") import FileService from "../services/FileService"; +import MongoService from "../services/ChunkService/MongoService"; +import FileSystemService from "../services/ChunkService/FileSystemService"; +import S3Service from "../services/ChunkService/S3Service"; +import {UserInterface} from "../models/user"; const fileService = new FileService() - -import MongoService from "../services/ChunkService/MongoService"; -const mongoService = new MongoService(); - - -import {UserInterface} from "../models/user"; - interface RequestType extends Request { user?: UserInterface, auth?: any, busboy: any, } +type ChunkServiceType = MongoService | FileSystemService | S3Service; + class FileController { - // fileService: ; + chunkService: ChunkServiceType; - constructor() { + constructor(chunkService: ChunkServiceType) { + this.chunkService = chunkService; } getThumbnail = async(req: RequestType, res: Response) => { @@ -40,8 +38,9 @@ class FileController { const user = req.user; const id = req.params.id; - const decryptedThumbnail = await mongoService.getThumbnail(user, id); - + const decryptedThumbnail = await this.chunkService.getThumbnail(user, id); + + res.send(decryptedThumbnail); } catch (e) { @@ -65,7 +64,7 @@ class FileController { const user = req.user; const fileID = req.params.id; - await mongoService.getFullThumbnail(user, fileID, res); + await this.chunkService.getFullThumbnail(user, fileID, res); } catch (e) { const code = e.code || 500; @@ -88,7 +87,7 @@ class FileController { req.pipe(busboy); - const file = await mongoService.uploadFile(user, busboy, req); + const file = await this.chunkService.uploadFile(user, busboy, req); res.send(file); @@ -108,7 +107,7 @@ class FileController { const ID = req.params.id; const tempToken = req.params.tempToken; - await mongoService.getPublicDownload(ID, tempToken, res); + await this.chunkService.getPublicDownload(ID, tempToken, res); } catch (e) { @@ -356,83 +355,6 @@ class FileController { } } - // async transcodeVideo(req: RequestType, res: Response) { - - // if (!req.user) { - - // return; - // } - - // try { - - // console.log("transcode request", req.body.file._id) - - // const user = req.user; - // const body = req.body; - - // await fileService.transcodeVideo(user, body); - - // res.send("Finished"); - - // } catch (e) { - - // const code = e.code || 500; - // console.log(e.message, e.exception) - // return res.status(code).send(); - // } - // } - - // async removeTranscodeVideo(req: RequestType, res: Response) { - - // if (!req.user) { - - // return; - // } - - // try { - - // const fileID = req.body.id; - // const userID = req.user._id; - - // await fileService.removeTranscodeVideo(userID, fileID); - - // res.send(); - - // } catch (e) { - - // const code = e.code || 500; - - // console.log(e); - // res.status(code).send() - // } - // } - - // async streamTranscodedVideo(req: RequestType, res: Response) { - - // if (!req.auth || !req.user) { - // return; - // } - - // try { - - // console.log("stream request transcoded", req.params.id) - - // const fileID = req.params.id; - // const userID = req.user._id; - // const headers = req.headers; - - // await fileService.streamTranscodedVideo(userID, fileID, headers, res); - - // } catch (e) { - - // const code = e.code || 500; - // const message = e.message || e; - - // console.log(message, e); - // res.status(code).send(); - // } - // } - streamVideo = async(req: RequestType, res: Response) => { if (!req.auth || !req.user) { @@ -447,7 +369,7 @@ class FileController { console.log("stream request", req.params.id) - await mongoService.streamVideo(user, fileID, headers, res); + await this.chunkService.streamVideo(user, fileID, headers, res); } catch (e) { @@ -473,8 +395,7 @@ class FileController { const user = req.user; const fileID = req.params.id; - //await fileService.downloadFile(user, fileID, res); - await mongoService.downloadFile(user, fileID, res); + await this.chunkService.downloadFile(user, fileID, res); } catch (e) { @@ -578,7 +499,7 @@ class FileController { const userID = req.user._id; const fileID = req.body.id; - await mongoService.deleteFile(userID, fileID); + await this.chunkService.deleteFile(userID, fileID); res.send() diff --git a/backend/controllers/fileS3.ts b/backend/controllers/fileS3.ts deleted file mode 100644 index 1ea5ec7..0000000 --- a/backend/controllers/fileS3.ts +++ /dev/null @@ -1,593 +0,0 @@ -import { Request, Response } from "express"; - -//const FileService = require("../services/FileService") -import FileService from "../services/FileService"; - -const fileService = new FileService() - -import S3FileService from "../services/ChunkService/S3Service"; -const s3FileService = new S3FileService(); - -import {UserInterface} from "../models/user"; - -interface RequestType extends Request { - user?: UserInterface, - auth?: any, - busboy: any, -} - -class FileSystemController { - - // fileService: ; - - constructor() { - - } - - getThumbnail = async(req: RequestType, res: Response) => { - - - if (!req.user) { - - return; - } - - try { - - - const user = req.user; - const id = req.params.id; - - const decryptedThumbnail = await s3FileService.getThumbnail(user, id); - - res.send(decryptedThumbnail); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send(); - } - - } - - getFullThumbnail = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const user = req.user; - const fileID = req.params.id; - - await s3FileService.getFullThumbnail(user, fileID, res); - - } catch (e) { - const code = e.code || 500; - console.log(e.message, e.exception) - return res.status(code).send(); - } - } - - uploadFile = async(req: RequestType, res: Response) => { - - if (!req.user) { - - return - } - - try { - - const user = req.user; - const busboy = req.busboy; - - req.pipe(busboy); - - const file = await s3FileService.uploadFile(user, busboy, req); - - res.send(file); - - console.log("file uploaded"); - - } catch (e) { - const code = e.code || 500; - console.log(e.message, e.exception) - return res.status(code).send(); - } - } - - getPublicDownload = async(req: RequestType, res: Response) => { - - try { - - const ID = req.params.id; - const tempToken = req.params.tempToken; - - await s3FileService.getPublicDownload(ID, tempToken, res); - - } catch (e) { - - const code = e.code || 500; - const message = e.message || e; - - console.log(message, e); - res.status(code).send(); - } - } - - removeLink = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const id = req.params.id; - const userID = req.user._id; - - await fileService.removeLink(userID, id) - - res.send(); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send(); - } - - } - - makePublic = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const fileID = req.params.id; - const user = req.user; - - const token = await fileService.makePublic(user, fileID); - - res.send(token); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send(); - } - } - - getPublicInfo = async(req: RequestType, res: Response) => { - - try { - - const id = req.params.id; - const tempToken = req.params.tempToken; - - const file = await fileService.getPublicInfo(id, tempToken); - - res.send(file); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } - - makeOneTimePublic = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const id = req.params.id; - const userID = req.user._id; - - const token = await fileService.makeOneTimePublic(userID, id); - - res.send(token); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - - } - - getFileInfo = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const fileID = req.params.id; - const userID = req.user._id; - - const file = await fileService.getFileInfo(userID, fileID); - - res.send(file); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } - - getQuickList = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const userID = req.user._id; - - const quickList = await fileService.getQuickList(userID); - - res.send(quickList); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } - - getList = async(req: RequestType, res: Response) => { - - if (!req.user) { - return - } - - try { - - const query = req.query; - const userID = req.user._id; - - const fileList = await fileService.getList(userID, query); - - res.send(fileList); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } - - getDownloadToken = async(req: RequestType, res: Response) => { - - if (!req.user) { - return - } - - try { - - const user = req.user; - - const tempToken = await fileService.getDownloadToken(user); - - res.send({tempToken}); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } - - getDownloadTokenVideo = async(req: RequestType, res: Response) => { - - if (!req.user) { - return - } - - try { - - const user = req.user; - const cookie = req.headers.uuid as string; - - const tempToken = await fileService.getDownloadTokenVideo(user, cookie); - - res.send({tempToken}); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } - - removeTempToken = async(req: RequestType, res: Response) => { - - if (!req.user) { - return - } - - try { - - const user = req.user - const tempToken = req.params.tempToken; - - await fileService.removeTempToken(user, tempToken); - - res.send(); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } - - // async transcodeVideo(req: RequestType, res: Response) { - - // if (!req.user) { - - // return; - // } - - // try { - - // console.log("transcode request", req.body.file._id) - - // const user = req.user; - // const body = req.body; - - // await fileService.transcodeVideo(user, body); - - // res.send("Finished"); - - // } catch (e) { - - // const code = e.code || 500; - // console.log(e.message, e.exception) - // return res.status(code).send(); - // } - // } - - // async removeTranscodeVideo(req: RequestType, res: Response) { - - // if (!req.user) { - - // return; - // } - - // try { - - // const fileID = req.body.id; - // const userID = req.user._id; - - // await fileService.removeTranscodeVideo(userID, fileID); - - // res.send(); - - // } catch (e) { - - // const code = e.code || 500; - - // console.log(e); - // res.status(code).send() - // } - // } - - // async streamTranscodedVideo(req: RequestType, res: Response) { - - // if (!req.auth || !req.user) { - // return; - // } - - // try { - - // console.log("stream request transcoded", req.params.id) - - // const fileID = req.params.id; - // const userID = req.user._id; - // const headers = req.headers; - - // await fileService.streamTranscodedVideo(userID, fileID, headers, res); - - // } catch (e) { - - // const code = e.code || 500; - // const message = e.message || e; - - // console.log(message, e); - // res.status(code).send(); - // } - // } - - streamVideo = async(req: RequestType, res: Response) => { - - if (!req.auth || !req.user) { - return; - } - - try { - - const user = req.user; - const fileID = req.params.id; - const headers = req.headers; - - console.log("stream request", req.params.id) - - await s3FileService.streamVideo(user, fileID, headers, res); - - } catch (e) { - - const code = e.code || 500; - const message = e.message || e; - - console.log(message, e); - res.status(code).send(); - } - - } - - downloadFile = async(req: RequestType, res: Response) => { - - if (!req.auth || !req.user) { - return; - } - - try { - - console.log("download request") - - const user = req.user; - const fileID = req.params.id; - - //await fileService.downloadFile(user, fileID, res); - await s3FileService.downloadFile(user, fileID, res); - - } catch (e) { - - const code = e.code || 500; - const message = e.message || e; - - console.log(message, e); - res.status(code).send(); - } - } - - getSuggestedList = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const userID = req.user._id; - let searchQuery = req.query.search || ""; - - const {fileList, folderList} = await fileService.getSuggestedList(userID, searchQuery); - - return res.send({folderList, fileList}) - - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } - - renameFile = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const fileID = req.body.id; - const title = req.body.title - const userID = req.user._id; - - await fileService.renameFile(userID, fileID, title) - - res.send(); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - - } - - moveFile = async(req: RequestType, res: Response) => { - - console.log("move request"); - - if (!req.user) { - return; - } - - try { - - const fileID = req.body.id; - const userID = req.user._id; - const parentID = req.body.parent; - - console.log(fileID, userID, parentID); - - await fileService.moveFile(userID, fileID, parentID); - - res.send(); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - - } - - deleteFile = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const userID = req.user._id; - const fileID = req.body.id; - - await s3FileService.deleteFile(userID, fileID); - - res.send() - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } -} - -export default FileSystemController; diff --git a/backend/controllers/fileSystem.ts b/backend/controllers/fileSystem.ts deleted file mode 100644 index da6e0ca..0000000 --- a/backend/controllers/fileSystem.ts +++ /dev/null @@ -1,589 +0,0 @@ -import { Request, Response } from "express"; - -//const FileService = require("../services/FileService") -import FileService from "../services/FileService"; - -const fileService = new FileService() - -import FileSystemService from "../services/ChunkService/FileSystemService"; -const fileSystemService = new FileSystemService(); - -import {UserInterface} from "../models/user"; - -interface RequestType extends Request { - user?: UserInterface, - auth?: any, - busboy: any, - encryptedTempToken?: any, -} - -class FileSystemController { - - // fileService: ; - - constructor() { - - } - - getThumbnail = async(req: RequestType, res: Response) => { - - - if (!req.user) { - - return; - } - - try { - - - const user = req.user; - const id = req.params.id; - - const decryptedThumbnail = await fileSystemService.getThumbnail(user, id); - - res.send(decryptedThumbnail); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send(); - } - - } - - getFullThumbnail = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const user = req.user; - const fileID = req.params.id; - - await fileSystemService.getFullThumbnail(user, fileID, res); - - } catch (e) { - const code = e.code || 500; - console.log(e.message, e.exception) - return res.status(code).send(); - } - } - - uploadFile = async(req: RequestType, res: Response) => { - - if (!req.user) { - - return - } - - try { - - const user = req.user; - const busboy = req.busboy; - - req.pipe(busboy); - - const file = await fileSystemService.uploadFile(user, busboy, req); - - res.send(file); - - console.log("file uploaded"); - - } catch (e) { - const code = e.code || 500; - console.log(e.message, e.exception) - return res.status(code).send(); - } - } - - getPublicDownload = async(req: RequestType, res: Response) => { - - try { - - const ID = req.params.id; - const tempToken = req.params.tempToken; - - await fileSystemService.getPublicDownload(ID, tempToken, res); - - } catch (e) { - - const code = e.code || 500; - const message = e.message || e; - - console.log(message, e); - res.status(code).send(); - } - } - - removeLink = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const id = req.params.id; - const userID = req.user._id; - - await fileService.removeLink(userID, id) - - res.send(); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send(); - } - - } - - makePublic = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const fileID = req.params.id; - const user = req.user; - - const token = await fileService.makePublic(user, fileID); - - res.send(token); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send(); - } - } - - getPublicInfo = async(req: RequestType, res: Response) => { - - try { - - const id = req.params.id; - const tempToken = req.params.tempToken; - - const file = await fileService.getPublicInfo(id, tempToken); - - res.send(file); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } - - makeOneTimePublic = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const id = req.params.id; - const userID = req.user._id; - - const token = await fileService.makeOneTimePublic(userID, id); - - res.send(token); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - - } - - getFileInfo = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const fileID = req.params.id; - const userID = req.user._id; - - const file = await fileService.getFileInfo(userID, fileID); - - res.send(file); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } - - getQuickList = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const userID = req.user._id; - - const quickList = await fileService.getQuickList(userID); - - res.send(quickList); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } - - getList = async(req: RequestType, res: Response) => { - - if (!req.user) { - return - } - - try { - - const query = req.query; - const userID = req.user._id; - - const fileList = await fileService.getList(userID, query); - - res.send(fileList); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } - - getDownloadToken = async(req: RequestType, res: Response) => { - - if (!req.user) { - return - } - - try { - - const user = req.user; - - const tempToken = await fileService.getDownloadToken(user); - - res.send({tempToken}); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } - - getDownloadTokenVideo = async(req: RequestType, res: Response) => { - - if (!req.user) { - return - } - - try { - - console.log("Incoming Video Stream Request"); - const user = req.user; - const cookie = req.headers.uuid as string; - - const tempToken = await fileService.getDownloadTokenVideo(user, cookie); - - res.send({tempToken}); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } - - removeTempToken = async(req: RequestType, res: Response) => { - - if (!req.user) { - return - } - - try { - - const user = req.user - const tempToken = req.params.tempToken; - - await fileService.removeTempToken(user, tempToken); - - res.send(); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } - - // async transcodeVideo(req: RequestType, res: Response) { - - // if (!req.user) { - - // return; - // } - - // try { - - // console.log("transcode request", req.body.file._id) - - // const user = req.user; - // const body = req.body; - - // await fileService.transcodeVideo(user, body); - - // res.send("Finished"); - - // } catch (e) { - - // const code = e.code || 500; - // console.log(e.message, e.exception) - // return res.status(code).send(); - // } - // } - - // async removeTranscodeVideo(req: RequestType, res: Response) { - - // if (!req.user) { - - // return; - // } - - // try { - - // const fileID = req.body.id; - // const userID = req.user._id; - - // await fileService.removeTranscodeVideo(userID, fileID); - - // res.send(); - - // } catch (e) { - - // const code = e.code || 500; - - // console.log(e); - // res.status(code).send() - // } - // } - - // async streamTranscodedVideo(req: RequestType, res: Response) { - - // if (!req.auth || !req.user) { - // return; - // } - - // try { - - // console.log("stream request transcoded", req.params.id) - - // const fileID = req.params.id; - // const userID = req.user._id; - // const headers = req.headers; - - // await fileService.streamTranscodedVideo(userID, fileID, headers, res); - - // } catch (e) { - - // const code = e.code || 500; - // const message = e.message || e; - - // console.log(message, e); - // res.status(code).send(); - // } - // } - - streamVideo = async(req: RequestType, res: Response) => { - - if (!req.auth || !req.user) { - return; - } - - try { - - const user = req.user; - const fileID = req.params.id; - const headers = req.headers; - - await fileSystemService.streamVideo(user, fileID, headers, res); - - } catch (e) { - - const code = e.code || 500; - const message = e.message || e; - - console.log(message, e); - res.status(code).send(); - } - - } - - downloadFile = async(req: RequestType, res: Response) => { - - if (!req.auth || !req.user) { - return; - } - - try { - const user = req.user; - const fileID = req.params.id; - - await fileSystemService.downloadFile(user, fileID, res); - - } catch (e) { - - const code = e.code || 500; - const message = e.message || e; - - console.log(message, e); - res.status(code).send(); - } - } - - getSuggestedList = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const userID = req.user._id; - let searchQuery = req.query.search || ""; - - const {fileList, folderList} = await fileService.getSuggestedList(userID, searchQuery); - - return res.send({folderList, fileList}) - - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } - - renameFile = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const fileID = req.body.id; - const title = req.body.title - const userID = req.user._id; - - await fileService.renameFile(userID, fileID, title) - - res.send(); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - - } - - moveFile = async(req: RequestType, res: Response) => { - - console.log("move request"); - - if (!req.user) { - return; - } - - try { - - const fileID = req.body.id; - const userID = req.user._id; - const parentID = req.body.parent; - - console.log(fileID, userID, parentID); - - await fileService.moveFile(userID, fileID, parentID); - - res.send(); - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - - } - - deleteFile = async(req: RequestType, res: Response) => { - - if (!req.user) { - return; - } - - try { - - const userID = req.user._id; - const fileID = req.body.id; - - await fileSystemService.deleteFile(userID, fileID); - - res.send() - - } catch (e) { - - const code = e.code || 500; - - console.log(e); - res.status(code).send() - } - } -} - -export default FileSystemController; diff --git a/backend/controllers/folder.ts b/backend/controllers/folder.ts index 33961de..530f67f 100644 --- a/backend/controllers/folder.ts +++ b/backend/controllers/folder.ts @@ -2,16 +2,24 @@ import FolderService from "../services/FolderService"; const folderService = new FolderService(); import { Request, Response } from "express"; import {UserInterface} from "../models/user"; +import MongoService from "../services/ChunkService/MongoService"; +import FileSystemService from "../services/ChunkService/FileSystemService"; +import S3Service from "../services/ChunkService/S3Service"; interface RequestType extends Request { user?: UserInterface, auth?: any, } +type ChunkServiceType = MongoService | FileSystemService | S3Service; + class FolderController { - constructor() { + chunkService: ChunkServiceType; + constructor(chunkService: ChunkServiceType) { + + this.chunkService = chunkService; } uploadFolder = async(req: RequestType, res: Response) => { @@ -51,7 +59,7 @@ class FolderController { const folderID = req.body.id; const parentList = req.body.parentList - await folderService.deleteFolder(userID, folderID, parentList); + await this.chunkService.deleteFolder(userID, folderID, parentList); res.send(); @@ -75,7 +83,7 @@ class FolderController { const userID = req.user._id; - await folderService.deleteAll(userID); + await this.chunkService.deleteAll(userID); res.send(); @@ -215,4 +223,4 @@ class FolderController { } } -module.exports = FolderController; \ No newline at end of file +export default FolderController; \ No newline at end of file diff --git a/backend/express-routers/file.ts b/backend/express-routers/file.ts index a467c5d..596912e 100644 --- a/backend/express-routers/file.ts +++ b/backend/express-routers/file.ts @@ -7,18 +7,27 @@ import tempAuth from "../middleware/tempAuth"; import tempAuthVideo from "../middleware/tempAuthVideo"; import FileController from "../controllers/file"; -import FsFileController from "../controllers/fileSystem"; -import S3FileController from "../controllers/fileS3"; import env from "../enviroment/env"; +import MongoService from "../services/ChunkService/MongoService"; +import FileSystemService from "../services/ChunkService/FileSystemService"; +import S3Service from "../services/ChunkService/S3Service"; -let fileController: FileController | FsFileController | S3FileController; +let fileController: FileController; if (env.dbType === "mongo") { - fileController = new FileController(); + + const mongoService = new MongoService(); + fileController = new FileController(mongoService); + } else if (env.dbType === "fs") { - fileController = new FsFileController(); + + const fileSystemService = new FileSystemService(); + fileController = new FileController(fileSystemService); + } else { - fileController = new S3FileController(); + + const s3Service = new S3Service(); + fileController = new FileController(s3Service); } //const fileController = new FileController() diff --git a/backend/express-routers/folder.ts b/backend/express-routers/folder.ts index 7afe61c..b775c22 100644 --- a/backend/express-routers/folder.ts +++ b/backend/express-routers/folder.ts @@ -1,8 +1,32 @@ import {Router} from "express"; const router = Router(); import auth from "../middleware/auth"; -const FolderController = require("../controllers/folder"); -const folderController = new FolderController(); +import env from "../enviroment/env"; +import MongoService from "../services/ChunkService/MongoService"; +import FileSystemService from "../services/ChunkService/FileSystemService"; +import S3Service from "../services/ChunkService/S3Service"; +import FolderController from "../controllers/folder"; + +let folderController: FolderController; + +if (env.dbType === "mongo") { + + const mongoService = new MongoService(); + folderController = new FolderController(mongoService); + +} else if (env.dbType === "fs") { + + const fileSystemService = new FileSystemService(); + folderController = new FolderController(fileSystemService); + +} else { + + const s3Service = new S3Service(); + folderController = new FolderController(s3Service); +} + +//import FolderController from "../controllers/folder"; +//const folderController = new FolderController(); router.post("/folder-service/upload", auth, folderController.uploadFolder); diff --git a/backend/services/ChunkService/FileSystemService.ts b/backend/services/ChunkService/FileSystemService.ts index 3cb156f..6fd8be4 100644 --- a/backend/services/ChunkService/FileSystemService.ts +++ b/backend/services/ChunkService/FileSystemService.ts @@ -24,6 +24,7 @@ import removeTempToken from "./utils/removeTempToken"; import getPrevIVFS from "./utils/getPrevIVFS"; import awaitStreamVideo from "./utils/awaitStreamVideo"; import fixStartChunkLength from "./utils/fixStartChunkLength"; +import Folder from "../../models/folder"; const dbUtilsFile = new DbUtilFile(); @@ -314,6 +315,77 @@ class FileSystemService implements ChunkInterface { await removeChunksFS(file.metadata.filePath!); await File.deleteOne({_id: file._id}); } + + deleteFolder = async(userID: string, folderID: string, parentList: string[]) => { + + const parentListString = parentList.toString() + + await Folder.deleteMany({"owner": userID, "parentList": { $all: parentList}}) + await Folder.deleteMany({"owner": userID, "_id": folderID}); + + const fileList = await dbUtilsFile.getFileListByParent(userID, parentListString); + + if (!fileList) throw new NotFoundError("Delete File List Not Found"); + + for (let i = 0; i < fileList.length; i++) { + + const currentFile = fileList[i]; + + try { + + if (currentFile.metadata.thumbnailID) { + + const thumbnail = await Thumbnail.findById(currentFile.metadata.thumbnailID) as ThumbnailInterface; + const thumbnailPath = thumbnail.path!; + await removeChunksFS(thumbnailPath); + + await Thumbnail.deleteOne({_id: currentFile.metadata.thumbnailID}); + } + + await removeChunksFS(currentFile.metadata.filePath!); + await File.deleteOne({_id: currentFile._id}); + + } catch (e) { + + console.log("Could not delete file", currentFile.filename, currentFile._id); + } + + } + } + + deleteAll = async(userID: string) => { + + console.log("remove all request") + + await Folder.deleteMany({"owner": userID}); + + const fileList = await dbUtilsFile.getFileListByOwner(userID); + + if (!fileList) throw new NotFoundError("Delete All File List Not Found Error"); + + for (let i = 0; i < fileList.length; i++) { + const currentFile = fileList[i]; + + try { + + if (currentFile.metadata.thumbnailID) { + + const thumbnail = await Thumbnail.findById(currentFile.metadata.thumbnailID) as ThumbnailInterface; + const thumbnailPath = thumbnail.path!; + await removeChunksFS(thumbnailPath); + + await Thumbnail.deleteOne({_id: currentFile.metadata.thumbnailID}); + } + + await removeChunksFS(currentFile.metadata.filePath!); + await File.deleteOne({_id: currentFile._id}); + + } catch (e) { + + console.log("Could Not Remove File", currentFile.filename, currentFile._id); + } + } + } } export default FileSystemService; \ No newline at end of file diff --git a/backend/services/ChunkService/MongoService.ts b/backend/services/ChunkService/MongoService.ts index 3fd9633..e888e6d 100644 --- a/backend/services/ChunkService/MongoService.ts +++ b/backend/services/ChunkService/MongoService.ts @@ -16,6 +16,7 @@ import awaitStream from "./utils/awaitStream"; import awaitUploadStream from "./utils/awaitUploadStream"; import User, { UserInterface } from "../../models/user"; +import Folder from "../../models/folder"; import { FileInterface } from "../../models/file"; import { Stream } from "stream"; import removeChunks from "../FileService/utils/removeChunks"; @@ -312,6 +313,79 @@ class MongoService implements ChunkInterface { await bucket.delete(new ObjectID(fileID)); } + + deleteFolder = async(userID: string, folderID: string, parentList: string[]) => { + + let bucket = new mongoose.mongo.GridFSBucket(conn.db, { + chunkSizeBytes: 1024 * 255 + }); + + const parentListString = parentList.toString() + + await Folder.deleteMany({"owner": userID, "parentList": { $all: parentList}}) + await Folder.deleteMany({"owner": userID, "_id": folderID}); + + const fileList = await dbUtilsFile.getFileListByParent(userID, parentListString); + + if (!fileList) throw new NotFoundError("Delete File List Not Found"); + + for (let i = 0; i < fileList.length; i++) { + + const currentFile = fileList[i]; + + try { + + if (currentFile.metadata.thumbnailID) { + + await Thumbnail.deleteOne({_id: currentFile.metadata.thumbnailID}); + } + + await bucket.delete(new ObjectID(currentFile._id)); + + } catch (e) { + + console.log("Could not delete file", currentFile.filename, currentFile._id); + } + + } + } + + deleteAll = async(userID: string) => { + + console.log("remove all request") + + let bucket = new mongoose.mongo.GridFSBucket(conn.db, { + chunkSizeBytes: 1024 * 255 + }); + + const videoBucket = new mongoose.mongo.GridFSBucket(conn.db, { + bucketName: "videos" + }); + + await Folder.deleteMany({"owner": userID}); + + const fileList = await dbUtilsFile.getFileListByOwner(userID); + + if (!fileList) throw new NotFoundError("Delete All File List Not Found Error"); + + for (let i = 0; i < fileList.length; i++) { + const currentFile = fileList[i]; + + try { + + if (currentFile.metadata.thumbnailID) { + + await Thumbnail.deleteOne({_id: currentFile.metadata.thumbnailID}) + } + + await bucket.delete(new ObjectID(currentFile._id)); + + } catch (e) { + + console.log("Could Not Remove File", currentFile.filename, currentFile._id); + } + } + } } export default MongoService; \ No newline at end of file diff --git a/backend/services/ChunkService/S3Service.ts b/backend/services/ChunkService/S3Service.ts index c82010c..928accd 100644 --- a/backend/services/ChunkService/S3Service.ts +++ b/backend/services/ChunkService/S3Service.ts @@ -24,6 +24,7 @@ import fixStartChunkLength from "./utils/fixStartChunkLength"; import fixEndChunkLength from "./utils/fixEndChunkLength"; import getPrevIVS3 from "./utils/getPrevIVS3"; import awaitStreamVideo from "./utils/awaitStreamVideo"; +import Folder from "../../models/folder"; import DbUtilFile from "../../db/utils/fileUtils/index"; const dbUtilsFile = new DbUtilFile(); @@ -316,6 +317,77 @@ class S3Service implements ChunkInterface { await removeChunksS3(params); await File.deleteOne({_id: file._id}); } + + deleteFolder = async(userID: string, folderID: string, parentList: string[]) => { + + const parentListString = parentList.toString() + + await Folder.deleteMany({"owner": userID, "parentList": { $all: parentList}}) + await Folder.deleteMany({"owner": userID, "_id": folderID}); + + const fileList = await dbUtilsFile.getFileListByParent(userID, parentListString); + + if (!fileList) throw new NotFoundError("Delete File List Not Found"); + + for (let i = 0; i < fileList.length; i++) { + + const currentFile = fileList[i]; + + try { + + if (currentFile.metadata.thumbnailID) { + + const thumbnail = await Thumbnail.findById(currentFile.metadata.thumbnailID) as ThumbnailInterface; + const paramsThumbnail: any = {Bucket: env.s3Bucket, Key: thumbnail.s3ID!}; + await removeChunksS3(paramsThumbnail); + await Thumbnail.deleteOne({_id: currentFile.metadata.thumbnailID}); + } + + const params: any = {Bucket: env.s3Bucket, Key: currentFile.metadata.s3ID!}; + await removeChunksS3(params); + await File.deleteOne({_id: currentFile._id}); + + } catch (e) { + + console.log("Could not delete file", currentFile.filename, currentFile._id); + } + + } + } + + deleteAll = async(userID: string) => { + + console.log("remove all request") + + await Folder.deleteMany({"owner": userID}); + + const fileList = await dbUtilsFile.getFileListByOwner(userID); + + if (!fileList) throw new NotFoundError("Delete All File List Not Found Error"); + + for (let i = 0; i < fileList.length; i++) { + const currentFile = fileList[i]; + + try { + + if (currentFile.metadata.thumbnailID) { + + const thumbnail = await Thumbnail.findById(currentFile.metadata.thumbnailID) as ThumbnailInterface; + const paramsThumbnail: any = {Bucket: env.s3Bucket, Key: thumbnail.s3ID!}; + await removeChunksS3(paramsThumbnail); + await Thumbnail.deleteOne({_id: currentFile.metadata.thumbnailID}); + } + + const params: any = {Bucket: env.s3Bucket, Key: currentFile.metadata.s3ID!}; + await removeChunksS3(params); + await File.deleteOne({_id: currentFile._id}); + + } catch (e) { + + console.log("Could Not Remove File", currentFile.filename, currentFile._id); + } + } + } } export default S3Service; \ No newline at end of file diff --git a/backend/services/FolderService/index.ts b/backend/services/FolderService/index.ts index 69de743..6f72758 100644 --- a/backend/services/FolderService/index.ts +++ b/backend/services/FolderService/index.ts @@ -25,102 +25,6 @@ class FolderService { return folder; } - deleteFolder = async(userID: string, folderID: string, parentList: string[]) => { - - let bucket = new mongoose.mongo.GridFSBucket(conn.db, { - chunkSizeBytes: 1024 * 255 - }); - - const videoBucket = new mongoose.mongo.GridFSBucket(conn.db, { - bucketName: "videos" - }); - - const parentListString = parentList.toString() - - await Folder.deleteMany({"owner": userID, "parentList": { $all: parentList}}) - await Folder.deleteMany({"owner": userID, "_id": folderID}); - - const fileList = await utilsFile.getFileListByParent(userID, parentListString); - - if (!fileList) throw new NotFoundError("Delete File List Not Found"); - - for (let i = 0; i < fileList.length; i++) { - - const currentFile = fileList[i]; - - try { - - if (currentFile.metadata.thumbnailID) { - - await Thumbnail.deleteOne({_id: currentFile.metadata.thumbnailID}); - } - - // if (currentFile.metadata.isVideo && currentFile.metadata.transcoded) { - - // try { - // await videoBucket.delete(new ObjectID(currentFile.metadata.transcodedID)) - // } catch (e) {console.log("Could Not Find Transcoded Video")} - - // } - - await bucket.delete(new ObjectID(currentFile._id)); - - } catch (e) { - - console.log("Could not delete file", currentFile.filename, currentFile._id); - } - - - } - } - - deleteAll = async(userID: string) => { - - console.log("remove all request") - - let bucket = new mongoose.mongo.GridFSBucket(conn.db, { - chunkSizeBytes: 1024 * 255 - }); - - const videoBucket = new mongoose.mongo.GridFSBucket(conn.db, { - bucketName: "videos" - }); - - await Folder.deleteMany({"owner": userID}); - - const fileList = await utilsFile.getFileListByOwner(userID); - - if (!fileList) throw new NotFoundError("Delete All File List Not Found Error"); - - for (let i = 0; i < fileList.length; i++) { - const currentFile = fileList[i]; - - try { - - if (currentFile.metadata.thumbnailID) { - - await Thumbnail.deleteOne({_id: currentFile.metadata.thumbnailID}) - } - - // if (currentFile.metadata.isVideo && currentFile.metadata.transcoded) { - - // try { - // await videoBucket.delete(ObjectID(currentFile.metadata.transcodedID)) - // } catch (e) { - // console.log("Cannot Find Transcoded Video"); - // } - - // } - - await bucket.delete(new ObjectID(currentFile._id)); - - } catch (e) { - - console.log("Could Not Remove File", currentFile.filename, currentFile._id); - } - } - } - getFolderInfo = async(userID: string, folderID: string) => { let currentFolder = await utilsFolder.getFolderInfo(folderID, userID); @@ -282,276 +186,4 @@ class FolderService { } } -// const FolderService = function() { - -// this.uploadFolder = async(data) => { - -// const folder = new Folder(data); - -// await folder.save(); - -// if (!folder) throw new InternalServerError("Upload Folder Error"); - -// return folder; -// } - -// this.deleteFolder = async(userID, folderID, parentList) => { - -// let bucket = new mongoose.mongo.GridFSBucket(conn.db, { -// chunkSizeBytes: 1024 * 255 -// }); - -// const videoBucket = new mongoose.mongo.GridFSBucket(conn.db, { -// bucketName: "videos" -// }); - -// const parentListString = parentList.toString() - -// await Folder.deleteMany({"owner": userID, "parentList": { $all: parentList}}) -// await Folder.deleteMany({"owner": userID, "_id": folderID}); - -// const fileList = await utilsFile.getFileListByParent(userID, parentListString); - -// if (!fileList) throw new NotFoundError("Delete File List Not Found"); - -// for (let i = 0; i < fileList.length; i++) { - -// const currentFile = fileList[i]; - -// try { - -// if (currentFile.metadata.thumbnailID) { - -// await Thumbnail.deleteOne({_id: currentFile.metadata.thumbnailID}); -// } - -// if (currentFile.metadata.isVideo && currentFile.metadata.transcoded) { - -// try { -// await videoBucket.delete(ObjectID(currentFile.metadata.transcodedID)) -// } catch (e) {console.log("Could Not Find Transcoded Video")} - -// } - -// await bucket.delete(ObjectID(currentFile._id)); - -// } catch (e) { - -// console.log("Could not delete file", currentFile.filename, currentFile._id); -// } - - -// } -// } - -// this.deleteAll = async(userID) => { - -// console.log("remove all request") - -// let bucket = new mongoose.mongo.GridFSBucket(conn.db, { -// chunkSizeBytes: 1024 * 255 -// }); - -// const videoBucket = new mongoose.mongo.GridFSBucket(conn.db, { -// bucketName: "videos" -// }); - -// await Folder.deleteMany({"owner": userID}); - -// const fileList = await utilsFile.getFileListByOwner(userID); - -// if (!fileList) throw new NotFoundError("Delete All File List Not Found Error"); - -// for (let i = 0; i < fileList.length; i++) { -// const currentFile = fileList[i]; - -// try { - -// if (currentFile.metadata.thumbnailID) { - -// await Thumbnail.deleteOne({_id: currentFile.metadata.thumbnailID}) -// } - -// if (currentFile.metadata.isVideo && currentFile.metadata.transcoded) { - -// try { -// await videoBucket.delete(ObjectID(currentFile.metadata.transcodedID)) -// } catch (e) { -// console.log("Cannot Find Transcoded Video"); -// } - -// } - -// await bucket.delete(ObjectID(currentFile._id)); - -// } catch (e) { - -// console.log("Could Not Remove File", currentFile.filename, currentFile._id); -// } -// } - -// } - -// this.getFolderInfo = async(userID, folderID) => { - -// let currentFolder = await utilsFolder.getFolderInfo(folderID, userID); - -// if (!currentFolder) throw new NotFoundError("Folder Info Not Found Error"); - -// const parentID = currentFolder.parent; - -// let parentName = ""; - -// if (parentID === "/") { - -// parentName = "Home" - -// } else { - -// const parentFolder = await utilsFolder.getFolderInfo(parentID, userID); - -// if (parentFolder) { - -// parentName = parentFolder.name; - -// } else { - -// parentName = "Unknown" -// } - -// } - -// const folderName = currentFolder.name - -// currentFolder = {...currentFolder._doc, parentName, folderName} -// // Must Use ._doc here, or the destucturing/spreading -// // Will add a bunch of unneeded variables to the object. - -// return currentFolder; -// } - -// this.getFolderSublist = async(userID, folderID) => { - -// const folder = await utilsFolder.getFolderInfo(folderID, userID); - -// if (!folder) throw new NotFoundError("Folder Sublist Not Found Error"); - -// const subfolderList = folder.parentList; - -// let folderIDList = []; -// let folderNameList = []; - -// for (let i = 0; i < subfolderList.length; i++) { - -// const currentSubFolderID = subfolderList[i]; - -// if (currentSubFolderID === "/") { - -// folderIDList.push("/"); -// folderNameList.push("Home") - -// } else { - -// const currentFolder = await utilsFolder.getFolderInfo(currentSubFolderID, userID); - -// folderIDList.push(currentFolder._id); -// folderNameList.push(currentFolder.name) -// } -// } - -// folderIDList.push(folderID); -// folderNameList.push(folder.name) - -// return { -// folderIDList, -// folderNameList -// } - -// } - -// this.getFolderList = async(userID, query) => { - -// let searchQuery = query.search || ""; -// const parent = query.parent || "/"; -// let sortBy = query.sortby || "DEFAULT" -// sortBy = sortBySwitch(sortBy) - -// if (searchQuery.length === 0) { - -// const folderList = await utilsFolder.getFolderListByParent(userID, parent, sortBy); - -// if (!folderList) throw new NotFoundError("Folder List Not Found Error"); - -// return folderList; - -// } else { - -// searchQuery = new RegExp(searchQuery, 'i') -// const folderList = await utilsFolder.getFolderListBySearch(userID, searchQuery, sortBy); - -// if (!folderList) throw new NotFoundError("Folder List Not Found Error"); - -// return folderList; -// } -// } - -// this.renameFolder = async(userID, folderID, title) => { - -// const folder = await utilsFolder.renameFolder(folderID, userID, title); - -// if (!folder) throw new NotFoundError("Rename Folder Not Found"); -// } - -// this.moveFolder = async(userID, folderID, parentID) => { - -// let parentList = ["/"]; - -// if (parentID.length !== 1) { - -// const parentFile = await utilsFolder.getFolderInfo(parentID, userID); -// parentList = parentFile.parentList; -// parentList.push(parentID); -// } - -// const folder = await utilsFolder.moveFolder(folderID, userID, parentID, parentList); - -// if (!folder) throw new NotFoundError("Move Folder Not Found") - -// const folderChilden = await utilsFolder.findAllFoldersByParent(folderID.toString(), userID); - -// folderChilden.map( async(currentFolderChild) => { - -// let currentFolderChildParentList = currentFolderChild.parentList; - -// const indexOfFolderID = currentFolderChildParentList.indexOf(folderID.toString()); - -// currentFolderChildParentList = currentFolderChildParentList.splice(indexOfFolderID); - -// currentFolderChildParentList = [...parentList, ...currentFolderChildParentList]; - -// currentFolderChild.parentList = currentFolderChildParentList; - -// await currentFolderChild.save() -// }) - -// const fileChildren = await utilsFile.getFileListByParent(userID, folderID.toString()); - -// fileChildren.map( async(currentFileChild) => { - -// let currentFileChildParentList = currentFileChild.metadata.parentList; - -// currentFileChildParentList = currentFileChildParentList.split(","); - -// const indexOfFolderID = currentFileChildParentList.indexOf(folderID.toString()); - -// currentFileChildParentList = currentFileChildParentList.splice(indexOfFolderID); - -// currentFileChildParentList = [...parentList, ...currentFileChildParentList]; - -// await utilsFile.moveFile(currentFileChild._id, userID, currentFileChild.metadata.parent, currentFileChildParentList.toString()) - -// }) -// } -// } - export default FolderService; \ No newline at end of file diff --git a/backend/services/UserService/index.ts b/backend/services/UserService/index.ts index a3faeb6..fc09e63 100644 --- a/backend/services/UserService/index.ts +++ b/backend/services/UserService/index.ts @@ -93,75 +93,4 @@ class UserService { } -// const UserService = function() { - -// this.login = async(userData) => { - -// const email = userData.email; -// const password = userData.password; - -// const user = await User.findByCreds(email, password); - -// const token = await user.generateAuthToken(); - -// if (!user || !token) throw new NotFoundError("Login User Not Found Error"); - -// return {user, token} -// } - -// this.logout = async(user, userToken) => { - -// user.tokens = user.tokens.filter((token) => { -// return token.token !== userToken; -// }) - -// await user.save(); -// } - -// this.logoutAll = async(user) => { - -// user.tokens = [] -// user.tempTokens = []; - -// await user.save(); -// } - -// this.create = async(userData) => { - -// console.log("Create"); - -// const user = new User(userData); -// await user.save(); - -// await user.generateEncryptionKeys(); - -// const token = await user.generateAuthToken(); - -// if (!user || !token) throw new InternalServerError("Could Not Create New User Error"); - -// return {user, token} -// } - -// this.changePassword = async(user, oldPassword, newPassword) => { - -// const isMatch = await bcrypt.compare(oldPassword, user.password); - -// if (!isMatch) throw new NotAuthorizedError("Change Passwords Do Not Match Error"); - -// const encryptionKey = user.getEncryptionKey(); - -// user.password = newPassword; - -// user.tokens = []; -// user.tempTokens = []; - -// await user.save(); -// await user.changeEncryptionKey(encryptionKey); - -// const newToken = await user.generateAuthToken(); - -// return newToken; -// } -// } - export default UserService; \ No newline at end of file