mirror of
https://github.com/kevin-DL/services.git
synced 2026-01-19 05:55:19 +00:00
EV Chargers service (#219)
This commit is contained in:
100
evchargers/handler/data.go
Normal file
100
evchargers/handler/data.go
Normal file
@@ -0,0 +1,100 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/micro/micro/v3/service/logger"
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
)
|
||||
|
||||
func (e *Evchargers) loadPOIData(r io.Reader) (int, error) {
|
||||
logger.Infof("Loading reference data")
|
||||
dec := json.NewDecoder(r)
|
||||
t, err := dec.Token()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
d, ok := t.(json.Delim)
|
||||
if !ok || d.String() != "[" {
|
||||
return 0, fmt.Errorf("unexpected token %v %+v", ok, t)
|
||||
}
|
||||
ctx := context.Background()
|
||||
count := 0
|
||||
for dec.More() {
|
||||
// process each item in json array and insert into mongodb
|
||||
var p Poi
|
||||
if err := dec.Decode(&p); err != nil {
|
||||
return 0, fmt.Errorf("error unmarshalling charger %s", err)
|
||||
}
|
||||
if len(p.SpatialPosition.Type) == 0 {
|
||||
// blank so reconstruct
|
||||
p.SpatialPosition.Type = "Point"
|
||||
// long, lat not lat, long
|
||||
p.SpatialPosition.Coordinates = []float64{p.Address.Longitude, p.Address.Latitude}
|
||||
}
|
||||
|
||||
t := true
|
||||
_, err := e.mdb.Database("ocm").Collection("poi").ReplaceOne(ctx, bson.D{bson.E{"ID", p.ID}}, p, &options.ReplaceOptions{Upsert: &t})
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
count++
|
||||
}
|
||||
return count, nil
|
||||
|
||||
}
|
||||
|
||||
func (e *Evchargers) loadRefData(r io.Reader) error {
|
||||
dec := json.NewDecoder(r)
|
||||
var rd ReferenceData
|
||||
if err := dec.Decode(&rd); err != nil {
|
||||
return err
|
||||
}
|
||||
ctx := context.Background()
|
||||
t := true
|
||||
_, err := e.mdb.Database("ocm").Collection("reference").ReplaceOne(ctx, bson.D{bson.E{"_id", 1}}, rd, &options.ReplaceOptions{Upsert: &t})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (e *Evchargers) refreshDataFromSource() {
|
||||
start := time.Now()
|
||||
logger.Infof("Refreshing data")
|
||||
logger.Infof("Retrieving poi data")
|
||||
rsp, err := http.Get(fmt.Sprintf("https://api.openchargemap.io/v3/poi/?output=json&key=%s&maxresults=10000000", e.conf.OCMKey))
|
||||
if err != nil {
|
||||
logger.Errorf("Error refreshing data %s", err)
|
||||
return
|
||||
}
|
||||
defer rsp.Body.Close()
|
||||
c, err := e.loadPOIData(rsp.Body)
|
||||
if err != nil {
|
||||
logger.Errorf("Error loading data %s", err)
|
||||
return
|
||||
}
|
||||
logger.Infof("Updated %v items of POI data. Took %s", c, time.Since(start))
|
||||
|
||||
start = time.Now()
|
||||
logger.Infof("Retrieving ref data")
|
||||
rsp2, err := http.Get(fmt.Sprintf("https://api.openchargemap.io/v3/referencedata/?output=json&key=%s", e.conf.OCMKey))
|
||||
if err != nil {
|
||||
logger.Errorf("Error refreshing reference data %s", err)
|
||||
return
|
||||
}
|
||||
defer rsp2.Body.Close()
|
||||
if err := e.loadRefData(rsp2.Body); err != nil {
|
||||
logger.Errorf("Error loading reference data %s", err)
|
||||
return
|
||||
}
|
||||
logger.Infof("Updated ref data. Took %s", time.Since(start))
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user