File size: 2,077 Bytes
aa1ee73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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<ResumeData>;
  return typeof resume.id === "string" && resume.id.length > 0;
};

export const syncResumesFromDirectory = async (
  updateResumeFromFile: (
    resume: ResumeData,
    sourceModifiedAt?: number
  ) => boolean
): Promise<SyncResult> => {
  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;
};