106 lines
3.4 KiB
Go
106 lines
3.4 KiB
Go
/*
|
|
* Solidarity Mobility API
|
|
*
|
|
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
|
|
*
|
|
* API version: 1.0.0
|
|
* Generated by: OpenAPI Generator (https://openapi-generator.tech)
|
|
*/
|
|
|
|
package openapi
|
|
|
|
import (
|
|
"context"
|
|
"github.com/paulmach/orb"
|
|
"github.com/paulmach/orb/geojson"
|
|
"github.com/spf13/viper"
|
|
"net/http"
|
|
"solidarity-service/handler"
|
|
"solidarity-service/internal"
|
|
"solidarity-service/storage"
|
|
"strings"
|
|
)
|
|
|
|
// SearchAPIService is a service that implements the logic for the SearchAPIServicer
|
|
// This service should implement the business logic for every endpoint for the SearchAPI API.
|
|
// Include any external packages or services that will be required by this service.
|
|
type SearchAPIService struct {
|
|
config *viper.Viper
|
|
handler *handler.SolidarityServiceHandler
|
|
storage storage.Storage
|
|
}
|
|
|
|
// NewSearchAPIService creates a default api service
|
|
func NewSearchAPIService(config *viper.Viper, handler *handler.SolidarityServiceHandler, storage storage.Storage) SearchAPIServicer {
|
|
return &SearchAPIService{
|
|
config: config,
|
|
handler: handler,
|
|
storage: storage,
|
|
}
|
|
}
|
|
|
|
// GetDriverJourneys - Search for matching punctual planned outward driver journeys.
|
|
func (s *SearchAPIService) GetDriverJourneys(ctx context.Context, departureLat float32, departureLng float32, departureDate int32, operator string) (ImplResponse, error) {
|
|
drivers, err := s.storage.DriverJourneys(&geojson.Feature{
|
|
Type: "Feature",
|
|
Geometry: orb.Geometry(orb.Point{float64(departureLat), float64(departureLng)}),
|
|
}, int64(departureDate))
|
|
if err != nil {
|
|
if strings.Contains(err.Error(), " no rows in result set") {
|
|
return Response(http.StatusBadRequest, "ID not found in the database"), nil
|
|
} else {
|
|
return Response(http.StatusInternalServerError, nil), nil
|
|
}
|
|
}
|
|
response := []DriverJourney{}
|
|
for _, v := range drivers {
|
|
temp := DriverJourney{}
|
|
if v.AvailabilitiesType == internal.Regular && v.RegularAvailabilities != nil {
|
|
for _, v := range v.RegularAvailabilities {
|
|
temp.RegularAvailabilitySlot = append(temp.RegularAvailabilitySlot, RegularAvailabilitySlot{
|
|
DayOfWeek: v.DayOfWeek,
|
|
StartTime: v.StartTime,
|
|
EndTime: v.EndTime,
|
|
})
|
|
}
|
|
} else if v.AvailabilitiesType == internal.Punctual && v.PunctualAvailabilities != nil {
|
|
for _, v := range v.PunctualAvailabilities {
|
|
temp.PunctualAvailabilitySlot = append(temp.PunctualAvailabilitySlot, PunctualAvailabilitySlot{
|
|
Date: int32(v.Date),
|
|
StartTime: v.StartTime,
|
|
EndTime: v.EndTime,
|
|
})
|
|
}
|
|
}
|
|
tamp := DriverJourney{
|
|
User: User{
|
|
Id: v.Driver.ID,
|
|
Operator: v.Driver.Operator,
|
|
Alias: v.Driver.Alias,
|
|
FirstName: v.Driver.FirstName,
|
|
LastName: v.Driver.LastName,
|
|
Grade: int32(v.Driver.Grade),
|
|
Picture: v.Driver.Picture,
|
|
Gender: v.Driver.Gender,
|
|
VerifiedIdentity: v.Driver.VerifiedIdentity,
|
|
},
|
|
Car: Car{
|
|
Model: v.Car.Model,
|
|
Brand: v.Car.Brand,
|
|
},
|
|
DriverDepartureDate: int64(departureDate),
|
|
Price: Price{
|
|
Type: "FREE",
|
|
},
|
|
DriverDepartureAddress: v.Driver_departure_address.Properties.MustString("name"),
|
|
}
|
|
temp.DriverDepartureAddress = tamp.DriverDepartureAddress
|
|
temp.Car = tamp.Car
|
|
temp.User = tamp.User
|
|
temp.DriverDepartureDate = tamp.DriverDepartureDate
|
|
temp.Price = tamp.Price
|
|
response = append(response, temp)
|
|
}
|
|
return Response(200, response), nil
|
|
}
|