124_webcalibre2/src/data-access/file-nodes.ts

112 lines
2.6 KiB
TypeScript
Raw Normal View History

2026-01-16 05:22:00 +00:00
// src/data-access/file-nodes.ts
import "server-only";
2026-01-21 01:34:02 +00:00
import { getOneDriveFileBuffer } from "@/services/onedrive";
import { extractMetadata } from "@/lib/metadata-extractor";
2026-01-16 05:22:00 +00:00
import { prisma } from "@/lib/prisma";
2026-01-21 01:34:02 +00:00
2026-01-16 05:22:00 +00:00
/**
* FETCH: Retrieve all nodes for the dashboard.
* Centralizing this here allows us to change sort order or filters
* in one place for the entire application.
*/
export async function getAllFileNodes() {
return await prisma.fileNode.findMany({
orderBy: {
updatedAt: 'desc',
},
});
}
/**
* FETCH: Get a single node by ID.
* Used by the Download route and Update pages to verify a file exists.
*/
export async function getFileNodeById(id: string) {
return await prisma.fileNode.findUnique({
where: { id },
});
}
/**
* UPDATE: Modify metadata, name, or virtual location.
* This function accepts the data object to keep the DAL flexible.
*/
export async function updateFileNode(id: string, data: any) {
return await prisma.fileNode.update({
where: { id },
data: {
...data,
updatedAt: new Date(),
},
});
}
/**
* DELETE: Remove the record from the database.
* Cloud deletion should be handled by the Service Layer before calling this.
*/
export async function deleteFileNode(id: string) {
return await prisma.fileNode.delete({
where: { id },
});
}
/**
* MASTER CREATE: Handles both standard uploads and virtual folders.
* If no ID is provided, it generates a fresh UUID.
*/
export async function createFileNode(data: {
id?: string; // Optional: used for virtual folders/UUID storage
oneDriveId: string | null;
name: string;
description?: string;
isFolder: boolean;
path: string;
ownerId: string;
parentId?: string | null; // Optional: for nested structures
size?: bigint;
metadata: any;
}) {
return await prisma.fileNode.create({
data: {
...data,
id: data.id ?? crypto.randomUUID(), // Use provided ID or generate new one
}
});
}
// ... other functions (getAllFileNodes, etc)
/**
* UPSERT: Create or Update a file node based on OneDrive ID
* Moved here because it interacts with the Database.
*/
export async function upsertFileNode(oneDriveId: string, data: any) {
return await prisma.fileNode.upsert({
where: { oneDriveId },
update: {
name: data.name,
size: data.size,
isFolder: data.isFolder,
path: data.path,
updatedAt: new Date(),
},
create: {
id: crypto.randomUUID(),
oneDriveId: oneDriveId,
name: data.name,
size: data.size,
isFolder: data.isFolder,
path: data.path,
ownerId: data.ownerId,
metadata: data.metadata,
}
});
2026-01-21 01:34:02 +00:00
}