github.com/s7techlab/cckit@v0.10.5/examples/token/service/balance/balance.go (about) 1 package balance 2 3 import ( 4 "fmt" 5 6 "google.golang.org/protobuf/types/known/emptypb" 7 8 "github.com/s7techlab/cckit/examples/token/service/account" 9 "github.com/s7techlab/cckit/examples/token/service/config" 10 11 "github.com/s7techlab/cckit/router" 12 "github.com/s7techlab/cckit/state" 13 ) 14 15 type Service struct { 16 Account account.Getter 17 Token config.TokenGetter 18 } 19 20 func New(accountResolver account.Getter, tokenGetter config.TokenGetter) *Service { 21 return &Service{ 22 Account: accountResolver, 23 Token: tokenGetter, 24 } 25 } 26 27 func (s *Service) Store(ctx router.Context) *Store { 28 return NewStore(ctx) 29 } 30 31 func (s *Service) GetBalance(ctx router.Context, req *GetBalanceRequest) (*Balance, error) { 32 if err := router.ValidateRequest(req); err != nil { 33 return nil, err 34 } 35 36 token, err := s.Token.GetToken(ctx, &config.TokenId{Token: req.Token}) 37 if err != nil { 38 return nil, fmt.Errorf(`get token: %w`, err) 39 } 40 return s.Store(ctx).Get(req.Address, token.Token) 41 } 42 43 func (s *Service) ListBalances(ctx router.Context, _ *emptypb.Empty) (*Balances, error) { 44 balances, err := State(ctx).List(&Balance{}) 45 if err != nil { 46 return nil, err 47 } 48 return balances.(*Balances), nil 49 } 50 51 func (s *Service) ListAddressBalances(ctx router.Context, req *ListAddressBalancesRequest) (*Balances, error) { 52 balances, err := State(ctx).ListWith(&Balance{}, state.Key{req.Address}) 53 if err != nil { 54 return nil, err 55 } 56 return balances.(*Balances), nil 57 } 58 59 func (s *Service) Transfer(ctx router.Context, req *TransferRequest) (*TransferResponse, error) { 60 if err := router.ValidateRequest(req); err != nil { 61 return nil, err 62 } 63 64 invokerAddress, err := s.Account.GetInvokerAddress(ctx, nil) 65 if err != nil { 66 return nil, fmt.Errorf(`get invoker address: %w`, err) 67 } 68 69 token, err := s.Token.GetToken(ctx, &config.TokenId{Token: req.Token}) 70 if err != nil { 71 return nil, fmt.Errorf(`get token: %w`, err) 72 } 73 74 if err := s.Store(ctx).Transfer(invokerAddress.Address, req.RecipientAddress, token.Token, req.Amount); err != nil { 75 return nil, err 76 } 77 78 if err = Event(ctx).Set(&Transferred{ 79 SenderAddress: invokerAddress.Address, 80 RecipientAddress: req.RecipientAddress, 81 Token: token.Token, 82 Amount: req.Amount, 83 }); err != nil { 84 return nil, err 85 } 86 87 return &TransferResponse{ 88 SenderAddress: invokerAddress.Address, 89 RecipientAddress: req.RecipientAddress, 90 Token: token.Token, 91 Amount: req.Amount, 92 }, nil 93 }