This repository has been archived by the owner on May 17, 2022. It is now read-only.
/
server_create.go
90 lines (76 loc) · 2.44 KB
/
server_create.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
82
83
84
85
86
87
88
89
90
package api
import (
"context"
"fmt"
"github.com/FrancescoIlario/usplay/internal/services/activity/storage"
"github.com/FrancescoIlario/usplay/pkg/services/activitycomm"
"github.com/FrancescoIlario/usplay/pkg/services/activitytypecomm"
"github.com/golang/protobuf/ptypes"
"github.com/google/uuid"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
func (s *activityServer) Create(ctx context.Context, req *activitycomm.CreateActivityRequest) (*activitycomm.CreateActivityReply, error) {
// parse inputs
if err := s.validateActivityType(ctx, req.GetActTypeID()); err != nil {
return nil, err
}
period, err := s.validatePeriod(req.GetPeriod())
if err != nil {
return nil, status.Errorf(codes.InvalidArgument, "error creating activity: %v", err)
}
// period := req.GetPeriod()
// create store data
act := storage.Activity{
Period: *period,
ActivityTypeID: req.GetActTypeID(),
OrderID: req.GetOrderID(),
}
// persista data
id, err := s.repo.Create(ctx, act)
if err != nil {
return nil, status.Errorf(codes.Internal, "error creating activity: %v", err)
}
// reply
return &activitycomm.CreateActivityReply{
Id: id.String(),
}, nil
}
func (s *activityServer) validatePeriod(period *activitycomm.Interval) (*storage.Interval, error) {
if period == nil {
return nil, fmt.Errorf("Period is not defined")
}
if period.From == nil {
return nil, fmt.Errorf("Period's From is not defined")
}
if period.To == nil {
return nil, fmt.Errorf("Period's To is not defined")
}
from, err := ptypes.Timestamp(period.From)
if err != nil {
return nil, fmt.Errorf("Period's From is invalid: %v", period.From)
}
to, err := ptypes.Timestamp(period.To)
if err != nil {
return nil, fmt.Errorf("Period's To is invalid: %v", period.To)
}
return &storage.Interval{
From: from,
To: to,
}, nil
}
func (s *activityServer) validateActivityType(ctx context.Context, actTypeIDStr string) error {
_, err := uuid.Parse(actTypeIDStr)
if err != nil {
return status.Errorf(codes.InvalidArgument, "error creating activity, ActivityType ID is invalid: %v", err)
}
// validate inputs
rpl, err := s.actTypeCli.Exist(ctx, &activitytypecomm.ExistActivityTypeRequest{Id: actTypeIDStr})
if err != nil {
return status.Errorf(codes.Unavailable, "error contacting ActivityType service: %v", err)
}
if !rpl.Exists {
return status.Errorf(codes.NotFound, "ActivityType with id %v do not exists", actTypeIDStr)
}
return nil
}