Files
myDrive/backend/services/FolderService/index.ts
T
2024-08-04 03:51:56 -04:00

332 lines
8.8 KiB
TypeScript

import Folder, { FolderInterface } 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";
import { UserInterface } from "../../models/user";
type userAccessType = {
_id: string;
emailVerified: boolean;
email: string;
s3Enabled: boolean;
};
const utilsFile = new UtilsFile();
const utilsFolder = new UtilsFolder();
class FolderService {
createFolder = async (userID: string, name: string, parent: string) => {
const newFolderParentList = [];
if (parent && parent !== "/") {
const parentFolder = await utilsFolder.getFolderInfo(parent, userID);
if (!parentFolder) throw new Error("Parent not found");
newFolderParentList.push(
...parentFolder.parentList,
parentFolder._id?.toString()
);
} else {
newFolderParentList.push("/");
}
const newFolderData = {
name,
parent: parent || "/",
parentList: newFolderParentList,
owner: userID,
};
const folder = new Folder(newFolderData);
await folder.save();
if (!folder) throw new InternalServerError("Upload Folder Error");
return folder;
};
getFolderInfo = async (userID: string, folderID: string) => {
const currentFolder = await utilsFolder.getFolderInfo(folderID, userID);
if (!currentFolder) throw new NotFoundError("Folder Info Not Found Error");
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
);
if (!currentFolder) throw new NotFoundError("Folder Info Not Found");
folderIDList.push(currentFolder._id);
folderNameList.push(currentFolder.name);
}
}
folderIDList.push(folderID);
folderNameList.push(folder.name);
return {
folderIDList,
folderNameList,
};
};
getFolderList = async (user: userAccessType | UserInterface, query: any) => {
const userID = user._id;
let searchQuery = query.search || "";
const parent = query.parent || "/";
let sortBy = query.sortBy || "DEFAULT";
const type = query.type;
const storageType = query.storageType || undefined;
const folderSearch = query.folder_search || undefined;
const itemType = query.itemType || undefined;
const trashMode = query.trashMode === "true";
sortBy = sortBySwitch(sortBy);
const s3Enabled = user.s3Enabled ? true : false;
if (searchQuery.length === 0) {
const folderList = await utilsFolder.getFolderListByParent(
userID.toString(),
parent,
sortBy,
s3Enabled,
type,
storageType,
itemType,
trashMode
);
if (!folderList) throw new NotFoundError("Folder List Not Found Error");
return folderList;
} else {
searchQuery = new RegExp(searchQuery, "i");
const folderList = await utilsFolder.getFolderListBySearch(
userID.toString(),
searchQuery,
sortBy,
type,
parent,
storageType,
folderSearch,
itemType,
s3Enabled,
trashMode
);
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");
};
getSubfolderFullList = async (user: userAccessType, id: string) => {
const userID = user._id;
const folder = await utilsFolder.getFolderInfo(id, userID);
if (!folder) throw new NotFoundError("Folder Info Not Found");
const subFolders = await this.getFolderList(user, { parent: id }); //folderService.getFolderList(user._id, {parent: id})
let folderList: any[] = [];
const rootID = "/";
let currentID = folder.parent;
folderList.push({
_id: folder._id,
parent: folder._id,
name: folder.name,
subFolders: subFolders,
});
while (true) {
if (rootID === currentID) break;
const currentFolder = await this.getFolderInfo(userID, currentID);
const currentSubFolders = await this.getFolderList(user, {
parent: currentFolder._id,
});
folderList.splice(0, 0, {
_id: currentFolder._id,
parent: currentFolder._id,
name: currentFolder.name,
subFolders: currentSubFolders,
});
currentID = currentFolder.parent;
}
return folderList;
};
trashFolder = async (userID: string, folderID: string) => {
const folder = await utilsFolder.getFolderInfo(folderID, userID);
if (!folder) throw new NotFoundError("Trash Folder Not Found Error");
folder.trashed = true;
await folder.save();
const parentList = [...folder.parentList, folder._id!.toString()];
await utilsFolder.trashFoldersByParent(parentList, userID);
await utilsFile.trashFilesByParent(parentList.toString(), userID);
};
restoreFolder = async (userID: string, folderID: string) => {
const folder = await utilsFolder.getFolderInfo(folderID, userID);
if (!folder) throw new NotFoundError("Restore Folder Not Found Error");
folder.trashed = null;
await folder.save();
const parentList = [...folder.parentList, folder._id!.toString()];
await utilsFolder.restoreFoldersByParent(parentList, userID);
await utilsFile.restoreFilesByParent(parentList.toString(), userID);
};
renameFolder2 = async (folderID: string, userID: string, title: string) => {
const folder = await utilsFolder.getFolderInfo(folderID, userID);
if (!folder) throw new NotFoundError("Rename Folder Not Found");
folder.name = title;
await folder.save();
};
getMoveFolderList = async (
userID: string,
parent?: string,
search?: string,
folderID?: string,
currentParent?: string
) => {
const folderList = await utilsFolder.getMoveFolderList(
userID,
parent,
search,
folderID,
currentParent
);
return folderList;
};
moveFolder = async (userID: string, folderID: string, parentID: string) => {
let parentList = ["/"];
if (parentID.length !== 1) {
const parentFile = await utilsFolder.getFolderInfo(parentID, userID);
if (!parentFile) throw new NotFoundError("Parent Folder Info Not Found");
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,
];
if (currentFileChild._id) {
await utilsFile.moveFile(
currentFileChild._id,
userID,
currentFileChild.metadata.parent,
currentFileChildParentList.toString()
);
}
});
};
}
export default FolderService;