2025-08-04 17:45:44 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
2025-08-22 12:57:33 +02:00
|
|
|
"backend/config"
|
2025-08-22 10:11:07 +02:00
|
|
|
"backend/queries"
|
2025-08-22 12:57:33 +02:00
|
|
|
"backend/typesdefs"
|
2025-10-15 14:27:06 +02:00
|
|
|
"backend/utils"
|
2025-08-04 17:45:44 +02:00
|
|
|
"fmt"
|
|
|
|
|
"log"
|
|
|
|
|
"os"
|
|
|
|
|
"path/filepath"
|
2025-10-15 14:27:06 +02:00
|
|
|
"slices"
|
2025-08-04 17:45:44 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type ImageRefManager struct {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewImageRefManager() *ImageRefManager {
|
|
|
|
|
return &ImageRefManager{}
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-15 14:27:06 +02:00
|
|
|
// 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 {
|
2025-08-04 17:45:44 +02:00
|
|
|
|
2025-08-22 10:11:07 +02:00
|
|
|
return queries.ImagesBatchInsert(annunci)
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
|
|
|
|
|
2025-10-15 14:27:06 +02:00
|
|
|
func (i *ImageRefManager) GetImageCodesForProcessing(annunci *typesdefs.AnnunciXML) ([]string, error) {
|
|
|
|
|
db_images, err := queries.ImagesGetAll()
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2025-10-15 14:27:06 +02:00
|
|
|
dbImagesMap := make(map[string][]string) // Convert slice to map for faster lookup
|
|
|
|
|
for _, ref := range db_images {
|
2025-08-04 17:45:44 +02:00
|
|
|
if ref.Foto != nil {
|
2025-10-15 14:27:06 +02:00
|
|
|
dbImagesMap[ref.Codice] = *ref.Foto
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var result []string
|
|
|
|
|
for _, annuncio := range annunci.Annuncio {
|
|
|
|
|
if annuncio.Codice != nil && annuncio.Foto != nil {
|
2025-10-15 14:27:06 +02:00
|
|
|
refFoto, existsInDb := dbImagesMap[*annuncio.Codice]
|
|
|
|
|
if !existsInDb {
|
2025-08-04 17:45:44 +02:00
|
|
|
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 {
|
2025-08-22 12:57:33 +02:00
|
|
|
folder := filepath.Join(config.Cfg.Images.Path, codice)
|
2025-10-15 14:27:06 +02:00
|
|
|
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)
|
2025-08-04 17:45:44 +02:00
|
|
|
err := os.RemoveAll(folder)
|
2025-10-15 14:27:06 +02:00
|
|
|
fmt.Println("Folder removed:", folder)
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
2025-10-15 14:27:06 +02:00
|
|
|
err = queries.ImagesClearByCodice(to_clear)
|
|
|
|
|
fmt.Println("DB entries removed for codice:", to_clear)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-04 17:45:44 +02:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-15 14:27:06 +02:00
|
|
|
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
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-04 17:45:44 +02:00
|
|
|
func (i *ImageRefManager) Reset() error {
|
2025-08-22 10:11:07 +02:00
|
|
|
err := queries.ImagesClear()
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-22 10:11:07 +02:00
|
|
|
err = queries.AnnunciResetImages()
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-22 12:57:33 +02:00
|
|
|
err = os.RemoveAll(config.Cfg.Images.Path)
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
2025-08-22 12:57:33 +02:00
|
|
|
err = os.Mkdir(config.Cfg.Images.Path, 0755)
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|