Files
myDrive/backend/services/FolderService/index.ts
T

185 lines
5.5 KiB
TypeScript

import Folder from "../../models/folder";
import InternalServerError from "../../utils/InternalServerError";
import NotFoundError from "../../utils/NotFoundError";
import UtilsFile from "../../db/utils/fileUtils";
import UtilsFolder from "../../db/utils/folderUtils";
import sortBySwitch from "../../utils/sortBySwitchFolder";
const utilsFile = new UtilsFile();
const utilsFolder = new UtilsFolder();
class FolderService {
uploadFolder = async(data: any) => {
const folder = new Folder(data);
await folder.save();
if (!folder) throw new InternalServerError("Upload Folder Error");
return folder;
}
getFolderInfo = async(userID: string, folderID: string) => {
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;
}
getFolderSublist = async(userID: string, folderID: string) => {
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
}
}
getFolderList = async(userID: string, query: any) => {
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;
}
}
renameFolder = async(userID: string, folderID: string, title: string) => {
const folder = await utilsFolder.renameFolder(folderID, userID, title);
if (!folder) throw new NotFoundError("Rename Folder Not Found");
}
moveFolder = async(userID: string, folderID: string, parentID: string) => {
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: string | string[] = 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;