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  }