2024-03-27 23:35:03 +00:00
package cif
import (
2024-03-30 01:09:12 +00:00
"time"
2024-03-27 23:35:03 +00:00
2024-03-28 22:47:08 +00:00
"git.fjla.uk/owlboard/timetable-mgr/dbAccess"
2024-03-29 13:45:58 +00:00
"git.fjla.uk/owlboard/timetable-mgr/helpers"
2024-03-27 23:35:03 +00:00
"git.fjla.uk/owlboard/timetable-mgr/log"
2024-03-29 13:45:58 +00:00
"git.fjla.uk/owlboard/timetable-mgr/nrod"
2024-03-27 23:35:03 +00:00
"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
2024-03-29 13:45:58 +00:00
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-03-29 13:45:58 +00:00
}
2024-04-04 22:39:09 +01:00
data , err := nrod . NrodDownload ( url , cfg )
2024-03-29 13:45:58 +00:00
if err != nil {
2024-04-04 22:39:09 +01:00
log . Msg . Error ( "Error downloading CIF data" , zap . Error ( err ) )
2024-03-29 13:45:58 +00:00
}
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
}
2024-04-08 21:08:07 +01: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-02 21:07:01 +01:00
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-03-29 13:45:58 +00: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-27 23:35:03 +00:00
}
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
}