From de9257ba6591c2022b560f7027e83547fe74f8a5 Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Tue, 7 Sep 2021 15:44:44 +0200 Subject: Added navitia code to fetch train stops names --- pkg/navitia_api_client/train_stops.go | 70 +++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 pkg/navitia_api_client/train_stops.go (limited to 'pkg/navitia_api_client/train_stops.go') diff --git a/pkg/navitia_api_client/train_stops.go b/pkg/navitia_api_client/train_stops.go new file mode 100644 index 0000000..c8a8ff2 --- /dev/null +++ b/pkg/navitia_api_client/train_stops.go @@ -0,0 +1,70 @@ +package navitia_api_client + +import ( + "encoding/json" + "fmt" + "log" + "net/http" + + "git.adyxax.org/adyxax/trains/pkg/model" +) + +type TrainStopsResponse struct { + Pagination struct { + StartPage int `json:"start_page"` + ItemsOnPage int `json:"items_on_page"` + ItemsPerPage int `json:"items_per_page"` + TotalResult int `json:"total_result"` + } `json:"pagination"` + StopAreas []struct { + Name string `json:"name"` + ID string `json:"id"` + Codes []interface{} `json:"codes"` + Links []interface{} `json:"links"` + Coord interface{} `json:"coord"` + Label interface{} `json:"label"` + Timezone interface{} `json:"timezone"` + AdministrativeRegion interface{} `json:"administrative_regions"` + } `json:"stop_areas"` + Links []interface{} `json:"links"` + Disruptions []interface{} `json:"disruptions"` + FeedPublishers []interface{} `json:"feed_publishers"` + Context interface{} `json:"context"` +} + +func (c *NavitiaClient) GetTrainStops() (trainStops []model.TrainStop, err error) { + return getTrainStopsPage(c, 0) +} + +func getTrainStopsPage(c *NavitiaClient, i int) (trainStops []model.TrainStop, err error) { + request := fmt.Sprintf("%s/coverage/sncf/stop_areas?count=1000&start_page=%d", c.baseURL, i) + req, err := http.NewRequest("GET", request, nil) + if err != nil { + return nil, newHttpClientError("http.NewRequest error", err) + } + resp, err := c.httpClient.Do(req) + if err != nil { + return nil, newHttpClientError("httpClient.Do error", err) + } + defer resp.Body.Close() + if resp.StatusCode == http.StatusOK { + var data TrainStopsResponse + if err = json.NewDecoder(resp.Body).Decode(&data); err != nil { + return nil, newJsonDecodeError("GetTrainStops ", err) + } + for i := 0; i < len(data.StopAreas); i++ { + trainStops = append(trainStops, model.TrainStop{data.StopAreas[i].ID, data.StopAreas[i].Name}) + } + if data.Pagination.ItemsOnPage+data.Pagination.ItemsPerPage*data.Pagination.StartPage < data.Pagination.TotalResult { + log.Printf("pagination %d\n", i) + tss, err := getTrainStopsPage(c, i+1) + if err != nil { + return nil, err + } + trainStops = append(trainStops, tss...) + } + } else { + err = newApiError(resp.StatusCode, "GetTrainStops") + } + return +} -- cgit v1.2.3