Add distance matrix

This commit is contained in:
2019-02-26 14:54:16 +01:00
parent c8082554ec
commit 4ccc2fc98e
7 changed files with 113 additions and 31 deletions
+4 -5
View File
@@ -1,11 +1,10 @@
FROM gunosy/ci-go-glide as builder
WORKDIR /go/src/gitlab.com/unboundsoftware/geo-service
COPY glide.* ./
RUN glide install
FROM golang:1.11-stretch as builder
WORKDIR /go/src/gitlab.com/unboundsoftware/dancefinder/geo-service
COPY * ./
RUN go get
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o geo-service .
FROM scratch
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /go/src/gitlab.com/unboundsoftware/geo-service/geo-service /
COPY --from=builder /go/src/gitlab.com/unboundsoftware/dancefinder/geo-service/geo-service /
CMD ["/geo-service"]
+17
View File
@@ -42,7 +42,24 @@ spec:
memory: "100Mi"
imagePullPolicy: Always
image: registry.gitlab.com/unboundsoftware/dancefinder/geo-service:${COMMIT}
ports:
- containerPort: 80
name: http
envFrom:
- secretRef:
name: google-maps-api
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: geo-service
spec:
ports:
- port: 80
name: http
protocol: TCP
targetPort: 80
selector:
app: geo-service
type: ClusterIP
Generated
-16
View File
@@ -1,16 +0,0 @@
hash: 970b38f08b875634ffd52ae0c930abe90a206ae26803a5c66462ea0358178d58
updated: 2019-02-12T16:59:28.793243+01:00
imports:
- name: github.com/caarlos0/env
version: 518fcfb943252f77846f92ce5794086d9cb4a1b5
- name: github.com/google/uuid
version: 9b3b1e0f5f99ae461456d768e7d301a7acdaa2d8
- name: golang.org/x/time
version: 85acf8d2951cb2a3bde7632f9ff273ef0379bcbd
subpackages:
- rate
- name: googlemaps.github.io/maps
version: be134e760d707b2057d6a68668e19c509147d805
subpackages:
- internal
testImports: []
-7
View File
@@ -1,7 +0,0 @@
package: gitlab.com/unboundsoftware/geo-service
import:
- package: googlemaps.github.io/maps
- package: github.com/caarlos0/env
version: ^3.5.0
- package: github.com/google/uuid
version: ^1.1.0
+8
View File
@@ -0,0 +1,8 @@
module gitlab.com/unboundsoftware/dancefinder/geo-service
require (
github.com/caarlos0/env v3.5.0+incompatible
github.com/google/uuid v1.1.0
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c
googlemaps.github.io/maps v0.0.0-20190206003505-be134e760d70
)
+8
View File
@@ -0,0 +1,8 @@
github.com/caarlos0/env v3.5.0+incompatible h1:Yy0UN8o9Wtr/jGHZDpCBLpNrzcFLLM2yixi/rBrKyJs=
github.com/caarlos0/env v3.5.0+incompatible/go.mod h1:tdCsowwCzMLdkqRYDlHpZCp2UooDD3MspDBjZ2AD02Y=
github.com/google/uuid v1.1.0 h1:Jf4mxPC/ziBnoPIdpQdPJ9OeiomAUHLvxmPRSPH9m4s=
github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
googlemaps.github.io/maps v0.0.0-20190206003505-be134e760d70 h1:PC1NdMj+SxZxIgOfhklcq1HZCxGZ6cdh9UIogjorVuw=
googlemaps.github.io/maps v0.0.0-20190206003505-be134e760d70/go.mod h1:skwIRP56b3wXI7uVor5+NBjKLuQ3WXPpUvSKq4k7luo=
+76 -3
View File
@@ -8,15 +8,42 @@ import (
"googlemaps.github.io/maps"
"log"
"net/http"
"strings"
)
type config struct {
MapsApiKey string `env:"MAPS_API_KEY"`
Port int `env:"PORT" envDefault:"80"`
}
type location struct {
Lat float64 `json:"lat"`
Long float64 `json:"long"`
Lat float64 `json:"latitude"`
Long float64 `json:"longitude"`
}
type distance struct {
Text string `json:"text"`
Value int `json:"value"`
}
type duration struct {
Text string `json:"text"`
Value float64 `json:"value"`
}
type destination struct {
Destination string `json:"destination"`
Distance distance `json:"distance"`
Duration duration `json:"duration"`
}
type origin struct {
Origin string `json:"origin"`
Destinations []destination `json:"destinations"`
}
type distanceResponse struct {
Origins []origin `json:"origins"`
}
func main() {
@@ -33,7 +60,8 @@ func main() {
}
http.HandleFunc("/latlong/", makeHandler(handleLatLongRequest, client))
log.Fatal(http.ListenAndServe(":8000", nil))
http.HandleFunc("/distance/", makeHandler(handleDistanceMatrixRequest, client))
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", cfg.Port), nil))
}
func makeHandler(fn func(http.ResponseWriter, *http.Request, *maps.Client), client *maps.Client) http.HandlerFunc {
@@ -41,6 +69,51 @@ func makeHandler(fn func(http.ResponseWriter, *http.Request, *maps.Client), clie
fn(w, r, client)
}
}
func handleDistanceMatrixRequest(w http.ResponseWriter, r *http.Request, client *maps.Client) {
origins := strings.Split(r.URL.Query().Get("origins"), "|")
destinations := strings.Split(r.URL.Query().Get("destinations"), "|")
req := &maps.DistanceMatrixRequest{
Origins: origins,
Destinations: destinations,
Language: "sv",
Units: maps.UnitsMetric,
}
if result, err := client.DistanceMatrix(context.Background(), req); err != nil {
log.Fatalf("fatal error: %s", err)
w.WriteHeader(400)
} else {
res := distanceResponse{}
for i, r := range result.Rows {
var dests []destination
for j, e := range r.Elements {
dests = append(dests, destination{
destinations[j],
distance{
Text: e.Distance.HumanReadable,
Value: e.Distance.Meters,
},
duration{
e.Duration.String(),
e.Duration.Minutes(),
},
})
}
res.Origins = append(res.Origins, origin{origins[i], dests})
}
if response, err := json.Marshal(res); err != nil {
log.Fatalf("fatal error: %s", err)
w.WriteHeader(404)
} else {
_, _ = w.Write(response)
}
}
}
func handleLatLongRequest(w http.ResponseWriter, r *http.Request, client *maps.Client) {
req := &maps.GeocodingRequest{
Address: r.URL.Path[len("/latlong/"):],