github.com/Finschia/finschia-sdk@v0.48.1/x/gov/keeper/querier.go (about)

     1  package keeper
     2  
     3  import (
     4  	abci "github.com/tendermint/tendermint/abci/types"
     5  
     6  	"github.com/Finschia/finschia-sdk/client"
     7  	"github.com/Finschia/finschia-sdk/codec"
     8  	sdk "github.com/Finschia/finschia-sdk/types"
     9  	sdkerrors "github.com/Finschia/finschia-sdk/types/errors"
    10  	"github.com/Finschia/finschia-sdk/x/gov/types"
    11  )
    12  
    13  // NewQuerier creates a new gov Querier instance
    14  func NewQuerier(keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) sdk.Querier {
    15  	return func(ctx sdk.Context, path []string, req abci.RequestQuery) ([]byte, error) {
    16  		switch path[0] {
    17  		case types.QueryParams:
    18  			return queryParams(ctx, path[1:], req, keeper, legacyQuerierCdc)
    19  
    20  		case types.QueryProposals:
    21  			return queryProposals(ctx, path[1:], req, keeper, legacyQuerierCdc)
    22  
    23  		case types.QueryProposal:
    24  			return queryProposal(ctx, path[1:], req, keeper, legacyQuerierCdc)
    25  
    26  		case types.QueryDeposits:
    27  			return queryDeposits(ctx, path[1:], req, keeper, legacyQuerierCdc)
    28  
    29  		case types.QueryDeposit:
    30  			return queryDeposit(ctx, path[1:], req, keeper, legacyQuerierCdc)
    31  
    32  		case types.QueryVotes:
    33  			return queryVotes(ctx, path[1:], req, keeper, legacyQuerierCdc)
    34  
    35  		case types.QueryVote:
    36  			return queryVote(ctx, path[1:], req, keeper, legacyQuerierCdc)
    37  
    38  		case types.QueryTally:
    39  			return queryTally(ctx, path[1:], req, keeper, legacyQuerierCdc)
    40  
    41  		default:
    42  			return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unknown query path: %s", path[0])
    43  		}
    44  	}
    45  }
    46  
    47  func queryParams(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) {
    48  	switch path[0] {
    49  	case types.ParamDeposit:
    50  		bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, keeper.GetDepositParams(ctx))
    51  		if err != nil {
    52  			return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
    53  		}
    54  		return bz, nil
    55  
    56  	case types.ParamVoting:
    57  		bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, keeper.GetVotingParams(ctx))
    58  		if err != nil {
    59  			return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
    60  		}
    61  		return bz, nil
    62  
    63  	case types.ParamTallying:
    64  		bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, keeper.GetTallyParams(ctx))
    65  		if err != nil {
    66  			return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
    67  		}
    68  		return bz, nil
    69  
    70  	default:
    71  		return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "%s is not a valid query request path", req.Path)
    72  	}
    73  }
    74  
    75  // nolint: unparam
    76  func queryProposal(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) {
    77  	var params types.QueryProposalParams
    78  	err := legacyQuerierCdc.UnmarshalJSON(req.Data, &params)
    79  	if err != nil {
    80  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
    81  	}
    82  
    83  	proposal, ok := keeper.GetProposal(ctx, params.ProposalID)
    84  	if !ok {
    85  		return nil, sdkerrors.Wrapf(types.ErrUnknownProposal, "%d", params.ProposalID)
    86  	}
    87  
    88  	bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, proposal)
    89  	if err != nil {
    90  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
    91  	}
    92  
    93  	return bz, nil
    94  }
    95  
    96  // nolint: unparam
    97  func queryDeposit(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) {
    98  	var params types.QueryDepositParams
    99  	err := legacyQuerierCdc.UnmarshalJSON(req.Data, &params)
   100  	if err != nil {
   101  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
   102  	}
   103  
   104  	deposit, _ := keeper.GetDeposit(ctx, params.ProposalID, params.Depositor)
   105  	bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, deposit)
   106  	if err != nil {
   107  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
   108  	}
   109  
   110  	return bz, nil
   111  }
   112  
   113  // nolint: unparam
   114  func queryVote(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) {
   115  	var params types.QueryVoteParams
   116  	err := legacyQuerierCdc.UnmarshalJSON(req.Data, &params)
   117  	if err != nil {
   118  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
   119  	}
   120  
   121  	vote, _ := keeper.GetVote(ctx, params.ProposalID, params.Voter)
   122  	bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, vote)
   123  	if err != nil {
   124  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
   125  	}
   126  
   127  	return bz, nil
   128  }
   129  
   130  // nolint: unparam
   131  func queryDeposits(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) {
   132  	var params types.QueryProposalParams
   133  	err := legacyQuerierCdc.UnmarshalJSON(req.Data, &params)
   134  	if err != nil {
   135  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
   136  	}
   137  
   138  	deposits := keeper.GetDeposits(ctx, params.ProposalID)
   139  	if deposits == nil {
   140  		deposits = types.Deposits{}
   141  	}
   142  
   143  	bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, deposits)
   144  	if err != nil {
   145  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
   146  	}
   147  
   148  	return bz, nil
   149  }
   150  
   151  // nolint: unparam
   152  func queryTally(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) {
   153  	var params types.QueryProposalParams
   154  	err := legacyQuerierCdc.UnmarshalJSON(req.Data, &params)
   155  	if err != nil {
   156  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
   157  	}
   158  
   159  	proposalID := params.ProposalID
   160  
   161  	proposal, ok := keeper.GetProposal(ctx, proposalID)
   162  	if !ok {
   163  		return nil, sdkerrors.Wrapf(types.ErrUnknownProposal, "%d", proposalID)
   164  	}
   165  
   166  	var tallyResult types.TallyResult
   167  
   168  	switch {
   169  	case proposal.Status == types.StatusDepositPeriod:
   170  		tallyResult = types.EmptyTallyResult()
   171  
   172  	case proposal.Status == types.StatusPassed || proposal.Status == types.StatusRejected:
   173  		tallyResult = proposal.FinalTallyResult
   174  
   175  	default:
   176  		// proposal is in voting period
   177  		_, _, tallyResult = keeper.Tally(ctx, proposal)
   178  	}
   179  
   180  	bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, tallyResult)
   181  	if err != nil {
   182  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
   183  	}
   184  
   185  	return bz, nil
   186  }
   187  
   188  // nolint: unparam
   189  func queryVotes(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) {
   190  	var params types.QueryProposalVotesParams
   191  	err := legacyQuerierCdc.UnmarshalJSON(req.Data, &params)
   192  	if err != nil {
   193  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
   194  	}
   195  
   196  	votes := keeper.GetVotes(ctx, params.ProposalID)
   197  	if votes == nil {
   198  		votes = types.Votes{}
   199  	} else {
   200  		start, end := client.Paginate(len(votes), params.Page, params.Limit, 100)
   201  		if start < 0 || end < 0 {
   202  			votes = types.Votes{}
   203  		} else {
   204  			votes = votes[start:end]
   205  		}
   206  	}
   207  
   208  	bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, votes)
   209  	if err != nil {
   210  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
   211  	}
   212  
   213  	return bz, nil
   214  }
   215  
   216  func queryProposals(ctx sdk.Context, _ []string, req abci.RequestQuery, keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) {
   217  	var params types.QueryProposalsParams
   218  	err := legacyQuerierCdc.UnmarshalJSON(req.Data, &params)
   219  	if err != nil {
   220  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
   221  	}
   222  
   223  	proposals := keeper.GetProposalsFiltered(ctx, params)
   224  	if proposals == nil {
   225  		proposals = types.Proposals{}
   226  	}
   227  
   228  	bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, proposals)
   229  	if err != nil {
   230  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
   231  	}
   232  
   233  	return bz, nil
   234  }