Files
myDrive/backend/db/mongoDB/folderDB.ts
T
oxmc ecc340e7b1
Release Please / release-please (push) Has been cancelled
Docker Build and Push (Development) / build-and-push-dev (push) Has been cancelled
feat: add dark mode UI and SQLite as alternate database backend
Dark mode: CSS custom properties + .dark class toggled via Redux/localStorage,
with a theme toggle in the Header and Settings page. Foundation didn't exist
yet despite prior assumption, so it was built from scratch.

SQLite: new DB_ENGINE=mongo|sqlite env var selects the metadata backend at
runtime (Mongo stays default, no behavior change unless opted in). File/thumbnail
bytes continue to use the existing fs/S3 storage path. Implemented via a shared
DB interface (dbTypes.ts) with parallel mongoDB/ and sqliteDB/ implementations,
selected through dbFactory.ts, with JWT/encryption logic extracted into
userCrypto.ts so both engines share it.
2026-07-05 04:18:33 -07:00

253 lines
5.1 KiB
TypeScript

import Folder, { FolderInterface } from "../../models/folder-model";
import { ObjectId } from "mongodb";
import { FolderListQueryType } from "../../types/folder-types";
import { createFolderQuery } from "../../utils/createQuery";
import sortBySwitch from "../../utils/sortBySwitchFolder";
import { IFolderDB } from "../dbTypes";
class DbUtil implements IFolderDB {
constructor() {}
// READ
getFolderSearchList = async (
userID: string,
searchQuery: RegExp,
trashMode: boolean
) => {
let query: any = {
owner: userID,
name: searchQuery,
trashed: trashMode ? true : null,
};
const folderList = await Folder.find(query).limit(10);
return folderList;
};
getFolderInfo = async (folderID: string, userID: string) => {
const folder = await Folder.findOne({
owner: userID,
_id: new ObjectId(folderID),
});
return folder;
};
getFolderList = async (queryData: FolderListQueryType, sortBy: string) => {
const query = createFolderQuery(queryData);
const sortByQuery = sortBySwitch(sortBy);
const folderList = await Folder.find(query).sort(sortByQuery);
return folderList;
};
getMoveFolderList = async (
userID: string,
parent = "/",
search?: string,
folderIDs?: string[]
) => {
let query: any = {
owner: userID,
};
// const idQuery = [];
// if (currentParent && currentParent !== "/") {
// idQuery.push(currentParent);
// }
// if (folderID) {
// query.parentList = { $ne: folderID };
// idQuery.push(folderID);
// }
if (folderIDs && folderIDs.length > 0) {
query._id = { $nin: folderIDs };
query.parentList = { $nin: folderIDs };
}
// query._id = { $nin: idQuery };
if (!search || search === "") {
query.parent = parent;
}
if (search && search !== "") {
query.name = new RegExp(search, "i");
}
query.trashed = null;
const result = await Folder.find(query).sort({ createdAt: -1 });
return result;
};
getFolderListByIncludedParent = async (userID: string, parent: string) => {
const folderList = await Folder.find({
owner: userID,
parentList: {
$in: parent,
},
trashed: null,
});
return folderList;
};
findAllFoldersByParent = async (parentID: string, userID: string) => {
const folderList = await Folder.find({
parentList: parentID,
owner: userID,
});
return folderList;
};
// UPDATE
moveFolder = async (
folderID: string,
userID: string,
parent: string,
parentList: string[]
) => {
const folder = await Folder.findOne({
_id: new ObjectId(folderID),
owner: userID,
});
if (!folder) return null;
folder.parent = parent;
folder.parentList = parentList;
await folder.save();
return folder;
};
renameFolder = async (folderID: string, userID: string, title: string) => {
const folder = await Folder.findOne({
_id: new ObjectId(folderID),
owner: userID,
});
if (!folder) return null;
folder.name = title;
await folder.save();
return folder;
};
trashFoldersByParent = async (parentList: string[], userID: string) => {
const result = await Folder.updateMany(
{
owner: userID,
parentList: { $all: parentList },
},
{
$set: {
trashed: true,
},
}
);
return result;
};
restoreFolder = async (folderID: string, userID: string) => {
const folder = await Folder.findOne({
_id: new ObjectId(folderID),
owner: userID,
});
if (!folder) return null;
folder.trashed = null;
await folder.save();
return folder;
};
restoreFoldersByParent = async (parentList: string[], userID: string) => {
const result = await Folder.updateMany(
{
owner: userID,
parentList: { $all: parentList },
},
{
$set: {
trashed: null,
},
}
);
return result;
};
trashFolder = async (folderID: string, userID: string) => {
const folder = await Folder.findOne({
_id: new ObjectId(folderID),
owner: userID,
});
if (!folder) return null;
folder.trashed = true;
await folder.save();
return folder;
};
// CREATE
createFolder = async (folderData: {
name: string;
parent: string;
parentList: string[];
owner: string;
}) => {
const folder = new Folder(folderData);
await folder.save();
return folder;
};
// DELETE
deleteFolder = async (folderID: string, userID: string) => {
const result = await Folder.deleteOne({
_id: new ObjectId(folderID),
owner: userID,
});
return result;
};
deleteFoldersByParentList = async (
parentList: (string | ObjectId)[],
userID: string
) => {
const result = await Folder.deleteMany({
owner: userID,
parentList: { $all: parentList },
});
return result;
};
deleteFoldersByOwner = async (userID: string) => {
const result = await Folder.deleteMany({ owner: userID });
return result;
};
}
export default DbUtil;