124_webcalibre2/src/app/dashboard/sync-actions.ts

52 lines
1.6 KiB
TypeScript
Raw Normal View History

'use server';
import { auth } from "@/auth";
import { prisma } from "@/lib/prisma";
import { revalidatePath } from "next/cache";
export async function syncOneDrive() {
const session = await auth();
if (!session?.user?.id) throw new Error("Unauthorized");
// 1. Get the OAuth token from your PostgreSQL 'Account' table
const account = await prisma.account.findFirst({
where: { userId: session.user.id },
});
if (!account?.access_token) throw new Error("Microsoft account not linked properly");
// 2. Fetch the files from Microsoft Graph
const response = await fetch("https://graph.microsoft.com/v1.0/me/drive/root/children", {
headers: { Authorization: `Bearer ${account.access_token}` },
});
const data = await response.json();
// 3. The "Sync Loop": Map OneDrive items to your Postgres FileNode table
for (const item of data.value) {
const extension = item.name.split('.').pop()?.toUpperCase() || (item.folder ? 'FOLDER' : 'UNKNOWN');
await prisma.fileNode.upsert({
where: { oneDriveId: item.id },
update: {
name: item.name,
size: item.size,
metadata: { type: extension }, // Store the "Type" in your JSONB field
},
create: {
oneDriveId: item.id,
name: item.name,
size: item.size,
isFolder: !!item.folder,
path: item.parentReference.path + '/' + item.name,
ownerId: session.user.id,
metadata: { type: extension },
}
});
}
// Refresh the dashboard UI to show new data
revalidatePath('/dashboard');
return { success: true, count: data.value.length };
}