include-admin-orphans.go (1588B)
1 package main 2 3 import ( 4 "log" 5 "net/http" 6 "os" 7 ) 8 9 type OrphanData struct { 10 Orphans []string // on disk, not in DB 11 ReverseOrphans []string // in DB, not on disk 12 } 13 14 func getOrphanedFiles(uploadDir string) (OrphanData, error) { 15 diskFiles, err := getFilesOnDisk(uploadDir) 16 if err != nil { 17 return OrphanData{}, err 18 } 19 dbFiles, err := getFilesInDB() 20 if err != nil { 21 return OrphanData{}, err 22 } 23 24 // Build a set of disk files for reverse lookup 25 diskFileSet := make(map[string]bool, len(diskFiles)) 26 for _, f := range diskFiles { 27 diskFileSet[f] = true 28 } 29 30 var orphans []string 31 for _, f := range diskFiles { 32 if !dbFiles[f] { 33 orphans = append(orphans, f) 34 } 35 } 36 37 var reverseOrphans []string 38 for f := range dbFiles { 39 if !diskFileSet[f] { 40 reverseOrphans = append(reverseOrphans, f) 41 } 42 } 43 44 return OrphanData{ 45 Orphans: orphans, 46 ReverseOrphans: reverseOrphans, 47 }, nil 48 } 49 50 func orphansHandler(w http.ResponseWriter, r *http.Request) { 51 orphanData, err := getOrphanedFiles(config.UploadDir) 52 if err != nil { 53 log.Printf("Error: orphansHandler: failed to read orphaned files: %v", err) 54 renderError(w, "Error reading orphaned files", http.StatusInternalServerError) 55 return 56 } 57 pageData := buildPageData("Orphaned Files", orphanData) 58 renderTemplate(w, "orphans.html", pageData) 59 } 60 61 func getFilesOnDisk(uploadDir string) ([]string, error) { 62 entries, err := os.ReadDir(uploadDir) 63 if err != nil { 64 return nil, err 65 } 66 var files []string 67 for _, e := range entries { 68 if !e.IsDir() { 69 files = append(files, e.Name()) 70 } 71 } 72 return files, nil 73 }