This repository has been archived by the owner on Sep 26, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathservice.go
81 lines (71 loc) · 2.38 KB
/
service.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package grpc
import (
// stdlib
"context"
// external
"github.com/go-kit/kit/log"
kitgrpc "github.com/go-kit/kit/transport/grpc"
"github.com/kevinburke/go.uuid"
oldcontext "golang.org/x/net/context"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
// project
"github.com/basvanbeek/opencensus-gokit-example/services/device"
"github.com/basvanbeek/opencensus-gokit-example/services/device/transport"
"github.com/basvanbeek/opencensus-gokit-example/services/device/transport/pb"
)
// grpc transport service for QR service.
type grpcServer struct {
unlock kitgrpc.Handler
logger log.Logger
}
// NewService returns a new gRPC service for the provided Go kit endpoints
func NewService(
endpoints transport.Endpoints, options []kitgrpc.ServerOption,
logger log.Logger,
) pb.DeviceServer {
var (
errorLogger = kitgrpc.ServerErrorLogger(logger)
)
options = append(options, errorLogger)
return &grpcServer{
unlock: kitgrpc.NewServer(
endpoints.Unlock, decodeUnlockRequest, encodeUnlockResponse, options...,
),
logger: logger,
}
}
// Generate glues the gRPC method to the Go kit service method
func (s *grpcServer) Unlock(ctx oldcontext.Context, req *pb.UnlockRequest) (*pb.UnlockResponse, error) {
_, rep, err := s.unlock.ServeGRPC(ctx, req)
if err != nil {
return nil, err
}
return rep.(*pb.UnlockResponse), nil
}
// decodeUnlockRequest decodes the incoming grpc payload to our go kit payload
func decodeUnlockRequest(_ context.Context, request interface{}) (interface{}, error) {
req := request.(*pb.UnlockRequest)
return transport.UnlockRequest{
EventID: uuid.FromBytesOrNil(req.EventId),
DeviceID: uuid.FromBytesOrNil(req.DeviceId),
Code: req.Code,
}, nil
}
// encodeUnlockResponse encodes the outgoing go kit payload to the grpc payload
func encodeUnlockResponse(_ context.Context, response interface{}) (interface{}, error) {
res := response.(transport.UnlockResponse)
switch res.Err {
case nil:
return &pb.UnlockResponse{
EventCaption: res.EventCaption,
DeviceCaption: res.DeviceCaption,
}, nil
case device.ErrRequireEventID, device.ErrRequireDeviceID, device.ErrRequireUnlockCode:
return nil, status.Error(codes.InvalidArgument, res.Err.Error())
case device.ErrEventNotFound, device.ErrUnlockNotFound:
return nil, status.Error(codes.Unauthenticated, res.Err.Error())
default:
return nil, status.Error(codes.Unknown, res.Err.Error())
}
}