Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
89 lines (80 sloc) 2.01 KB
//go:generate protoc ./catalog.proto --go_out=plugins=grpc:./pb
package catalog
import (
"context"
"fmt"
"log"
"net"
"github.com/tinrab/spidey/catalog/pb"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
)
type grpcServer struct {
service Service
}
func ListenGRPC(s Service, port int) error {
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
if err != nil {
return err
}
serv := grpc.NewServer()
pb.RegisterCatalogServiceServer(serv, &grpcServer{s})
reflection.Register(serv)
return serv.Serve(lis)
}
func (s *grpcServer) PostProduct(ctx context.Context, r *pb.PostProductRequest) (*pb.PostProductResponse, error) {
p, err := s.service.PostProduct(ctx, r.Name, r.Description, r.Price)
if err != nil {
log.Println(err)
return nil, err
}
return &pb.PostProductResponse{Product: &pb.Product{
Id: p.ID,
Name: p.Name,
Description: p.Description,
Price: p.Price,
}}, nil
}
func (s *grpcServer) GetProduct(ctx context.Context, r *pb.GetProductRequest) (*pb.GetProductResponse, error) {
p, err := s.service.GetProduct(ctx, r.Id)
if err != nil {
log.Println(err)
return nil, err
}
return &pb.GetProductResponse{
Product: &pb.Product{
Id: p.ID,
Name: p.Name,
Description: p.Description,
Price: p.Price,
},
}, nil
}
func (s *grpcServer) GetProducts(ctx context.Context, r *pb.GetProductsRequest) (*pb.GetProductsResponse, error) {
var res []Product
var err error
if r.Query != "" {
res, err = s.service.SearchProducts(ctx, r.Query, r.Skip, r.Take)
} else if len(r.Ids) != 0 {
res, err = s.service.GetProductsByIDs(ctx, r.Ids)
} else {
res, err = s.service.GetProducts(ctx, r.Skip, r.Take)
}
if err != nil {
log.Println(err)
return nil, err
}
products := []*pb.Product{}
for _, p := range res {
products = append(
products,
&pb.Product{
Id: p.ID,
Name: p.Name,
Description: p.Description,
Price: p.Price,
},
)
}
return &pb.GetProductsResponse{Products: products}, nil
}