initial commit
This commit is contained in:
87
servers/grpc/server/grpc.go
Normal file
87
servers/grpc/server/grpc.go
Normal file
@@ -0,0 +1,87 @@
|
||||
package grpcserver
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"git.coopgo.io/coopgo-platform/multimodal-routing/handlers"
|
||||
"git.coopgo.io/coopgo-platform/multimodal-routing/servers/grpc/proto"
|
||||
"github.com/paulmach/orb/geojson"
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/spf13/viper"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/reflection"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
type MultimodalRoutingServer struct {
|
||||
Handler *handlers.MultimodalRoutingHandler
|
||||
|
||||
proto.UnimplementedMultimodalRoutingServer
|
||||
}
|
||||
|
||||
func NewMultimodalRoutingServer(handler *handlers.MultimodalRoutingHandler) *MultimodalRoutingServer {
|
||||
return &MultimodalRoutingServer{
|
||||
Handler: handler,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *MultimodalRoutingServer) Search(ctx context.Context, req *proto.SearchRequest) (*proto.SearchResponse, error) {
|
||||
departure, err := geojson.UnmarshalFeature([]byte(req.Departure.Serialized))
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("error decoding departure")
|
||||
return nil, status.Errorf(codes.Internal, "could not read departure: %w", err)
|
||||
}
|
||||
destination, err := geojson.UnmarshalFeature([]byte(req.Destination.Serialized))
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("error decoding destination")
|
||||
return nil, status.Errorf(codes.Internal, "could not read destination: %w", err)
|
||||
}
|
||||
departureDate := req.DepartureDate.AsTime()
|
||||
journeys, err := s.Handler.Search(*departure, *destination, departureDate)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Any("departure", departure).Any("destination", destination).Time("departure date", departureDate).Msg("error retrieving carpools")
|
||||
}
|
||||
|
||||
results := []*proto.FeatureCollection{}
|
||||
for _, c := range journeys {
|
||||
serialized, err := c.MarshalJSON()
|
||||
if err != nil {
|
||||
log.Error().Err(err).Any("carpool object", c).Msg("could not serialize carpool response")
|
||||
continue
|
||||
}
|
||||
results = append(results, &proto.FeatureCollection{Serialized: string(serialized)})
|
||||
}
|
||||
|
||||
return &proto.SearchResponse{
|
||||
Results: results,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func Run(failed chan error, cfg *viper.Viper, handler *handlers.MultimodalRoutingHandler) {
|
||||
var (
|
||||
dev_env = cfg.GetBool("dev_env")
|
||||
address = fmt.Sprintf(":%s", cfg.GetString("services.grpc.port"))
|
||||
)
|
||||
|
||||
server := grpc.NewServer()
|
||||
|
||||
proto.RegisterMultimodalRoutingServer(server, NewMultimodalRoutingServer(handler))
|
||||
l, err := net.Listen("tcp", address)
|
||||
if err != nil {
|
||||
failed <- fmt.Errorf("error trying to listen to network port : %w", err)
|
||||
return
|
||||
}
|
||||
|
||||
if dev_env {
|
||||
log.Info().Msg("gRPC server reflexion activated")
|
||||
reflection.Register(server)
|
||||
}
|
||||
|
||||
log.Info().Str("address", address).Msg("running gRPC server")
|
||||
if err := server.Serve(l); err != nil {
|
||||
failed <- fmt.Errorf("error in grpc server : %w", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user