package main import ( "backend/config" "backend/queries" "backend/typesdefs" "backend/utils" "fmt" "log" "os" "path/filepath" "slices" ) type ImageRefManager struct { } func NewImageRefManager() *ImageRefManager { return &ImageRefManager{} } // add or update the miogest url in the miogest_images_ref table to keep track of the images associated with each codice func (i *ImageRefManager) InsertImagesMiogestRef(annunci *typesdefs.AnnunciXML) error { return queries.ImagesBatchInsert(annunci) } func (i *ImageRefManager) GetImageCodesForProcessing(annunci *typesdefs.AnnunciXML) ([]string, error) { db_images, err := queries.ImagesGetAll() if err != nil { return nil, err } dbImagesMap := make(map[string][]string) // Convert slice to map for faster lookup for _, ref := range db_images { if ref.Foto != nil { dbImagesMap[ref.Codice] = *ref.Foto } } var result []string for _, annuncio := range annunci.Annuncio { if annuncio.Codice != nil && annuncio.Foto != nil { refFoto, existsInDb := dbImagesMap[*annuncio.Codice] if !existsInDb { fmt.Println("new codice", *annuncio.Codice) result = append(result, *annuncio.Codice) continue } if len(*annuncio.Foto) != len(refFoto) { fmt.Println("Different length", *annuncio.Foto, refFoto) result = append(result, *annuncio.Codice) continue } for i, foto := range *annuncio.Foto { if foto != refFoto[i] { fmt.Println("Different content", *annuncio.Foto, refFoto) result = append(result, *annuncio.Codice) break } } } } return result, nil } func (i *ImageRefManager) ClearImages(to_clear []string) error { for _, codice := range to_clear { folder := filepath.Join(config.Cfg.Images.Path, codice) err := utils.SafeRemoveAll(folder) if err != nil { return err } } return nil } func (i *ImageRefManager) RemoveImage(to_clear string) error { folder := filepath.Join(config.Cfg.Images.Path, to_clear) fmt.Println("Removing folder:", folder) exists, err := utils.PathExists(folder) fmt.Println("Folder exists:", exists) if err != nil { return err } if folder != "" && exists { fmt.Println("Removing folder:", folder) err := os.RemoveAll(folder) fmt.Println("Folder removed:", folder) if err != nil { return err } } err = queries.ImagesClearByCodice(to_clear) fmt.Println("DB entries removed for codice:", to_clear) if err != nil { return err } return nil } func difference(a, b []string) []string { var diff []string for _, v := range a { if !slices.Contains(b, v) { diff = append(diff, v) } } return diff } func (i *ImageRefManager) MissingImageFolders() ([]string, error) { // Get all image folders folders := utils.GetPathDirsArray(config.Cfg.Images.Path) // Get all image codes from DB db_images, err := queries.ImagesGetAll() if err != nil { return []string{}, err } dbArray := make([]string, len(db_images)) for i, ref := range db_images { dbArray[i] = ref.Codice } return difference(dbArray, folders), nil } func (i *ImageRefManager) Reset() error { err := queries.ImagesClear() if err != nil { return err } err = queries.AnnunciResetImages() if err != nil { return err } err = os.RemoveAll(config.Cfg.Images.Path) if err != nil { log.Fatal(err) } err = os.Mkdir(config.Cfg.Images.Path, 0755) if err != nil { log.Fatal(err) } return nil }