github.com/Finschia/finschia-sdk@v0.49.1/x/foundation/keeper/internal/grpc_query.go (about)

     1  package internal
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/gogo/protobuf/proto"
     7  	"google.golang.org/grpc/codes"
     8  	"google.golang.org/grpc/status"
     9  
    10  	codectypes "github.com/Finschia/finschia-sdk/codec/types"
    11  	"github.com/Finschia/finschia-sdk/store/prefix"
    12  	sdk "github.com/Finschia/finschia-sdk/types"
    13  	sdkerrors "github.com/Finschia/finschia-sdk/types/errors"
    14  	"github.com/Finschia/finschia-sdk/types/query"
    15  	"github.com/Finschia/finschia-sdk/x/foundation"
    16  )
    17  
    18  type queryServer struct {
    19  	keeper Keeper
    20  }
    21  
    22  func NewQueryServer(keeper Keeper) foundation.QueryServer {
    23  	return &queryServer{
    24  		keeper: keeper,
    25  	}
    26  }
    27  
    28  var _ foundation.QueryServer = (*queryServer)(nil)
    29  
    30  func (s queryServer) Params(c context.Context, req *foundation.QueryParamsRequest) (*foundation.QueryParamsResponse, error) {
    31  	if req == nil {
    32  		return nil, status.Error(codes.InvalidArgument, "invalid request")
    33  	}
    34  
    35  	ctx := sdk.UnwrapSDKContext(c)
    36  
    37  	return &foundation.QueryParamsResponse{Params: s.keeper.GetParams(ctx)}, nil
    38  }
    39  
    40  func (s queryServer) Treasury(c context.Context, req *foundation.QueryTreasuryRequest) (*foundation.QueryTreasuryResponse, error) {
    41  	if req == nil {
    42  		return nil, status.Error(codes.InvalidArgument, "invalid request")
    43  	}
    44  
    45  	ctx := sdk.UnwrapSDKContext(c)
    46  	amount := s.keeper.GetTreasury(ctx)
    47  
    48  	return &foundation.QueryTreasuryResponse{Amount: amount}, nil
    49  }
    50  
    51  func (s queryServer) FoundationInfo(c context.Context, req *foundation.QueryFoundationInfoRequest) (*foundation.QueryFoundationInfoResponse, error) {
    52  	if req == nil {
    53  		return nil, status.Error(codes.InvalidArgument, "invalid request")
    54  	}
    55  
    56  	ctx := sdk.UnwrapSDKContext(c)
    57  	info := s.keeper.GetFoundationInfo(ctx)
    58  
    59  	return &foundation.QueryFoundationInfoResponse{Info: info}, nil
    60  }
    61  
    62  func (s queryServer) Member(c context.Context, req *foundation.QueryMemberRequest) (*foundation.QueryMemberResponse, error) {
    63  	if req == nil {
    64  		return nil, status.Error(codes.InvalidArgument, "invalid request")
    65  	}
    66  
    67  	ctx := sdk.UnwrapSDKContext(c)
    68  	addr, err := sdk.AccAddressFromBech32(req.Address)
    69  	if err != nil {
    70  		return nil, err
    71  	}
    72  	member, err := s.keeper.GetMember(ctx, addr)
    73  	if err != nil {
    74  		return nil, err
    75  	}
    76  
    77  	return &foundation.QueryMemberResponse{Member: member}, nil
    78  }
    79  
    80  func (s queryServer) Members(c context.Context, req *foundation.QueryMembersRequest) (*foundation.QueryMembersResponse, error) {
    81  	if req == nil {
    82  		return nil, status.Error(codes.InvalidArgument, "invalid request")
    83  	}
    84  
    85  	var members []foundation.Member
    86  	ctx := sdk.UnwrapSDKContext(c)
    87  	store := ctx.KVStore(s.keeper.storeKey)
    88  	memberStore := prefix.NewStore(store, memberKeyPrefix)
    89  	pageRes, err := query.Paginate(memberStore, req.Pagination, func(key, value []byte) error {
    90  		var member foundation.Member
    91  		s.keeper.cdc.MustUnmarshal(value, &member)
    92  		members = append(members, member)
    93  		return nil
    94  	})
    95  	if err != nil {
    96  		return nil, err
    97  	}
    98  
    99  	return &foundation.QueryMembersResponse{Members: members, Pagination: pageRes}, nil
   100  }
   101  
   102  func (s queryServer) Proposal(c context.Context, req *foundation.QueryProposalRequest) (*foundation.QueryProposalResponse, error) {
   103  	if req == nil {
   104  		return nil, status.Error(codes.InvalidArgument, "invalid request")
   105  	}
   106  
   107  	ctx := sdk.UnwrapSDKContext(c)
   108  	proposal, err := s.keeper.GetProposal(ctx, req.ProposalId)
   109  	if err != nil {
   110  		return nil, err
   111  	}
   112  
   113  	return &foundation.QueryProposalResponse{Proposal: proposal}, nil
   114  }
   115  
   116  func (s queryServer) Proposals(c context.Context, req *foundation.QueryProposalsRequest) (*foundation.QueryProposalsResponse, error) {
   117  	if req == nil {
   118  		return nil, status.Error(codes.InvalidArgument, "invalid request")
   119  	}
   120  
   121  	var proposals []foundation.Proposal
   122  	ctx := sdk.UnwrapSDKContext(c)
   123  	store := ctx.KVStore(s.keeper.storeKey)
   124  	proposalStore := prefix.NewStore(store, proposalKeyPrefix)
   125  	pageRes, err := query.Paginate(proposalStore, req.Pagination, func(key, value []byte) error {
   126  		var proposal foundation.Proposal
   127  		s.keeper.cdc.MustUnmarshal(value, &proposal)
   128  		proposals = append(proposals, proposal)
   129  		return nil
   130  	})
   131  	if err != nil {
   132  		return nil, err
   133  	}
   134  
   135  	return &foundation.QueryProposalsResponse{Proposals: proposals, Pagination: pageRes}, nil
   136  }
   137  
   138  func (s queryServer) Vote(c context.Context, req *foundation.QueryVoteRequest) (*foundation.QueryVoteResponse, error) {
   139  	if req == nil {
   140  		return nil, status.Error(codes.InvalidArgument, "invalid request")
   141  	}
   142  
   143  	ctx := sdk.UnwrapSDKContext(c)
   144  	voter, err := sdk.AccAddressFromBech32(req.Voter)
   145  	if err != nil {
   146  		return nil, status.Errorf(codes.InvalidArgument, "invalid voter address")
   147  	}
   148  	vote, err := s.keeper.GetVote(ctx, req.ProposalId, voter)
   149  	if err != nil {
   150  		return nil, err
   151  	}
   152  
   153  	return &foundation.QueryVoteResponse{Vote: vote}, nil
   154  }
   155  
   156  func (s queryServer) Votes(c context.Context, req *foundation.QueryVotesRequest) (*foundation.QueryVotesResponse, error) {
   157  	if req == nil {
   158  		return nil, status.Error(codes.InvalidArgument, "invalid request")
   159  	}
   160  
   161  	var votes []foundation.Vote
   162  	ctx := sdk.UnwrapSDKContext(c)
   163  	store := ctx.KVStore(s.keeper.storeKey)
   164  	voteStore := prefix.NewStore(store, append(voteKeyPrefix, Uint64ToBytes(req.ProposalId)...))
   165  	pageRes, err := query.Paginate(voteStore, req.Pagination, func(key, value []byte) error {
   166  		var vote foundation.Vote
   167  		s.keeper.cdc.MustUnmarshal(value, &vote)
   168  		votes = append(votes, vote)
   169  		return nil
   170  	})
   171  	if err != nil {
   172  		return nil, err
   173  	}
   174  
   175  	return &foundation.QueryVotesResponse{Votes: votes, Pagination: pageRes}, nil
   176  }
   177  
   178  func (s queryServer) TallyResult(c context.Context, req *foundation.QueryTallyResultRequest) (*foundation.QueryTallyResultResponse, error) {
   179  	if req == nil {
   180  		return nil, status.Error(codes.InvalidArgument, "invalid request")
   181  	}
   182  
   183  	ctx := sdk.UnwrapSDKContext(c)
   184  	proposal, err := s.keeper.GetProposal(ctx, req.ProposalId)
   185  	if err != nil {
   186  		return nil, err
   187  	}
   188  
   189  	tally, err := s.keeper.tally(ctx, *proposal)
   190  	if err != nil {
   191  		return nil, err
   192  	}
   193  
   194  	return &foundation.QueryTallyResultResponse{Tally: tally}, nil
   195  }
   196  
   197  func (s queryServer) Censorships(c context.Context, req *foundation.QueryCensorshipsRequest) (*foundation.QueryCensorshipsResponse, error) {
   198  	if req == nil {
   199  		return nil, status.Error(codes.InvalidArgument, "invalid request")
   200  	}
   201  
   202  	var censorships []foundation.Censorship
   203  	ctx := sdk.UnwrapSDKContext(c)
   204  	store := ctx.KVStore(s.keeper.storeKey)
   205  	censorshipStore := prefix.NewStore(store, censorshipKeyPrefix)
   206  	pageRes, err := query.Paginate(censorshipStore, req.Pagination, func(key, value []byte) error {
   207  		var censorship foundation.Censorship
   208  		s.keeper.cdc.MustUnmarshal(value, &censorship)
   209  		censorships = append(censorships, censorship)
   210  		return nil
   211  	})
   212  	if err != nil {
   213  		return nil, err
   214  	}
   215  
   216  	return &foundation.QueryCensorshipsResponse{Censorships: censorships, Pagination: pageRes}, nil
   217  }
   218  
   219  func (s queryServer) Grants(c context.Context, req *foundation.QueryGrantsRequest) (*foundation.QueryGrantsResponse, error) {
   220  	if req == nil {
   221  		return nil, status.Error(codes.InvalidArgument, "invalid request")
   222  	}
   223  
   224  	grantee, err := sdk.AccAddressFromBech32(req.Grantee)
   225  	if err != nil {
   226  		return nil, err
   227  	}
   228  
   229  	ctx := sdk.UnwrapSDKContext(c)
   230  	store := ctx.KVStore(s.keeper.storeKey)
   231  
   232  	if req.MsgTypeUrl != "" {
   233  		keyPrefix := grantKey(grantee, req.MsgTypeUrl)
   234  		grantStore := prefix.NewStore(store, keyPrefix)
   235  
   236  		var authorizations []*codectypes.Any
   237  		_, err = query.Paginate(grantStore, req.Pagination, func(key, value []byte) error {
   238  			var authorization foundation.Authorization
   239  			if err := s.keeper.cdc.UnmarshalInterface(value, &authorization); err != nil {
   240  				panic(err)
   241  			}
   242  
   243  			msg, ok := authorization.(proto.Message)
   244  			if !ok {
   245  				panic(sdkerrors.ErrInvalidType.Wrapf("can't proto marshal %T", msg))
   246  			}
   247  			any, err := codectypes.NewAnyWithValue(msg)
   248  			if err != nil {
   249  				panic(err)
   250  			}
   251  			authorizations = append(authorizations, any)
   252  
   253  			return nil
   254  		})
   255  		if err != nil {
   256  			return nil, err
   257  		}
   258  
   259  		return &foundation.QueryGrantsResponse{Authorizations: authorizations}, nil
   260  
   261  	}
   262  
   263  	keyPrefix := grantKeyPrefixByGrantee(grantee)
   264  	grantStore := prefix.NewStore(store, keyPrefix)
   265  
   266  	var authorizations []*codectypes.Any
   267  	pageRes, err := query.Paginate(grantStore, req.Pagination, func(key, value []byte) error {
   268  		var authorization foundation.Authorization
   269  		if err := s.keeper.cdc.UnmarshalInterface(value, &authorization); err != nil {
   270  			panic(err)
   271  		}
   272  
   273  		msg, ok := authorization.(proto.Message)
   274  		if !ok {
   275  			panic(sdkerrors.ErrInvalidType.Wrapf("can't proto marshal %T", msg))
   276  		}
   277  		any, err := codectypes.NewAnyWithValue(msg)
   278  		if err != nil {
   279  			panic(err)
   280  		}
   281  		authorizations = append(authorizations, any)
   282  
   283  		return nil
   284  	})
   285  	if err != nil {
   286  		return nil, err
   287  	}
   288  
   289  	return &foundation.QueryGrantsResponse{Authorizations: authorizations, Pagination: pageRes}, nil
   290  }