diff --git a/apps/backend/miogest_handler.go b/apps/backend/miogest_handler.go index bb39084..1fdf19e 100644 --- a/apps/backend/miogest_handler.go +++ b/apps/backend/miogest_handler.go @@ -38,14 +38,17 @@ func NewMiogestHandler() *MiogestHandler { } // ANNUNCI FROM MIOGEST -func (m *MiogestHandler) GetAnnunci() typesdefs.AnnunciXML { +func (m *MiogestHandler) GetAnnunci() (typesdefs.AnnunciXML, error) { if len(m.AnnunciXML.Annuncio) == 0 || time.Now().After(m.annunci_cache_expires) { - m.GetAnnunciFromMiogest() + err := m.GetAnnunciFromMiogest() + if err != nil { + return typesdefs.AnnunciXML{}, err + } } - return m.AnnunciXML + return m.AnnunciXML, nil } -func (m *MiogestHandler) GetAnnunciFromMiogest() { +func (m *MiogestHandler) GetAnnunciFromMiogest() error { maxRetries := 3 baseDelay := 10 * time.Second @@ -57,7 +60,7 @@ func (m *MiogestHandler) GetAnnunciFromMiogest() { // Success - validate we got data if len(m.AnnunciXML.Annuncio) > 0 { m.annunci_cache_expires = time.Now().Add(1 * time.Hour) - return + return nil } log.Printf("Warning: Successfully fetched XML but got 0 annunci") } @@ -74,9 +77,12 @@ func (m *MiogestHandler) GetAnnunciFromMiogest() { attempt+1, maxRetries, err, delay) time.Sleep(delay) } else { + log.Printf("Failed to get annunci after %d attempts: %v", maxRetries, err) + return fmt.Errorf("failed to get annunci after %d attempts: %w", maxRetries, err) } } + return nil } // CATEGORIE AND CARATTERISTICHE FROM MIOGEST @@ -132,27 +138,36 @@ func (m *MiogestHandler) GenerateCategorie() { } // ANNUNCI PARSED -func (m *MiogestHandler) GetAnnunciParsed(imgPool *[]typesdefs.MediaToProcess, videoPool *[]typesdefs.MediaToProcess, forceMediaStale bool) typesdefs.AnnunciParsed { +func (m *MiogestHandler) GetAnnunciParsed(imgPool *[]typesdefs.MediaToProcess, videoPool *[]typesdefs.MediaToProcess, forceMediaStale bool) (typesdefs.AnnunciParsed, error) { // salvo il parsing nello struct nel caso voglio implementare un caching e non fare il parsing ad ogni chiamata - m.AnnunciParsed = m.ParseAnnunci("", imgPool, videoPool, forceMediaStale) - return m.AnnunciParsed + var err error + m.AnnunciParsed, err = m.ParseAnnunci("", imgPool, videoPool, forceMediaStale) + return m.AnnunciParsed, err } // versione per singolo annuncio -func (m *MiogestHandler) GetAnnuncioParsed(codFilter string, imgPool *[]typesdefs.MediaToProcess, videoPool *[]typesdefs.MediaToProcess) typesdefs.AnnunciParsed { - data := m.ParseAnnunci(codFilter, imgPool, videoPool, false) - if len(data.Annuncio) == 0 { - return typesdefs.AnnunciParsed{} +func (m *MiogestHandler) GetAnnuncioParsed(codFilter string, imgPool *[]typesdefs.MediaToProcess, videoPool *[]typesdefs.MediaToProcess) (typesdefs.AnnunciParsed, error) { + + data, err := m.ParseAnnunci(codFilter, imgPool, videoPool, false) + if err != nil { + return typesdefs.AnnunciParsed{}, err } - return data + if len(data.Annuncio) == 0 { + return typesdefs.AnnunciParsed{}, fmt.Errorf("No Annuncio found for codice %s", codFilter) + } + return data, nil } -func (m *MiogestHandler) ParseAnnunci(codFilter string, imgPool *[]typesdefs.MediaToProcess, videoPool *[]typesdefs.MediaToProcess, forceMediaStale bool) typesdefs.AnnunciParsed { - annunci := m.GetAnnunci() +func (m *MiogestHandler) ParseAnnunci(codFilter string, imgPool *[]typesdefs.MediaToProcess, videoPool *[]typesdefs.MediaToProcess, forceMediaStale bool) (typesdefs.AnnunciParsed, error) { + annunci, err := m.GetAnnunci() + if err != nil { + log.Fatalf("Failed to get annunci for parsing: %v", err.Error()) + return typesdefs.AnnunciParsed{}, err + } if len(annunci.Annuncio) == 0 { - return typesdefs.AnnunciParsed{} + return typesdefs.AnnunciParsed{}, fmt.Errorf("No Annunci in update") } if codFilter != "" { @@ -160,7 +175,7 @@ func (m *MiogestHandler) ParseAnnunci(codFilter string, imgPool *[]typesdefs.Med return *a.Codice == codFilter }) if idx == -1 { - return typesdefs.AnnunciParsed{} + return typesdefs.AnnunciParsed{}, fmt.Errorf("Codice %s not found", codFilter) } annunci.Annuncio = []typesdefs.AnnuncioXML{annunci.Annuncio[idx]} } @@ -244,7 +259,7 @@ func (m *MiogestHandler) ParseAnnunci(codFilter string, imgPool *[]typesdefs.Med } bar.Finish() fmt.Println() - return AnnunciArray + return AnnunciArray, nil } var re = regexp.MustCompile(`[^+\d]`) diff --git a/apps/backend/scripts/check.sh b/apps/backend/scripts/check.sh new file mode 100644 index 0000000..41d149d --- /dev/null +++ b/apps/backend/scripts/check.sh @@ -0,0 +1,10 @@ +#!/bin/sh +set -e # Exit on any error + +echo "Starting Check Annunci job..." +if curl -f --connect-timeout 30 --max-time 300 "http://web:3000/api/trpc/annunci.checkAnnunci"; then + echo "Check Annunci job completed successfully" +else + echo "Failed to Check Annunci" >&2 + exit 1 +fi diff --git a/apps/backend/scripts/test.sh b/apps/backend/scripts/test.sh deleted file mode 100644 index 33a402b..0000000 --- a/apps/backend/scripts/test.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -set -e # Exit on any error - -echo "Starting Test..." -if echo "TEST"; then - echo "Test completed successfully" -else - echo "Failed to Test" >&2 - exit 1 -fi \ No newline at end of file diff --git a/apps/backend/server.go b/apps/backend/server.go index 48c7d29..7df28c3 100644 --- a/apps/backend/server.go +++ b/apps/backend/server.go @@ -93,18 +93,27 @@ func (s *Server) SetupRoutes() *echo.Echo { }) e.GET("/miogest", func(c echo.Context) error { - data := s.miogest.GetAnnunci() + data, err := s.miogest.GetAnnunci() + if err != nil { + return c.String(http.StatusInternalServerError, err.Error()) + } return c.JSONPretty(http.StatusOK, data, " ") }) e.GET("/miogest-sample", func(c echo.Context) error { - xml := s.miogest.GetAnnunci() + xml, err := s.miogest.GetAnnunci() + if err != nil { + return c.String(http.StatusInternalServerError, err.Error()) + } rand := rand.Intn(len(xml.Annuncio)) data := xml.Annuncio[rand] return c.JSONPretty(http.StatusOK, data, " ") }) e.GET("/parse", func(c echo.Context) error { start := time.Now() - var data = s.miogest.GetAnnunciParsed(nil, nil, false) + var data, err = s.miogest.GetAnnunciParsed(nil, nil, false) + if err != nil { + return c.String(http.StatusInternalServerError, err.Error()) + } end := time.Now() fmt.Println("time taken:", end.Sub(start).String()) return c.JSONPretty(http.StatusOK, data, " ") @@ -118,8 +127,11 @@ func (s *Server) SetupRoutes() *echo.Echo { imgPool := []typesdefs.MediaToProcess{} videoPool := []typesdefs.MediaToProcess{} - var data = s.miogest.GetAnnunciParsed(&imgPool, &videoPool, forceMediaStale) - err := queries.AnnunciInsert(data, true) + data, err := s.miogest.GetAnnunciParsed(&imgPool, &videoPool, forceMediaStale) + if err != nil { + return c.String(http.StatusInternalServerError, err.Error()) + } + err = queries.AnnunciInsert(data, true) if err != nil { return c.String(http.StatusInternalServerError, err.Error()) } @@ -148,8 +160,11 @@ func (s *Server) SetupRoutes() *echo.Echo { cod := c.Param("cod") imgPool := []typesdefs.MediaToProcess{} videoPool := []typesdefs.MediaToProcess{} - var data = s.miogest.GetAnnuncioParsed(cod, &imgPool, &videoPool) - err := queries.AnnunciInsert(data, false) + data, err := s.miogest.GetAnnuncioParsed(cod, &imgPool, &videoPool) + if err != nil { + return c.String(http.StatusInternalServerError, err.Error()) + } + err = queries.AnnunciInsert(data, false) if err != nil { return c.String(http.StatusInternalServerError, err.Error()) }