infoalloggi-monorepo/apps/backend/image_handler.go

156 lines
3.3 KiB
Go

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
}