import type { ResumeData } from "@/types/resume"; import { getFileHandle, verifyPermission } from "@/utils/fileSystem"; type SyncResult = { synced: number; skipped: number; failed: number; }; const isResumeData = (value: unknown): value is ResumeData => { if (!value || typeof value !== "object") { return false; } const resume = value as Partial; return typeof resume.id === "string" && resume.id.length > 0; }; export const syncResumesFromDirectory = async ( updateResumeFromFile: ( resume: ResumeData, sourceModifiedAt?: number ) => boolean ): Promise => { const result: SyncResult = { synced: 0, skipped: 0, failed: 0, }; if (typeof window === "undefined" || typeof indexedDB === "undefined") { return result; } try { const handle = await getFileHandle("syncDirectory"); if (!handle || handle.kind !== "directory") { return result; } const hasPermission = await verifyPermission(handle, "read"); if (!hasPermission) { return result; } const dirHandle = handle as FileSystemDirectoryHandle; const entries = (dirHandle as any).values?.(); if (!entries) { return result; } for await (const entry of entries) { if (entry.kind !== "file" || !entry.name.endsWith(".json")) { result.skipped += 1; continue; } try { const file = await entry.getFile(); const content = await file.text(); const resumeData = JSON.parse(content); if (!isResumeData(resumeData)) { result.skipped += 1; continue; } const imported = updateResumeFromFile(resumeData, file.lastModified); if (imported) { result.synced += 1; } else { result.skipped += 1; } } catch (error) { result.failed += 1; console.error(`Error reading resume file "${entry.name}":`, error); } } } catch (error) { console.error("Error syncing resumes from files:", error); } return result; };