initial commit
This commit is contained in:
192
libs/carpool/blablacardaily.go
Normal file
192
libs/carpool/blablacardaily.go
Normal file
@@ -0,0 +1,192 @@
|
||||
package carpool
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"git.coopgo.io/coopgo-platform/carpool-service/interoperability/ocss"
|
||||
"github.com/google/uuid"
|
||||
"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
type BBCDailyCarpoolAPI struct {
|
||||
OperatorId string
|
||||
APIKey string
|
||||
BaseURL string
|
||||
}
|
||||
|
||||
func NewBBCDailyCarpoolAPI(operatorId string, api_key string, baseURL string) (*BBCDailyCarpoolAPI, error) {
|
||||
return &BBCDailyCarpoolAPI{
|
||||
OperatorId: operatorId,
|
||||
APIKey: api_key,
|
||||
BaseURL: baseURL,
|
||||
}, nil
|
||||
}
|
||||
|
||||
type BBCDailyResult struct {
|
||||
ID *string `json:"id"`
|
||||
Duration *time.Duration `json:"duration"`
|
||||
Distance *int64 `json:"distance"`
|
||||
PickupLatitude *float64 `json:"pickup_latitude"`
|
||||
PickupLongitude *float64 `json:"pickup_longitude"`
|
||||
PickupDatetime time.Time `json:"pickup_datetime"`
|
||||
DropoffLatitude *float64 `json:"dropoff_latitude"`
|
||||
DropoffLongitude *float64 `json:"dropoff_longitude"`
|
||||
DropoffDatetime *string `json:"dropoff_datetime"`
|
||||
WebURL *string `json:"web_url"`
|
||||
DepartureToPickupWalkingTime *time.Duration `json:"departure_to_pickup_walking_time"`
|
||||
DropoffToArrivalWalkingTime *time.Duration `json:"dropoff_to_arrival_walking_time"`
|
||||
JourneyPolyline *string `json:"journey_polyline"`
|
||||
Price *struct {
|
||||
Currency string `json:"currency"`
|
||||
Amount float64 `json:"amount"`
|
||||
} `json:"price"`
|
||||
AvailableSeats *int64 `json:"available_seats"`
|
||||
}
|
||||
|
||||
func (api *BBCDailyCarpoolAPI) GetOperatorId() string {
|
||||
return api.OperatorId
|
||||
}
|
||||
|
||||
func (api *BBCDailyCarpoolAPI) GetDriverJourneys(
|
||||
departureLat float64,
|
||||
departureLng float64,
|
||||
arrivalLat float64,
|
||||
arrivalLng float64,
|
||||
departureDate time.Time,
|
||||
timeDelta *time.Duration,
|
||||
departureRadius int64,
|
||||
arrivalRadius int64,
|
||||
count int64,
|
||||
) ([]ocss.DriverJourney, error) {
|
||||
td := 1 * time.Hour
|
||||
if timeDelta != nil {
|
||||
td = *timeDelta
|
||||
}
|
||||
results, err := blablacarDailySearch(
|
||||
api.BaseURL+"/search",
|
||||
api.APIKey,
|
||||
departureLat,
|
||||
departureLng,
|
||||
arrivalLat,
|
||||
arrivalLng,
|
||||
departureDate,
|
||||
td,
|
||||
)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("error in blablacarDailySearch")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
journeys := []ocss.DriverJourney{}
|
||||
|
||||
for _, r := range results {
|
||||
var price *ocss.Price
|
||||
if r.Price != nil {
|
||||
paying := ocss.Paying
|
||||
price = &ocss.Price{
|
||||
Type: &paying,
|
||||
Amount: &r.Price.Amount,
|
||||
Currency: &r.Price.Currency,
|
||||
}
|
||||
}
|
||||
driverJourney := ocss.DriverJourney{
|
||||
DriverTrip: ocss.DriverTrip{
|
||||
Driver: ocss.User{
|
||||
ID: uuid.NewString(),
|
||||
Operator: api.OperatorId,
|
||||
Alias: "Utilisateur BlablacarDaily",
|
||||
},
|
||||
DepartureToPickupWalkingDuration: r.DepartureToPickupWalkingTime,
|
||||
DropoffToArrivalWalkingDuration: r.DropoffToArrivalWalkingTime,
|
||||
Trip: ocss.Trip{
|
||||
Operator: api.OperatorId,
|
||||
PassengerPickupLat: nilCheck(r.PickupLatitude),
|
||||
PassengerPickupLng: nilCheck(r.PickupLongitude),
|
||||
PassengerDropLat: nilCheck(r.DropoffLatitude),
|
||||
PassengerDropLng: nilCheck(r.DropoffLongitude),
|
||||
Duration: nilCheck(r.Duration),
|
||||
Distance: r.Distance,
|
||||
JourneyPolyline: r.JourneyPolyline,
|
||||
},
|
||||
},
|
||||
JourneySchedule: ocss.JourneySchedule{
|
||||
ID: r.ID,
|
||||
PassengerPickupDate: ocss.OCSSTime(r.PickupDatetime),
|
||||
WebUrl: r.WebURL,
|
||||
},
|
||||
AvailableSteats: r.AvailableSeats,
|
||||
Price: price,
|
||||
}
|
||||
journeys = append(journeys, driverJourney)
|
||||
}
|
||||
return journeys, nil
|
||||
}
|
||||
|
||||
func (api *BBCDailyCarpoolAPI) GetPassengerJourneys(
|
||||
departureLat float64,
|
||||
departureLng float64,
|
||||
arrivalLat float64,
|
||||
arrivalLng float64,
|
||||
departureDate time.Time,
|
||||
timeDelta *time.Duration,
|
||||
departureRadius int64,
|
||||
arrivalRadius int64,
|
||||
count int64,
|
||||
) ([]ocss.PassengerJourney, error) {
|
||||
return nil, errors.New("not implemented")
|
||||
}
|
||||
|
||||
func blablacarDailySearch(url string, access_token string, departure_latitude float64, departure_longitude float64, arrival_latitude float64, arrival_longitude float64, departure_time time.Time, departure_timedelta time.Duration) ([]BBCDailyResult, error) {
|
||||
req, err := http.NewRequest("GET", url, nil)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("new request issue")
|
||||
return nil, err
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
q := req.URL.Query()
|
||||
q.Add("access_token", access_token)
|
||||
q.Add("departure_latitude", fmt.Sprintf("%f", departure_latitude))
|
||||
q.Add("departure_longitude", fmt.Sprintf("%f", departure_longitude))
|
||||
q.Add("arrival_latitude", fmt.Sprintf("%f", arrival_latitude))
|
||||
q.Add("arrival_longitude", fmt.Sprintf("%f", arrival_longitude))
|
||||
q.Add("departure_epoch", strconv.FormatInt(departure_time.Unix(), 10))
|
||||
q.Add("departure_timedelta", fmt.Sprintf("%v", departure_timedelta.Abs().Seconds()))
|
||||
req.URL.RawQuery = q.Encode()
|
||||
|
||||
log.Debug().Str("url", req.URL.String()).Msg("Request to BBCDaily")
|
||||
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("error in BBCDaily request")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
response := []BBCDailyResult{}
|
||||
|
||||
err = json.NewDecoder(resp.Body).Decode(&response)
|
||||
if err != nil {
|
||||
body, err2 := io.ReadAll(resp.Body)
|
||||
if err2 != nil {
|
||||
log.Error().Err(err2).Msg("error reading json string")
|
||||
}
|
||||
log.Error().Err(err).Any("resp body", body).Msg("cannot read json response to blablacardaily API")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return response, nil
|
||||
}
|
||||
|
||||
func nilCheck[T any](a *T) T {
|
||||
var t T
|
||||
if a == nil {
|
||||
return t
|
||||
}
|
||||
return *a
|
||||
}
|
||||
13
libs/carpool/carpool.go
Normal file
13
libs/carpool/carpool.go
Normal file
@@ -0,0 +1,13 @@
|
||||
package carpool
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"git.coopgo.io/coopgo-platform/carpool-service/interoperability/ocss"
|
||||
)
|
||||
|
||||
type CarpoolOperatorAPI interface {
|
||||
GetOperatorId() string
|
||||
GetDriverJourneys(departureLat float64, departureLng float64, arrivalLat float64, arrivalLng float64, departureDate time.Time, timeDelta *time.Duration, departureRadius int64, arrivalRadius int64, count int64) ([]ocss.DriverJourney, error)
|
||||
GetPassengerJourneys(departureLat float64, departureLng float64, arrivalLat float64, arrivalLng float64, departureDate time.Time, timeDelta *time.Duration, departureRadius int64, arrivalRadius int64, count int64) ([]ocss.PassengerJourney, error)
|
||||
}
|
||||
23
libs/transit/transit.go
Normal file
23
libs/transit/transit.go
Normal file
@@ -0,0 +1,23 @@
|
||||
package transit
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
valhalla "git.coopgo.io/coopgo-platform/libvalhalla-go"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
type TransitRouting struct {
|
||||
Valhalla *valhalla.Actor
|
||||
}
|
||||
|
||||
func NewTransitRouting(cfg *viper.Viper) (*TransitRouting, error) {
|
||||
config := valhalla.DefaultConfig()
|
||||
actor, err := valhalla.NewActorFromConfig(config)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not initiate valhalla library : %w", err)
|
||||
}
|
||||
return &TransitRouting{
|
||||
Valhalla: actor,
|
||||
}, nil
|
||||
}
|
||||
Reference in New Issue
Block a user