Skip to content
Snippets Groups Projects
Commit c5e95dd7 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Improve cache handling

parent 6010e509
Branches
No related tags found
No related merge requests found
...@@ -2,6 +2,7 @@ package main ...@@ -2,6 +2,7 @@ package main
import ( import (
"encoding/json" "encoding/json"
"errors"
"git.kuschku.de/justjanne/bahn-api" "git.kuschku.de/justjanne/bahn-api"
"github.com/go-redis/cache" "github.com/go-redis/cache"
"github.com/go-redis/redis" "github.com/go-redis/redis"
...@@ -22,17 +23,25 @@ func (m RedisCache) Set(key string, value interface{}) error { ...@@ -22,17 +23,25 @@ func (m RedisCache) Set(key string, value interface{}) error {
} }
func (m RedisCache) Get(key string, value interface{}) error { func (m RedisCache) Get(key string, value interface{}) error {
return m.backend.Get(key, &value) err := m.backend.Get(key, &value)
if err != nil {
return err
} else if value == nil {
return errors.New("redis returned empty result")
}
return nil
} }
func NewRedisCache(expirationTime time.Duration) bahn.CacheBackend { func NewRedisCache(address string, password string, expirationTime time.Duration) bahn.CacheBackend {
return RedisCache{ return RedisCache{
backend: &cache.Codec{ backend: &cache.Codec{
Redis: redis.NewClient(&redis.Options{ Redis: redis.NewClient(&redis.Options{
Addr: address,
Password: password,
}), }),
Marshal: json.Marshal, Marshal: json.Marshal,
Unmarshal: json.Unmarshal, Unmarshal: json.Unmarshal,
}, },
expirationTime: expirationTime,
} }
} }
package main
import "time"
type Config struct {
Endpoints EndpointConfig `yaml:"endpoints"`
Caches CacheConfig `yaml:"caches"`
RequestTimeout time.Duration `yaml:"request_timeout"`
MaxResults int `yaml:"max_results"`
}
type EndpointConfig struct {
Iris string `yaml:"iris"`
CoachSequence string `yaml:"coach_sequence"`
Hafas string `yaml:"hafas"`
}
type CacheConfig struct {
Redis RedisCacheConfig `yaml:"redis"`
Memory MemoryCacheConfig `yaml:"memory"`
}
type RedisCacheConfig struct {
Address string `yaml:"address"`
Password string `yaml:"password"`
Timeout time.Duration `yaml:"timeout"`
}
type MemoryCacheConfig struct {
Timeout time.Duration `yaml:"timeout"`
}
...@@ -3,8 +3,9 @@ module git.kuschku.de/justjanne/bahn-proxy ...@@ -3,8 +3,9 @@ module git.kuschku.de/justjanne/bahn-proxy
go 1.12 go 1.12
require ( require (
git.kuschku.de/justjanne/bahn-api v0.0.0-20190504114009-71c830fe0812 git.kuschku.de/justjanne/bahn-api v0.0.0-20190504153151-3f6741590505
github.com/go-redis/cache v6.3.5+incompatible github.com/go-redis/cache v6.3.5+incompatible
github.com/go-redis/redis v6.15.2+incompatible github.com/go-redis/redis v6.15.2+incompatible
github.com/patrickmn/go-cache v2.1.0+incompatible github.com/patrickmn/go-cache v2.1.0+incompatible
gopkg.in/yaml.v2 v2.2.2
) )
git.kuschku.de/justjanne/bahn-api v0.0.0-20190504114009-71c830fe0812 h1:dhL0LHGoud1so9Be3namg7g+/PtGVGhldtw+agNActg= git.kuschku.de/justjanne/bahn-api v0.0.0-20190504153151-3f6741590505 h1:5ZpJaz2ltYxdBpqPGVdLfVgUx0GIQ+h+Kt9o/qI/JzI=
git.kuschku.de/justjanne/bahn-api v0.0.0-20190504114009-71c830fe0812/go.mod h1:WQsAQzBR+0dlaVVuwwkx8j5uMoWDIdc8xtX4vlRrp5E= git.kuschku.de/justjanne/bahn-api v0.0.0-20190504153151-3f6741590505/go.mod h1:WQsAQzBR+0dlaVVuwwkx8j5uMoWDIdc8xtX4vlRrp5E=
github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o= github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o=
github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/go-redis/cache v6.3.5+incompatible h1:4OUyoXXYRRQ6tKA4ue3TlPUkBzk3occzjtXBZBxCzgs= github.com/go-redis/cache v6.3.5+incompatible h1:4OUyoXXYRRQ6tKA4ue3TlPUkBzk3occzjtXBZBxCzgs=
...@@ -14,4 +14,5 @@ golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= ...@@ -14,4 +14,5 @@ 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/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= 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/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
...@@ -2,10 +2,13 @@ package main ...@@ -2,10 +2,13 @@ package main
import ( import (
"encoding/json" "encoding/json"
"flag"
"fmt" "fmt"
"git.kuschku.de/justjanne/bahn-api" "git.kuschku.de/justjanne/bahn-api"
"gopkg.in/yaml.v2"
"log" "log"
"net/http" "net/http"
"os"
"path" "path"
"sort" "sort"
"strconv" "strconv"
...@@ -28,22 +31,41 @@ func returnJson(w http.ResponseWriter, data interface{}) error { ...@@ -28,22 +31,41 @@ func returnJson(w http.ResponseWriter, data interface{}) error {
} }
func main() { func main() {
var err error
configPath := flag.String("config", "config.yaml", "Path to config file")
listen := flag.String("listen", ":8080", "Listen address")
flag.Parse()
var configFile *os.File
if configFile, err = os.Open(*configPath); err != nil {
panic(err)
}
var config Config
if err = yaml.NewDecoder(configFile).Decode(&config); err != nil {
panic(err)
}
autocompleteStations := loadAutocompleteStations() autocompleteStations := loadAutocompleteStations()
apiClient := bahn.ApiClient{ apiClient := bahn.ApiClient{
IrisBaseUrl: "http://iris.noncd.db.de/iris-tts", IrisBaseUrl: config.Endpoints.Iris,
CoachSequenceBaseUrl: "https://www.apps-bahn.de/wr/wagenreihung/1.0", CoachSequenceBaseUrl: config.Endpoints.CoachSequence,
HafasBaseUrl: "https://reiseauskunft.bahn.de/bin", HafasBaseUrl: config.Endpoints.Hafas,
HttpClient: &http.Client{ HttpClient: &http.Client{
Timeout: time.Second * 10, Timeout: config.RequestTimeout,
}, },
Caches: []bahn.CacheBackend{ Caches: []bahn.CacheBackend{
NewMemoryCache(5 * time.Minute), NewMemoryCache(config.Caches.Memory.Timeout),
NewRedisCache(
config.Caches.Redis.Address,
config.Caches.Redis.Password,
config.Caches.Redis.Timeout,
),
}, },
} }
MaxResults := 20
http.HandleFunc("/autocomplete/", func(w http.ResponseWriter, r *http.Request) { http.HandleFunc("/autocomplete/", func(w http.ResponseWriter, r *http.Request) {
if stationName := strings.TrimSpace(r.FormValue("name")); stationName != "" { if stationName := strings.TrimSpace(r.FormValue("name")); stationName != "" {
var perfectMatch []AutocompleteStation var perfectMatch []AutocompleteStation
...@@ -62,14 +84,14 @@ func main() { ...@@ -62,14 +84,14 @@ func main() {
contains = append(contains, station) contains = append(contains, station)
} }
if len(perfectMatch)+len(prefix)+len(contains) >= MaxResults { if len(perfectMatch)+len(prefix)+len(contains) >= config.MaxResults {
break break
} }
} }
result := append(append(perfectMatch, prefix...), contains...) result := append(append(perfectMatch, prefix...), contains...)
if err := returnJson(w, result); err != nil { if err := returnJson(w, result); err != nil {
log.Fatal(err) log.Println(err)
return return
} }
} else if position, err := PositionFromString(strings.TrimSpace(r.FormValue("position"))); err == nil { } else if position, err := PositionFromString(strings.TrimSpace(r.FormValue("position"))); err == nil {
...@@ -87,8 +109,8 @@ func main() { ...@@ -87,8 +109,8 @@ func main() {
return result[i].Distance < result[j].Distance return result[i].Distance < result[j].Distance
}) })
if err := returnJson(w, result[:MaxResults]); err != nil { if err := returnJson(w, result[:config.MaxResults]); err != nil {
log.Fatal(err) log.Println(err)
return return
} }
} }
...@@ -101,18 +123,18 @@ func main() { ...@@ -101,18 +123,18 @@ func main() {
var evaId int64 var evaId int64
if evaId, err = strconv.ParseInt(rawEvaId, 10, 64); err != nil { if evaId, err = strconv.ParseInt(rawEvaId, 10, 64); err != nil {
log.Fatal(err) log.Println(err)
return return
} }
var stations []bahn.Station var stations []bahn.Station
if stations, err = apiClient.Station(evaId); err != nil { if stations, err = apiClient.Station(evaId); err != nil {
log.Fatal(err) log.Println(err)
return return
} }
if err = returnJson(w, stations); err != nil { if err = returnJson(w, stations); err != nil {
log.Fatal(err) log.Println(err)
return return
} }
}) })
...@@ -124,7 +146,7 @@ func main() { ...@@ -124,7 +146,7 @@ func main() {
var evaId int64 var evaId int64
if evaId, err = strconv.ParseInt(rawEvaId, 10, 64); err != nil { if evaId, err = strconv.ParseInt(rawEvaId, 10, 64); err != nil {
log.Fatal(err) log.Println(err)
return return
} }
...@@ -137,7 +159,7 @@ func main() { ...@@ -137,7 +159,7 @@ func main() {
var timetable bahn.Timetable var timetable bahn.Timetable
if timetable, err = apiClient.Timetable(evaId, date); err != nil { if timetable, err = apiClient.Timetable(evaId, date); err != nil {
log.Fatal(err) log.Println(err)
return return
} }
for _, stop := range timetable.Stops { for _, stop := range timetable.Stops {
...@@ -148,7 +170,7 @@ func main() { ...@@ -148,7 +170,7 @@ func main() {
var realtime bahn.Timetable var realtime bahn.Timetable
if realtime, err = apiClient.RealtimeAll(evaId, date); err != nil { if realtime, err = apiClient.RealtimeAll(evaId, date); err != nil {
log.Fatal(err) log.Println(err)
return return
} }
for _, stop := range realtime.Stops { for _, stop := range realtime.Stops {
...@@ -161,11 +183,13 @@ func main() { ...@@ -161,11 +183,13 @@ func main() {
for key, combined := range data { for key, combined := range data {
if combined.Timetable.Arrival != nil && combined.Timetable.Arrival.Wings != "" { if combined.Timetable.Arrival != nil && combined.Timetable.Arrival.Wings != "" {
if combined.WingDefinition, err = apiClient.WingDefinition(combined.Timetable.StopId, combined.Timetable.Arrival.Wings); err != nil { if combined.WingDefinition, err = apiClient.WingDefinition(combined.Timetable.StopId, combined.Timetable.Arrival.Wings); err != nil {
log.Fatal(err) log.Println(err)
return
} }
} else if combined.Timetable.Departure != nil && combined.Timetable.Departure.Wings != "" { } 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 { if combined.WingDefinition, err = apiClient.WingDefinition(combined.Timetable.StopId, combined.Timetable.Departure.Wings); err != nil {
log.Fatal(err) log.Println(err)
return
} }
} }
data[key] = combined data[key] = combined
...@@ -183,7 +207,8 @@ func main() { ...@@ -183,7 +207,8 @@ func main() {
searchQuery := fmt.Sprintf("%s %s", combined.Timetable.TripLabel.TripCategory, combined.Timetable.TripLabel.TripNumber) searchQuery := fmt.Sprintf("%s %s", combined.Timetable.TripLabel.TripCategory, combined.Timetable.TripLabel.TripNumber)
var suggestions []bahn.Suggestion var suggestions []bahn.Suggestion
if suggestions, err = apiClient.Suggestions(searchQuery, moment); err != nil { if suggestions, err = apiClient.Suggestions(searchQuery, moment); err != nil {
log.Fatal(err) log.Println(err)
return
} }
var targetStation = timetable.Station var targetStation = timetable.Station
if combined.Timetable.Departure != nil { if combined.Timetable.Departure != nil {
...@@ -213,7 +238,8 @@ func main() { ...@@ -213,7 +238,8 @@ func main() {
for key, combined := range data { for key, combined := range data {
if combined.TrainLink != "" { if combined.TrainLink != "" {
if combined.HafasMessages, err = apiClient.HafasMessages(combined.TrainLink); err != nil { if combined.HafasMessages, err = apiClient.HafasMessages(combined.TrainLink); err != nil {
log.Fatal(err) log.Println(err)
return
} }
} }
data[key] = combined data[key] = combined
...@@ -225,11 +251,11 @@ func main() { ...@@ -225,11 +251,11 @@ func main() {
} }
if err = returnJson(w, result); err != nil { if err = returnJson(w, result); err != nil {
log.Fatal(err) log.Println(err)
return return
} }
}) })
if err := http.ListenAndServe(":8080", nil); err != nil { if err := http.ListenAndServe(*listen, nil); err != nil {
log.Fatal(err) log.Fatal(err)
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment