import { prismaClient as prisma } from '../../prismaClient' export const deleteFolderCascade = async (folderId: string) => { return deleteFolderCascadeInternal(folderId, folderId) } async function deleteFolderCascadeInternal(folderId: string, rootFolderId: string) { const folder = await prisma.folder.findOne({ where: { id: folderId }, select: { id: true, other_Folder: { select: { id: true, files: { select: { id: true }, }, }, }, }, }) const childFoldersOfFolder = folder.other_Folder const filesOfFolder = folder.other_Folder.flatMap((folder) => folder.files) await prisma.file.deleteMany({ where: { id: { in: filesOfFolder.map((file) => file?.id) } } }) // This deletes the children folders childFoldersOfFolder.forEach(async (folder) => { await deleteFolderCascadeInternal(folder.id, rootFolderId) }) // This deletes the current parent folder. In one case, this will be the rootFolderId and it will be returned to the original calling function. const deletedFolder = await prisma.folder.delete({ where: { id: folderId } }) if (folderId === rootFolderId) { return deletedFolder } }