feat(cloud-page) - wip - UI fixed, functionalities done, view/downlaod to be done
This commit is contained in:
@@ -69,9 +69,7 @@ router.get(
|
||||
return res.json({
|
||||
error: false,
|
||||
data: paged,
|
||||
total: folders.length,
|
||||
limit,
|
||||
offset,
|
||||
totalCount: folders.length,
|
||||
});
|
||||
} catch (err) {
|
||||
return sendError(res, 500, "Failed to load child folders", err);
|
||||
@@ -103,9 +101,9 @@ router.get(
|
||||
|
||||
try {
|
||||
const files = await storage.listFilesInFolder(parentId, limit, offset);
|
||||
const total = await storage.countFilesInFolder(parentId);
|
||||
const totalCount = await storage.countFilesInFolder(parentId);
|
||||
const serialized = files.map(serializeFile);
|
||||
return res.json({ error: false, data: serialized, total, limit, offset });
|
||||
return res.json({ error: false, data: serialized, totalCount });
|
||||
} catch (err) {
|
||||
return sendError(res, 500, "Failed to load files for folder", err);
|
||||
}
|
||||
@@ -121,20 +119,40 @@ router.get(
|
||||
const limit = parsePositiveInt(req.query.limit, 50);
|
||||
const offset = parsePositiveInt(req.query.offset, 0);
|
||||
try {
|
||||
const folders = await storage.listRecentFolders(limit, offset);
|
||||
const total = await storage.countFolders();
|
||||
return res.json({ error: false, data: folders, total, limit, offset });
|
||||
// Always request top-level folders (parentId = null)
|
||||
const parentId: number | null = null;
|
||||
const folders = await storage.listRecentFolders(limit, offset, parentId);
|
||||
const totalCount = await storage.countFoldersByParent(parentId);
|
||||
|
||||
return res.json({
|
||||
error: false,
|
||||
data: folders,
|
||||
totalCount,
|
||||
});
|
||||
} catch (err) {
|
||||
return sendError(res, 500, "Failed to load recent folders");
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
/* ---------- Folder CRUD ----------
|
||||
POST /folders { userId, name, parentId? }
|
||||
PUT /folders/:id { name?, parentId? }
|
||||
DELETE /folders/:id
|
||||
*/
|
||||
// ---------- Folder CRUD ----------
|
||||
router.get(
|
||||
"/folders/:id",
|
||||
async (req: Request, res: Response): Promise<any> => {
|
||||
const id = Number.parseInt(req.params.id ?? "", 10);
|
||||
if (!Number.isInteger(id) || id <= 0)
|
||||
return sendError(res, 400, "Invalid folder id");
|
||||
|
||||
try {
|
||||
const folder = await storage.getFolder(id);
|
||||
if (!folder) return sendError(res, 404, "Folder not found");
|
||||
return res.json({ error: false, data: folder });
|
||||
} catch (err) {
|
||||
return sendError(res, 500, "Failed to load folder");
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
router.post("/folders", async (req: Request, res: Response): Promise<any> => {
|
||||
const { userId, name, parentId } = req.body;
|
||||
if (!userId || typeof name !== "string" || !name.trim()) {
|
||||
@@ -210,9 +228,9 @@ router.get(
|
||||
|
||||
try {
|
||||
const files = await storage.listFilesInFolder(folderId, limit, offset);
|
||||
const total = await storage.countFilesInFolder(folderId);
|
||||
const totalCount = await storage.countFilesInFolder(folderId);
|
||||
const serialized = files.map(serializeFile);
|
||||
return res.json({ error: false, data: serialized, total, limit, offset });
|
||||
return res.json({ error: false, data: serialized, totalCount });
|
||||
} catch (err) {
|
||||
return sendError(res, 500, "Failed to list files for folder");
|
||||
}
|
||||
@@ -415,7 +433,7 @@ router.get(
|
||||
|
||||
try {
|
||||
const { data, total } = await storage.searchFolders(q, limit, offset);
|
||||
return res.json({ error: false, data, total, limit, offset });
|
||||
return res.json({ error: false, data, totalCount: total });
|
||||
} catch (err) {
|
||||
return sendError(res, 500, "Folder search failed");
|
||||
}
|
||||
@@ -440,7 +458,7 @@ router.get(
|
||||
try {
|
||||
const { data, total } = await storage.searchFiles(q, type, limit, offset);
|
||||
const serialized = data.map(serializeFile);
|
||||
return res.json({ error: false, data: serialized, total, limit, offset });
|
||||
return res.json({ error: false, data: serialized, totalCount: total });
|
||||
} catch (err) {
|
||||
return sendError(res, 500, "File search failed");
|
||||
}
|
||||
|
||||
@@ -40,13 +40,16 @@ async function updateFolderTimestampsRecursively(folderId: number | null) {
|
||||
export interface IStorage {
|
||||
// Folders
|
||||
getFolder(id: number): Promise<CloudFolder | null>;
|
||||
listFoldersByParent(
|
||||
parentId: number | null,
|
||||
listRecentFolders(
|
||||
limit: number,
|
||||
offset: number
|
||||
offset: number,
|
||||
parentId?: number | null
|
||||
): Promise<CloudFolder[]>;
|
||||
countFoldersByParent(parentId: number | null): Promise<number>;
|
||||
listRecentFolders(limit: number, offset: number): Promise<CloudFolder[]>;
|
||||
countFolders(filter?: {
|
||||
userId?: number;
|
||||
nameContains?: string | null;
|
||||
}): Promise<number>;
|
||||
createFolder(
|
||||
userId: number,
|
||||
name: string,
|
||||
@@ -57,10 +60,6 @@ export interface IStorage {
|
||||
updates: Partial<{ name?: string; parentId?: number | null }>
|
||||
): Promise<CloudFolder | null>;
|
||||
deleteFolder(id: number): Promise<boolean>;
|
||||
countFolders(filter?: {
|
||||
userId?: number;
|
||||
nameContains?: string | null;
|
||||
}): Promise<number>;
|
||||
|
||||
// Files
|
||||
getFile(id: number): Promise<CloudFile | null>;
|
||||
@@ -120,17 +119,23 @@ export const cloudStorage: IStorage = {
|
||||
return (folder as unknown as CloudFolder) ?? null;
|
||||
},
|
||||
|
||||
async listFoldersByParent(
|
||||
parentId: number | null = null,
|
||||
limit = 50,
|
||||
offset = 0
|
||||
) {
|
||||
async listRecentFolders(limit = 50, offset = 0, parentId?: number | null) {
|
||||
const where: any = {};
|
||||
|
||||
// parentId === undefined → no filter (global recent)
|
||||
// parentId === null → top-level folders (parent IS NULL)
|
||||
// parentId === number → children of that folder
|
||||
if (parentId !== undefined) {
|
||||
where.parentId = parentId;
|
||||
}
|
||||
|
||||
const folders = await db.cloudFolder.findMany({
|
||||
where: { parentId },
|
||||
orderBy: { name: "asc" },
|
||||
where,
|
||||
orderBy: { updatedAt: "desc" },
|
||||
skip: offset,
|
||||
take: limit,
|
||||
});
|
||||
|
||||
return folders as unknown as CloudFolder[];
|
||||
},
|
||||
|
||||
@@ -138,15 +143,6 @@ export const cloudStorage: IStorage = {
|
||||
return db.cloudFolder.count({ where: { parentId } });
|
||||
},
|
||||
|
||||
async listRecentFolders(limit = 50, offset = 0) {
|
||||
const folders = await db.cloudFolder.findMany({
|
||||
orderBy: { updatedAt: "desc" },
|
||||
skip: offset,
|
||||
take: limit,
|
||||
});
|
||||
return folders as unknown as CloudFolder[];
|
||||
},
|
||||
|
||||
async createFolder(
|
||||
userId: number,
|
||||
name: string,
|
||||
|
||||
Reference in New Issue
Block a user