fix:#34 added transaction for main fetch datasource

This commit is contained in:
Elmar Kresse
2024-06-03 23:54:22 +02:00
parent 7faddde98b
commit e3b3e891b5
4 changed files with 85 additions and 33 deletions

View File

@@ -17,9 +17,12 @@
package v2
import (
"database/sql"
"fmt"
"github.com/google/uuid"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/daos"
"golang.org/x/net/html"
"htwkalender/model"
"htwkalender/service/db"
@@ -89,21 +92,50 @@ func fetchAndSaveAllEventsForSemester(
var savedRecords []model.Event
url := stubUrl[0] + semester + stubUrl[1]
events, err := parseEventForOneSemester(url)
if err != nil {
return nil, fmt.Errorf("failed to parse events for "+semester+": %w", err)
}
err = db.DeleteAllEventsBySemesterWithoutCourse(app, "Sport", semester)
if err != nil {
return nil, fmt.Errorf("failed to delete all events for "+semester+": %w", err)
}
savedEvents, dbError := db.SaveEvents(events, app)
if dbError != nil {
return nil, fmt.Errorf("failed to save events for "+semester+": %w", dbError)
}
savedRecords = append(savedRecords, savedEvents...)
err = updateDatabase(app, events, "Sport", semester)
return savedRecords, err
}
func updateDatabase(app *pocketbase.PocketBase, eventsToBeAdded []model.Event, course string, semester string) error {
var addedEvents []model.Event
var err error
// to in transaction the events will be added and deleted
err = app.Dao().RunInTransaction(func(txDao *daos.Dao) error {
var execute sql.Result
execute, err = txDao.DB().Delete("events",
dbx.NewExp("course != {:course} AND semester = {:semester}",
dbx.Params{"course": course, "semester": semester})).Execute()
if err != nil {
return err
}
var rows int64
rows, err = execute.RowsAffected()
slog.Info("Deleted events: ", "events", rows)
addedEvents, err = db.SaveEventsTxDao(eventsToBeAdded, txDao)
if err != nil {
return err
}
return nil
})
if err != nil {
return err
}
slog.Info("Added events: ", "events", len(addedEvents))
return nil
}
func parseEventForOneSemester(url string) ([]model.Event, error) {
// Fetch Webpage from URL
webpage, err := fetch.GetHTML(url)