Skip to content

Commit 60b08da

Browse files
committed
Introduce v2beta1 and migrate v2alpha1 POST API calls to GET (#6636)
1 parent 03d7e4a commit 60b08da

26 files changed

+5409
-3
lines changed

api/grpcserver/config.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,21 @@ const (
5353
AccountV2Alpha1 Service = "account_v2alpha1"
5454
MalfeasanceV2Alpha1 Service = "malfeasance_v2alpha1"
5555
MalfeasanceStreamV2Alpha1 Service = "malfeasance_stream_v2alpha1"
56+
57+
// v2beta1.
58+
ActivationV2Beta1 Service = "activation_v2beta1"
59+
ActivationStreamV2Beta1 Service = "activation_stream_v2beta1"
60+
RewardV2Beta1 Service = "reward_v2beta1"
61+
RewardStreamV2Beta1 Service = "reward_stream_v2beta1"
62+
NetworkV2Beta1 Service = "network_v2beta1"
63+
NodeV2Beta1 Service = "node_v2beta1"
64+
LayerV2Beta1 Service = "layer_v2beta1"
65+
LayerStreamV2Beta1 Service = "layer_stream_v2beta1"
66+
TransactionV2Beta1 Service = "transaction_v2beta1"
67+
TransactionStreamV2Beta1 Service = "transaction_stream_v2beta1"
68+
AccountV2Beta1 Service = "account_v2beta1"
69+
MalfeasanceV2Beta1 Service = "malfeasance_v2beta1"
70+
MalfeasanceStreamV2Beta1 Service = "malfeasance_stream_v2beta1"
5671
)
5772

5873
// DefaultConfig defines the default configuration options for api.
@@ -62,12 +77,20 @@ func DefaultConfig() Config {
6277
GlobalState, Mesh, Transaction, Node, Activation, ActivationV2Alpha1,
6378
RewardV2Alpha1, NetworkV2Alpha1, NodeV2Alpha1, LayerV2Alpha1, TransactionV2Alpha1,
6479
AccountV2Alpha1, MalfeasanceV2Alpha1,
80+
81+
// v2beta1
82+
ActivationV2Beta1, RewardV2Beta1, NetworkV2Beta1, NodeV2Beta1,
83+
LayerV2Beta1, TransactionV2Beta1, AccountV2Beta1, MalfeasanceV2Beta1,
6584
},
6685
PublicListener: "0.0.0.0:9092",
6786
PrivateServices: []Service{
6887
Admin, Smesher, Debug, ActivationStreamV2Alpha1,
6988
RewardStreamV2Alpha1, LayerStreamV2Alpha1, TransactionStreamV2Alpha1,
7089
MalfeasanceStreamV2Alpha1,
90+
91+
// v2beta1
92+
ActivationStreamV2Beta1, RewardStreamV2Beta1, LayerStreamV2Beta1,
93+
TransactionStreamV2Beta1, MalfeasanceStreamV2Beta1,
7194
},
7295
PrivateListener: "127.0.0.1:9093",
7396
PostServices: []Service{Post, PostInfo},

api/grpcserver/v2beta1/account.go

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
package v2beta1
2+
3+
import (
4+
"context"
5+
6+
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
7+
spacemeshv2beta1 "github.com/spacemeshos/api/release/go/spacemesh/v2beta1"
8+
"google.golang.org/grpc"
9+
"google.golang.org/grpc/codes"
10+
"google.golang.org/grpc/status"
11+
12+
"github.com/spacemeshos/go-spacemesh/common/types"
13+
"github.com/spacemeshos/go-spacemesh/sql"
14+
"github.com/spacemeshos/go-spacemesh/sql/accounts"
15+
"github.com/spacemeshos/go-spacemesh/sql/builder"
16+
)
17+
18+
const (
19+
Account = "account_v2beta1"
20+
)
21+
22+
type accountConState interface {
23+
GetProjection(types.Address) (uint64, uint64)
24+
}
25+
26+
func NewAccountService(db sql.Executor, conState accountConState) *AccountService {
27+
return &AccountService{
28+
db: db,
29+
conState: conState,
30+
}
31+
}
32+
33+
type AccountService struct {
34+
db sql.Executor
35+
conState accountConState
36+
}
37+
38+
func (s *AccountService) RegisterService(server *grpc.Server) {
39+
spacemeshv2beta1.RegisterAccountServiceServer(server, s)
40+
}
41+
42+
func (s *AccountService) RegisterHandlerService(mux *runtime.ServeMux) error {
43+
return spacemeshv2beta1.RegisterAccountServiceHandlerServer(context.Background(), mux, s)
44+
}
45+
46+
// String returns the service name.
47+
func (s *AccountService) String() string {
48+
return "AccountService"
49+
}
50+
51+
func (s *AccountService) List(
52+
_ context.Context,
53+
request *spacemeshv2beta1.AccountRequest,
54+
) (*spacemeshv2beta1.AccountList, error) {
55+
switch {
56+
case request.Limit > 100:
57+
return nil, status.Error(codes.InvalidArgument, "limit is capped at 100")
58+
case request.Limit == 0:
59+
return nil, status.Error(codes.InvalidArgument, "limit must be set to <= 100")
60+
}
61+
62+
ops, err := toAccountOperations(request)
63+
if err != nil {
64+
return nil, status.Error(codes.InvalidArgument, err.Error())
65+
}
66+
67+
rst := make([]*spacemeshv2beta1.Account, 0, request.Limit)
68+
if err := accounts.IterateAccountsOps(s.db, ops, func(account *types.Account) bool {
69+
counterProjected, balanceProjected := s.conState.GetProjection(account.Address)
70+
item := &spacemeshv2beta1.Account{
71+
Address: account.Address.String(),
72+
Current: &spacemeshv2beta1.AccountState{
73+
Counter: account.NextNonce,
74+
Balance: account.Balance,
75+
Layer: account.Layer.Uint32(),
76+
},
77+
Projected: &spacemeshv2beta1.AccountState{
78+
Counter: counterProjected,
79+
Balance: balanceProjected,
80+
},
81+
}
82+
if account.TemplateAddress != nil {
83+
item.Template = account.TemplateAddress.String()
84+
}
85+
rst = append(rst, item)
86+
return true
87+
}); err != nil {
88+
return nil, status.Error(codes.Internal, err.Error())
89+
}
90+
91+
return &spacemeshv2beta1.AccountList{Accounts: rst}, nil
92+
}
93+
94+
func toAccountOperations(filter *spacemeshv2beta1.AccountRequest) (builder.Operations, error) {
95+
ops := builder.Operations{}
96+
if filter == nil {
97+
return ops, nil
98+
}
99+
100+
if len(filter.Addresses) > 0 {
101+
var addrs [][]byte
102+
for _, address := range filter.Addresses {
103+
addr, err := types.StringToAddress(address)
104+
if err != nil {
105+
return builder.Operations{}, err
106+
}
107+
addrs = append(addrs, addr.Bytes())
108+
}
109+
110+
ops.Filter = append(ops.Filter, builder.Op{
111+
Field: builder.Address,
112+
Token: builder.In,
113+
Value: addrs,
114+
})
115+
}
116+
117+
ops.Modifiers = append(ops.Modifiers, builder.Modifier{
118+
Key: builder.GroupBy,
119+
Value: "address",
120+
})
121+
122+
ops.Modifiers = append(ops.Modifiers, builder.Modifier{
123+
Key: builder.OrderBy,
124+
Value: "layer_updated desc",
125+
})
126+
127+
if filter.Limit != 0 {
128+
ops.Modifiers = append(ops.Modifiers, builder.Modifier{
129+
Key: builder.Limit,
130+
Value: int64(filter.Limit),
131+
})
132+
}
133+
if filter.Offset != 0 {
134+
ops.Modifiers = append(ops.Modifiers, builder.Modifier{
135+
Key: builder.Offset,
136+
Value: int64(filter.Offset),
137+
})
138+
}
139+
140+
return ops, nil
141+
}

api/grpcserver/v2beta1/account_mocks.go

Lines changed: 79 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)