timetable-mgr/cif/update.go

102 lines
2.7 KiB
Go
Raw Normal View History

package cif
import (
2024-03-30 01:09:12 +00:00
"time"
2024-03-28 22:47:08 +00:00
"git.fjla.uk/owlboard/timetable-mgr/dbAccess"
"git.fjla.uk/owlboard/timetable-mgr/helpers"
"git.fjla.uk/owlboard/timetable-mgr/log"
"git.fjla.uk/owlboard/timetable-mgr/nrod"
"go.uber.org/zap"
)
2024-04-04 22:39:09 +01:00
// Replaces all existing CIF Data with a new download
func runCifFullDownload(cfg *helpers.Configuration) error {
log.Msg.Info("Downloading all CIF Data")
// Download CIF Data file
url, err := getUpdateUrl("full")
if err != nil {
2024-04-04 22:39:09 +01:00
log.Msg.Error("Error getting download URL", zap.Error(err))
}
2024-04-04 22:39:09 +01:00
data, err := nrod.NrodDownload(url, cfg)
if err != nil {
2024-04-04 22:39:09 +01:00
log.Msg.Error("Error downloading CIF data", zap.Error(err))
}
2024-04-04 22:39:09 +01:00
// Parse CIF file
parsed, err := parseCifData(data)
if err != nil {
log.Msg.Error("Error parsing CIF data", zap.Error(err))
return err
2024-03-30 01:09:12 +00:00
}
2024-04-04 22:39:09 +01:00
// Drop timetable collection
dbAccess.DropCollection(dbAccess.TimetableCollection)
2024-03-30 01:09:12 +00:00
2024-04-04 22:39:09 +01:00
// Process CIF file
err = processParsedCif(parsed)
if err != nil {
log.Msg.Error("Error processing CIF data", zap.Error(err))
2024-03-30 01:09:12 +00:00
}
newMeta := generateMetadata(&parsed.header)
ok := dbAccess.PutCifMetadata(newMeta)
if !ok {
log.Msg.Warn("CIF Data updated, but metadata write failed")
}
2024-03-30 01:09:12 +00:00
2024-04-04 22:39:09 +01:00
return nil
}
2024-03-30 01:09:12 +00:00
2024-04-04 22:39:09 +01:00
// Runs a CIF Update for up to five days
func runCifUpdateDownload(cfg *helpers.Configuration, metadata *dbAccess.CifMetadata, days []time.Time) error {
log.Msg.Info("Downloading CIF Updates")
2024-03-30 01:09:12 +00:00
2024-04-04 22:39:09 +01:00
// Loop over dates
for _, time := range days {
log.Msg.Info("Downloading CIF File", zap.Time("CIF Data from", time))
2024-04-04 22:39:09 +01:00
// Download CIF data file
data, err := fetchUpdate(time, cfg)
2024-03-30 01:09:12 +00:00
if err != nil {
2024-04-04 22:39:09 +01:00
log.Msg.Error("Error fetching CIF update", zap.Error(err))
return err
2024-04-03 22:25:27 +01:00
}
2024-04-04 22:39:09 +01:00
// Parse CIF file
2024-04-06 22:31:38 +01:00
parsed, err := parseCifData(data)
2024-04-03 22:25:27 +01:00
if err != nil {
2024-04-04 22:39:09 +01:00
log.Msg.Error("Error parsing CIF data", zap.Error(err))
return err
2024-04-03 22:25:27 +01:00
}
2024-04-04 22:39:09 +01:00
// Check metadata sequence - Handle a metadata sequence error. Probably by deleting metadata so next update triggers full download
//// I need to check what the sequence looks like in a full download first.
2024-04-06 22:28:26 +01:00
//// Regarding metadata, I will need to replace 'metadata *dbAccess.CifMetadata' with the new metadata to ensure it is checked correctly in each iteration.
2024-04-04 22:39:09 +01:00
// Process CIF file
2024-04-06 22:31:38 +01:00
metadata = generateMetadata(&parsed.header)
2024-04-03 22:25:27 +01:00
}
2024-04-04 22:39:09 +01:00
2024-04-06 22:28:26 +01:00
// Write metadata
2024-04-04 22:39:09 +01:00
return nil
}
2024-03-30 01:09:12 +00:00
2024-04-04 22:39:09 +01:00
// Wraps nrod.NrodDownload() into a function which can handle downloading data for a given day
2024-03-30 01:09:12 +00:00
func fetchUpdate(t time.Time, cfg *helpers.Configuration) ([]byte, error) {
url, err := getUpdateUrl("daily")
if err != nil {
return nil, err
}
2024-04-04 22:39:09 +01:00
// Append day string to URL
2024-03-30 01:09:12 +00:00
url = url + getDayString(t)
downloadedData, err := nrod.NrodDownload(url, cfg)
if err != nil {
return nil, err
}
return downloadedData, nil
}