aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md1
-rw-r--r--internal/webui/app.go6
-rw-r--r--pkg/config/config.go10
-rw-r--r--pkg/config/config_test.go15
-rw-r--r--pkg/config/error.go15
-rw-r--r--pkg/config/error_test.go2
-rw-r--r--pkg/config/test_data/invalid_trainStop.yaml4
-rw-r--r--pkg/config/test_data/minimal.yaml1
-rw-r--r--pkg/config/test_data/minimal_with_hostname.yaml1
-rw-r--r--pkg/navitia_api_client/departures.go4
-rw-r--r--pkg/navitia_api_client/departures_test.go14
11 files changed, 56 insertions, 17 deletions
diff --git a/README.md b/README.md
index 8ee6ae3..1904e76 100644
--- a/README.md
+++ b/README.md
@@ -31,6 +31,7 @@ The default configuration file location is `$HOME/.config/trains/config.yaml`. I
address: 127.0.0.1
port: 8082
token: 12345678-9abc-def0-1234-56789abcdef0
+trainStop: stop_area:SNCF:87723502
```
`address` can be any ipv4 or ipv6 address or a hostname that resolves to such address, `port` can be any valid tcp port number or service name.
diff --git a/internal/webui/app.go b/internal/webui/app.go
index f510074..f6082dc 100644
--- a/internal/webui/app.go
+++ b/internal/webui/app.go
@@ -14,6 +14,9 @@ import (
// the api client object
var client *navitia_api_client.Client
+// the webui configuration
+var conf *config.Config
+
//go:embed html/*
var templatesFS embed.FS
@@ -35,7 +38,7 @@ type Departure struct {
func rootHandler(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/" {
var p Page
- if d, err := client.GetDepartures(); err != nil {
+ if d, err := client.GetDepartures(conf.TrainStop); err != nil {
log.Printf("%+v\n%s\n", d, err)
} else {
for i := 0; i < len(d.Departures); i++ {
@@ -64,6 +67,7 @@ func renderTemplate(w http.ResponseWriter, tmpl string, p Page) {
}
func Run(c *config.Config) {
+ conf = c
client = navitia_api_client.NewClient(c.Token)
http.Handle("/static/", http.FileServer(http.FS(staticFS)))
http.HandleFunc("/", rootHandler)
diff --git a/pkg/config/config.go b/pkg/config/config.go
index f97467a..6e4bba5 100644
--- a/pkg/config/config.go
+++ b/pkg/config/config.go
@@ -9,13 +9,17 @@ import (
)
var validToken = regexp.MustCompile(`^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$`)
+var validTrainStop = regexp.MustCompile(`^[a-zA-Z0-9:_]+$`)
type Config struct {
// Address is the hostname or ip the web server will listen to
Address string `yaml:"address",default:"127.0.0.1"`
- Port string `yaml:"port",default:"8080"`
+ // Port is the tcp port number or service name the web server will listen to
+ Port string `yaml:"port",default:"8080"`
// Token is the sncf api token
Token string `yaml:"token"`
+ // TrainStop is the navitia code of the train stop the webapp will monitor
+ TrainStop string `yaml:"trainStop"`
}
func (c *Config) validate() error {
@@ -33,6 +37,10 @@ func (c *Config) validate() error {
if ok := validToken.MatchString(c.Token); !ok {
return newInvalidTokenError(c.Token)
}
+ // TrainStop
+ if ok := validTrainStop.MatchString(c.TrainStop); !ok {
+ return newInvalidTrainStopError(c.TrainStop)
+ }
return nil
}
diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go
index 6969191..a4c170b 100644
--- a/pkg/config/config_test.go
+++ b/pkg/config/config_test.go
@@ -11,16 +11,18 @@ import (
func TestLoadFile(t *testing.T) {
// Minimal yaml file
minimalConfig := Config{
- Address: "127.0.0.2",
- Port: "8082",
- Token: "12345678-9abc-def0-1234-56789abcdef0",
+ Address: "127.0.0.2",
+ Port: "8082",
+ Token: "12345678-9abc-def0-1234-56789abcdef0",
+ TrainStop: "ABCD:test:01",
}
// Minimal yaml file with hostname resolving
minimalConfigWithResolving := Config{
- Address: "localhost",
- Port: "www",
- Token: "12345678-9abc-def0-1234-56789abcdef0",
+ Address: "localhost",
+ Port: "www",
+ Token: "12345678-9abc-def0-1234-56789abcdef0",
+ TrainStop: "VWXY_Z:test:90",
}
// Test cases
@@ -36,6 +38,7 @@ func TestLoadFile(t *testing.T) {
{"Unresolvable address should fail to load", "test_data/invalid_address_unresolvable.yaml", nil, &InvalidAddressError{}},
{"Invalid port should fail to load", "test_data/invalid_port.yaml", nil, &InvalidPortError{}},
{"Invalid token should fail to load", "test_data/invalid_token.yaml", nil, &InvalidTokenError{}},
+ {"Invalid trainStop should fail to load", "test_data/invalid_trainStop.yaml", nil, &InvalidTrainStopError{}},
{"Minimal config", "test_data/minimal.yaml", &minimalConfig, nil},
{"Minimal config with resolving", "test_data/minimal_with_hostname.yaml", &minimalConfigWithResolving, nil},
}
diff --git a/pkg/config/error.go b/pkg/config/error.go
index c49b6a9..41a323c 100644
--- a/pkg/config/error.go
+++ b/pkg/config/error.go
@@ -90,3 +90,18 @@ func newInvalidTokenError(token string) error {
token: token,
}
}
+
+// Invalid trainStop field error
+type InvalidTrainStopError struct {
+ trainStop string
+}
+
+func (e *InvalidTrainStopError) Error() string {
+ return fmt.Sprintf("Invalid trainStop %s : it must be a string that lookslike \"stop_area:SNCF:87723502\" (make sure to quote the string because of the colon characters)", e.trainStop)
+}
+
+func newInvalidTrainStopError(trainStop string) error {
+ return &InvalidTrainStopError{
+ trainStop: trainStop,
+ }
+}
diff --git a/pkg/config/error_test.go b/pkg/config/error_test.go
index f9807c1..4a80b05 100644
--- a/pkg/config/error_test.go
+++ b/pkg/config/error_test.go
@@ -17,4 +17,6 @@ func TestErrorsCoverage(t *testing.T) {
_ = invalidPortErr.Unwrap()
invalidTokenErr := InvalidTokenError{}
_ = invalidTokenErr.Error()
+ invalidTrainStopErr := InvalidTrainStopError{}
+ _ = invalidTrainStopErr.Error()
}
diff --git a/pkg/config/test_data/invalid_trainStop.yaml b/pkg/config/test_data/invalid_trainStop.yaml
new file mode 100644
index 0000000..159950d
--- /dev/null
+++ b/pkg/config/test_data/invalid_trainStop.yaml
@@ -0,0 +1,4 @@
+address: 127.0.0.2
+port: 8082
+token: 12345678-9abc-def0-1234-56789abcdef0
+trainStop: =
diff --git a/pkg/config/test_data/minimal.yaml b/pkg/config/test_data/minimal.yaml
index 2944645..e34db15 100644
--- a/pkg/config/test_data/minimal.yaml
+++ b/pkg/config/test_data/minimal.yaml
@@ -1,3 +1,4 @@
address: 127.0.0.2
port: 8082
token: 12345678-9abc-def0-1234-56789abcdef0
+trainStop: "ABCD:test:01"
diff --git a/pkg/config/test_data/minimal_with_hostname.yaml b/pkg/config/test_data/minimal_with_hostname.yaml
index dbede14..116688a 100644
--- a/pkg/config/test_data/minimal_with_hostname.yaml
+++ b/pkg/config/test_data/minimal_with_hostname.yaml
@@ -1,3 +1,4 @@
address: localhost
port: www
token: 12345678-9abc-def0-1234-56789abcdef0
+trainStop: "VWXY_Z:test:90"
diff --git a/pkg/navitia_api_client/departures.go b/pkg/navitia_api_client/departures.go
index 7738940..cd75191 100644
--- a/pkg/navitia_api_client/departures.go
+++ b/pkg/navitia_api_client/departures.go
@@ -43,8 +43,8 @@ type DeparturesResponse struct {
} `json:"context"`
}
-func (c *Client) GetDepartures() (departures *DeparturesResponse, err error) {
- request := fmt.Sprintf("%s/coverage/sncf/stop_areas/stop_area:SNCF:87723502/departures", c.baseURL)
+func (c *Client) GetDepartures(trainStop string) (departures *DeparturesResponse, err error) {
+ request := fmt.Sprintf("%s/coverage/sncf/stop_areas/%s/departures", c.baseURL, trainStop)
start := time.Now()
c.mutex.Lock()
defer c.mutex.Unlock()
diff --git a/pkg/navitia_api_client/departures_test.go b/pkg/navitia_api_client/departures_test.go
index 14ffb96..e7d771f 100644
--- a/pkg/navitia_api_client/departures_test.go
+++ b/pkg/navitia_api_client/departures_test.go
@@ -9,20 +9,20 @@ import (
func TestGetDepartures(t *testing.T) {
// invalid characters in token
client := NewClient("}")
- _, err := client.GetDepartures()
+ _, err := client.GetDepartures("test")
if err == nil {
- t.Fatalf("invalid characters in token should raise an error")
+ t.Fatalf("invalid characters in token should raise an error because the url is invalid")
}
// unreachable server
client = NewClient("https://")
- _, err = client.GetDepartures()
+ _, err = client.GetDepartures("test")
if err == nil {
t.Fatalf("unreachable server should raise an error")
}
// invalid json
client, ts := newTestClientFromFilename(t, "test_data/invalid.json")
defer ts.Close()
- _, err = client.GetDepartures()
+ _, err = client.GetDepartures("test")
if err == nil {
t.Fatalf("invalid json should raise an error")
}
@@ -31,14 +31,14 @@ func TestGetDepartures(t *testing.T) {
w.WriteHeader(http.StatusNotFound)
}))
client = newTestClient(ts)
- _, err = client.GetDepartures()
+ _, err = client.GetDepartures("test")
if err == nil {
t.Fatalf("404 should raise an error")
}
// normal working request
client, ts = newTestClientFromFilename(t, "test_data/normal-crepieux.json")
defer ts.Close()
- departures, err := client.GetDepartures()
+ departures, err := client.GetDepartures("test")
if err != nil {
t.Fatalf("could not get normal-crepieux departures : %s", err)
}
@@ -47,7 +47,7 @@ func TestGetDepartures(t *testing.T) {
}
// test the cache (assuming the test takes less than 60 seconds (and it really should) it will be accurate)
ts.Close()
- departures, err = client.GetDepartures()
+ departures, err = client.GetDepartures("test")
if err != nil {
t.Fatalf("could not get normal-crepieux departures : %s", err)
}