From a56542f882250183065cffffb512ea42537ff7f0 Mon Sep 17 00:00:00 2001 From: Janne Mareike Koschinski <janne@kuschku.de> Date: Sat, 4 May 2019 00:01:42 +0200 Subject: [PATCH] Parse input data --- go.mod | 5 ++- go.sum | 11 +++++-- main.go | 83 ++++++++++++++++++++++++++++++++++++++++++----- merge.go | 41 ----------------------- model_internal.go | 11 +++++++ 5 files changed, 99 insertions(+), 52 deletions(-) delete mode 100644 merge.go create mode 100644 model_internal.go diff --git a/go.mod b/go.mod index 42db0f2..bf208d5 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module git.kuschku.de/justjanne/bahn-proxy go 1.12 -require git.kuschku.de/justjanne/bahn-api v0.0.0-20190426223922-f1eab971b0fb +require ( + git.kuschku.de/justjanne/bahn-api v0.0.0-20190503215445-3da40decb307 + golang.org/x/text v0.3.2 // indirect +) diff --git a/go.sum b/go.sum index 869521d..ce5f171 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,11 @@ -git.kuschku.de/justjanne/bahn-api v0.0.0-20190426223922-f1eab971b0fb h1:widAb22bmg2v5nWjQA4n/MSuiwsOFH/isqJs052SJoM= -git.kuschku.de/justjanne/bahn-api v0.0.0-20190426223922-f1eab971b0fb/go.mod h1:rpAScvoRtRrl72NB07uxpiWBo3V/wJxr+bFkSItGil4= +git.kuschku.de/justjanne/bahn-api v0.0.0-20190503215445-3da40decb307 h1:4SlG8aPNwNO94pAaG3B3yiWu7HEF1vqCdwemCbguD/I= +git.kuschku.de/justjanne/bahn-api v0.0.0-20190503215445-3da40decb307/go.mod h1:iDtXOKb4//BILqGtwpne1dgx88H+D++ho3x+iVMImMs= +github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o= +github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01 h1:po1f06KS05FvIQQA2pMuOWZAUXiy1KYdIf0ElUU2Hhc= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/main.go b/main.go index f7255a2..f638321 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "encoding/json" + "fmt" "git.kuschku.de/justjanne/bahn-api" "log" "net/http" @@ -129,27 +130,93 @@ func main() { date = time.Now() } + var data = make(map[string]InternalModel) + var timetable bahn.Timetable if timetable, err = apiClient.Timetable(evaId, date); err != nil { log.Fatal(err) return } + for _, stop := range timetable.Stops { + combined := data[stop.StopId] + combined.Timetable = stop + data[stop.StopId] = combined + } + var realtime bahn.Timetable if realtime, err = apiClient.RealtimeAll(evaId, date); err != nil { log.Fatal(err) return } - realtimeData := make(map[string]*bahn.TimetableStop) - for i := range realtime.Stops { - stop := realtime.Stops[i] - realtimeData[stop.StopId] = &stop + for _, stop := range realtime.Stops { + if combined, ok := data[stop.StopId]; ok { + combined.Realtime = stop + data[stop.StopId] = combined + } } - for i := range timetable.Stops { - stop := &timetable.Stops[i] - MergeTimetableStop(stop, realtimeData[stop.StopId]) + + for key, combined := range data { + if combined.Timetable.Arrival != nil && combined.Timetable.Arrival.Wings != "" { + if combined.WingDefinition, err = apiClient.WingDefinition(combined.Timetable.StopId, combined.Timetable.Arrival.Wings); err != nil { + log.Fatal(err) + } + } else if combined.Timetable.Departure != nil && combined.Timetable.Departure.Wings != "" { + if combined.WingDefinition, err = apiClient.WingDefinition(combined.Timetable.StopId, combined.Timetable.Departure.Wings); err != nil { + log.Fatal(err) + } + } + data[key] = combined + } + + for key, combined := range data { + var moment time.Time + if combined.Timetable.Departure != nil && combined.Timetable.Departure.PlannedTime != nil { + moment = *combined.Timetable.Departure.PlannedTime + } else if combined.Timetable.Arrival != nil && combined.Timetable.Arrival.PlannedTime != nil { + moment = *combined.Timetable.Arrival.PlannedTime + } + + if !moment.IsZero() { + searchQuery := fmt.Sprintf("%s %s", combined.Timetable.TripLabel.TripCategory, combined.Timetable.TripLabel.TripNumber) + var suggestions []bahn.Suggestion + if suggestions, err = apiClient.Suggestions(searchQuery, moment); err != nil { + log.Fatal(err) + } + var targetStation = timetable.Station + if combined.Timetable.Departure != nil { + if combined.Timetable.Departure.PlannedDestination != "" { + targetStation = combined.Timetable.Departure.PlannedDestination + } else if len(combined.Timetable.Departure.PlannedPath) > 0 { + targetStation = combined.Timetable.Departure.PlannedPath[len(combined.Timetable.Departure.PlannedPath)-1] + } + } + var sourceStation = timetable.Station + if combined.Timetable.Arrival != nil { + if combined.Timetable.Arrival.PlannedDestination != "" { + sourceStation = combined.Timetable.Arrival.PlannedDestination + } else if len(combined.Timetable.Arrival.PlannedPath) > 0 { + sourceStation = combined.Timetable.Arrival.PlannedPath[0] + } + } + for _, suggestion := range suggestions { + if targetStation == suggestion.ArrivalStation || sourceStation == suggestion.DepartureStation { + combined.TrainLink = suggestion.TrainLink + } + } + } + data[key] = combined + } + + for key, combined := range data { + if combined.TrainLink != "" { + if combined.HafasMessages, err = apiClient.HafasMessages(combined.TrainLink); err != nil { + log.Fatal(err) + } + } + data[key] = combined } - if err = returnJson(w, timetable); err != nil { + if err = returnJson(w, data); err != nil { log.Fatal(err) return } diff --git a/merge.go b/merge.go deleted file mode 100644 index d185c19..0000000 --- a/merge.go +++ /dev/null @@ -1,41 +0,0 @@ -package main - -import ( - "git.kuschku.de/justjanne/bahn-api" -) - -func MergeTimetableStop(data *bahn.TimetableStop, realtime *bahn.TimetableStop) { - if data == nil || realtime == nil { - return - } - - data.Messages = realtime.Messages - MergeTripLabel(&data.TripLabel, &realtime.TripLabel) - MergeTimetableStop(data.Ref, realtime.Ref) - MergeEvent(data.Arrival, realtime.Arrival) - MergeEvent(data.Departure, realtime.Departure) - data.HistoricDelays = realtime.HistoricDelays - data.HistoricPlatformChanges = realtime.HistoricPlatformChanges - data.Connections = realtime.Connections -} - -func MergeTripLabel(data *bahn.TripLabel, realtime *bahn.TripLabel) { - if data == nil || realtime == nil { - return - } - - data.Messages = realtime.Messages -} - -func MergeEvent(data *bahn.Event, realtime *bahn.Event) { - if data == nil || realtime == nil { - return - } - - data.Messages = realtime.Messages - data.ChangedPlatform = realtime.ChangedPlatform - data.ChangedTime = realtime.ChangedTime - data.ChangedPath = realtime.ChangedPath - data.ChangedDestination = realtime.ChangedDestination - data.ChangedStatus = realtime.ChangedStatus -} diff --git a/model_internal.go b/model_internal.go new file mode 100644 index 0000000..01500d5 --- /dev/null +++ b/model_internal.go @@ -0,0 +1,11 @@ +package main + +import "git.kuschku.de/justjanne/bahn-api" + +type InternalModel struct { + Timetable bahn.TimetableStop `json:"timetable,omitempty"` + Realtime bahn.TimetableStop `json:"realtime,omitempty"` + WingDefinition bahn.WingDefinition `json:"wing_definition,omitempty"` + HafasMessages []bahn.HafasMessage `json:"hafas_messages,omitempty"` + TrainLink string `json:"train_link,omitempty"` +} -- GitLab