infoalloggi-monorepo/apps/backend/image_handler.go
2025-08-04 17:45:44 +02:00

127 lines
2.6 KiB
Go

package main
import (
"fmt"
"log"
"os"
"path/filepath"
"github.com/georgysavva/scany/v2/pgxscan"
"github.com/jackc/pgx/v5"
)
type ImageRefManager struct {
}
func NewImageRefManager() *ImageRefManager {
return &ImageRefManager{}
}
func (i *ImageRefManager) GetImagesRef() ([]MiogestImagesRef_Table, error) {
var images []MiogestImagesRef_Table
err := pgxscan.Select(Db.Ctx, Db.Dbpool, &images, "SELECT * FROM public.miogest_images_ref")
if err != nil {
return nil, err
}
return images, nil
}
func (i *ImageRefManager) InsertImagesRef(annunci *AnnunciXML) error {
batch := &pgx.Batch{}
for _, annuncio := range annunci.Annuncio {
batch.Queue(`
INSERT INTO public.miogest_images_ref (codice, foto)
VALUES ($1, $2)
ON CONFLICT (codice) DO UPDATE SET foto = $2
`, &annuncio.Codice, &annuncio.Foto)
}
if err := Db.Dbpool.SendBatch(Db.Ctx, batch).Close(); err != nil {
return err
}
return nil
}
func (i *ImageRefManager) FindIsUpdate(annunci *AnnunciXML) ([]string, error) {
r, err := i.GetImagesRef()
if err != nil {
return nil, err
}
refMap := make(map[string][]string) // Convert slice to map for faster lookup
for _, ref := range r {
if ref.Foto != nil {
refMap[ref.Codice] = *ref.Foto
}
}
var result []string
for _, annuncio := range annunci.Annuncio {
if annuncio.Codice != nil && annuncio.Foto != nil {
refFoto, exists := refMap[*annuncio.Codice]
if !exists {
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(imgbasepath, codice)
err := os.RemoveAll(folder)
if err != nil {
return err
}
}
return nil
}
func (i *ImageRefManager) Reset() error {
_, err := Db.Dbpool.Exec(Db.Ctx, "DELETE FROM public.miogest_images_ref")
if err != nil {
return err
}
_, err = Db.Dbpool.Exec(Db.Ctx, "UPDATE public.annunci SET url_immagini = NULL, url_video = NULL")
if err != nil {
return err
}
err = os.RemoveAll(imgbasepath)
if err != nil {
log.Fatal(err)
}
err = os.Mkdir(imgbasepath, 0755)
if err != nil {
log.Fatal(err)
}
return nil
}