cosmos-sdk/x/gov/queryable.go

232 lines
7.1 KiB
Go
Raw Normal View History

2018-07-31 18:48:32 -07:00
package gov
import (
"github.com/cosmos/cosmos-sdk/codec"
2018-07-31 18:48:32 -07:00
sdk "github.com/cosmos/cosmos-sdk/types"
abci "github.com/tendermint/tendermint/abci/types"
)
// query endpoints supported by the governance Querier
const (
QueryProposals = "proposals"
QueryProposal = "proposal"
QueryDeposits = "deposits"
QueryDeposit = "deposit"
QueryVotes = "votes"
QueryVote = "vote"
QueryTally = "tally"
)
2018-08-03 12:55:00 -07:00
func NewQuerier(keeper Keeper) sdk.Querier {
return func(ctx sdk.Context, path []string, req abci.RequestQuery) (res []byte, err sdk.Error) {
switch path[0] {
case QueryProposals:
return queryProposals(ctx, path[1:], req, keeper)
case QueryProposal:
2018-08-03 12:55:00 -07:00
return queryProposal(ctx, path[1:], req, keeper)
case QueryDeposits:
2018-08-03 12:55:00 -07:00
return queryDeposits(ctx, path[1:], req, keeper)
case QueryDeposit:
return queryDeposit(ctx, path[1:], req, keeper)
case QueryVotes:
2018-08-03 12:55:00 -07:00
return queryVotes(ctx, path[1:], req, keeper)
case QueryVote:
return queryVote(ctx, path[1:], req, keeper)
case QueryTally:
2018-08-03 12:55:00 -07:00
return queryTally(ctx, path[1:], req, keeper)
default:
return nil, sdk.ErrUnknownRequest("unknown gov query endpoint")
}
}
}
// Params for query 'custom/gov/proposal'
type QueryProposalParams struct {
ProposalID uint64
2018-07-31 18:48:32 -07:00
}
2018-08-31 15:22:37 -07:00
// nolint: unparam
2018-08-03 12:55:00 -07:00
func queryProposal(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) (res []byte, err sdk.Error) {
var params QueryProposalParams
2018-08-22 00:10:11 -07:00
err2 := keeper.cdc.UnmarshalJSON(req.Data, &params)
2018-08-03 12:55:00 -07:00
if err2 != nil {
return nil, sdk.ErrUnknownRequest(sdk.AppendMsgToErr("incorrectly formatted request data", err2.Error()))
2018-08-03 12:55:00 -07:00
}
proposal := keeper.GetProposal(ctx, params.ProposalID)
if proposal == nil {
return nil, ErrUnknownProposal(DefaultCodespace, params.ProposalID)
2018-07-31 18:48:32 -07:00
}
2018-08-22 00:10:11 -07:00
bz, err2 := codec.MarshalJSONIndent(keeper.cdc, proposal)
2018-08-22 00:10:11 -07:00
if err2 != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err2.Error()))
2018-08-22 00:10:11 -07:00
}
return bz, nil
2018-07-31 18:48:32 -07:00
}
2018-08-03 12:55:00 -07:00
// Params for query 'custom/gov/deposit'
type QueryDepositParams struct {
ProposalID uint64
2018-08-03 12:55:00 -07:00
Depositer sdk.AccAddress
}
2018-08-31 15:22:37 -07:00
// nolint: unparam
2018-08-03 12:55:00 -07:00
func queryDeposit(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) (res []byte, err sdk.Error) {
var params QueryDepositParams
2018-08-22 00:10:11 -07:00
err2 := keeper.cdc.UnmarshalJSON(req.Data, &params)
2018-08-03 12:55:00 -07:00
if err2 != nil {
return nil, sdk.ErrUnknownRequest(sdk.AppendMsgToErr("incorrectly formatted request data", err2.Error()))
2018-07-31 18:48:32 -07:00
}
2018-08-03 12:55:00 -07:00
deposit, _ := keeper.GetDeposit(ctx, params.ProposalID, params.Depositer)
bz, err2 := codec.MarshalJSONIndent(keeper.cdc, deposit)
2018-08-22 00:10:11 -07:00
if err2 != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err2.Error()))
2018-08-22 00:10:11 -07:00
}
return bz, nil
2018-07-31 18:48:32 -07:00
}
2018-08-03 12:55:00 -07:00
// Params for query 'custom/gov/vote'
type QueryVoteParams struct {
ProposalID uint64
2018-08-03 12:55:00 -07:00
Voter sdk.AccAddress
}
2018-08-31 15:22:37 -07:00
// nolint: unparam
2018-08-03 12:55:00 -07:00
func queryVote(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) (res []byte, err sdk.Error) {
var params QueryVoteParams
2018-08-22 00:10:11 -07:00
err2 := keeper.cdc.UnmarshalJSON(req.Data, &params)
2018-08-03 12:55:00 -07:00
if err2 != nil {
return nil, sdk.ErrUnknownRequest(sdk.AppendMsgToErr("incorrectly formatted request data", err2.Error()))
2018-07-31 18:48:32 -07:00
}
2018-08-03 12:55:00 -07:00
vote, _ := keeper.GetVote(ctx, params.ProposalID, params.Voter)
bz, err2 := codec.MarshalJSONIndent(keeper.cdc, vote)
2018-08-22 00:10:11 -07:00
if err2 != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err2.Error()))
2018-08-22 00:10:11 -07:00
}
return bz, nil
2018-08-03 12:55:00 -07:00
}
// Params for query 'custom/gov/deposits'
type QueryDepositsParams struct {
ProposalID uint64
2018-08-03 12:55:00 -07:00
}
2018-08-31 15:22:37 -07:00
// nolint: unparam
2018-08-03 12:55:00 -07:00
func queryDeposits(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) (res []byte, err sdk.Error) {
2018-10-12 19:05:22 -07:00
var params QueryDepositsParams
2018-08-22 00:10:11 -07:00
err2 := keeper.cdc.UnmarshalJSON(req.Data, &params)
2018-08-03 12:55:00 -07:00
if err2 != nil {
return nil, sdk.ErrUnknownRequest(sdk.AppendMsgToErr("incorrectly formatted request data", err2.Error()))
2018-07-31 18:48:32 -07:00
}
2018-08-03 12:55:00 -07:00
var deposits []Deposit
depositsIterator := keeper.GetDeposits(ctx, params.ProposalID)
for ; depositsIterator.Valid(); depositsIterator.Next() {
deposit := Deposit{}
keeper.cdc.MustUnmarshalBinaryLengthPrefixed(depositsIterator.Value(), &deposit)
2018-08-03 12:55:00 -07:00
deposits = append(deposits, deposit)
}
bz, err2 := codec.MarshalJSONIndent(keeper.cdc, deposits)
2018-08-22 00:10:11 -07:00
if err2 != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err2.Error()))
2018-08-22 00:10:11 -07:00
}
return bz, nil
2018-07-31 18:48:32 -07:00
}
2018-08-03 12:55:00 -07:00
// Params for query 'custom/gov/votes'
type QueryVotesParams struct {
ProposalID uint64
2018-08-03 12:55:00 -07:00
}
2018-08-31 15:22:37 -07:00
// nolint: unparam
2018-08-03 12:55:00 -07:00
func queryVotes(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) (res []byte, err sdk.Error) {
var params QueryVotesParams
2018-08-22 00:10:11 -07:00
err2 := keeper.cdc.UnmarshalJSON(req.Data, &params)
2018-08-03 12:55:00 -07:00
if err2 != nil {
return nil, sdk.ErrUnknownRequest(sdk.AppendMsgToErr("incorrectly formatted request data", err2.Error()))
2018-07-31 18:48:32 -07:00
}
2018-08-03 12:55:00 -07:00
var votes []Vote
votesIterator := keeper.GetVotes(ctx, params.ProposalID)
for ; votesIterator.Valid(); votesIterator.Next() {
vote := Vote{}
keeper.cdc.MustUnmarshalBinaryLengthPrefixed(votesIterator.Value(), &vote)
2018-08-03 12:55:00 -07:00
votes = append(votes, vote)
}
bz, err2 := codec.MarshalJSONIndent(keeper.cdc, votes)
2018-08-22 00:10:11 -07:00
if err2 != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err2.Error()))
2018-08-22 00:10:11 -07:00
}
return bz, nil
2018-08-03 12:55:00 -07:00
}
// Params for query 'custom/gov/proposals'
type QueryProposalsParams struct {
Voter sdk.AccAddress
Depositer sdk.AccAddress
ProposalStatus ProposalStatus
Limit uint64
2018-08-03 12:55:00 -07:00
}
2018-08-31 15:22:37 -07:00
// nolint: unparam
2018-08-03 12:55:00 -07:00
func queryProposals(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) (res []byte, err sdk.Error) {
var params QueryProposalsParams
2018-08-22 00:10:11 -07:00
err2 := keeper.cdc.UnmarshalJSON(req.Data, &params)
2018-08-03 12:55:00 -07:00
if err2 != nil {
return nil, sdk.ErrUnknownRequest(sdk.AppendMsgToErr("incorrectly formatted request data", err2.Error()))
2018-07-31 18:48:32 -07:00
}
2018-08-03 12:55:00 -07:00
proposals := keeper.GetProposalsFiltered(ctx, params.Voter, params.Depositer, params.ProposalStatus, params.Limit)
2018-08-03 12:55:00 -07:00
bz, err2 := codec.MarshalJSONIndent(keeper.cdc, proposals)
2018-08-22 00:10:11 -07:00
if err2 != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err2.Error()))
2018-08-22 00:10:11 -07:00
}
2018-08-03 12:55:00 -07:00
return bz, nil
}
// Params for query 'custom/gov/tally'
type QueryTallyParams struct {
ProposalID uint64
2018-08-03 12:55:00 -07:00
}
2018-08-31 15:22:37 -07:00
// nolint: unparam
2018-08-03 12:55:00 -07:00
func queryTally(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) (res []byte, err sdk.Error) {
// TODO: Dependant on #1914
var params QueryTallyParams
err2 := keeper.cdc.UnmarshalJSON(req.Data, &params)
2018-08-17 00:40:30 -07:00
if err2 != nil {
return nil, sdk.ErrUnknownRequest(sdk.AppendMsgToErr("incorrectly formatted request data", err2.Error()))
2018-08-17 00:40:30 -07:00
}
proposalID := params.ProposalID
2018-08-17 00:40:30 -07:00
proposal := keeper.GetProposal(ctx, proposalID)
if proposal == nil {
return nil, ErrUnknownProposal(DefaultCodespace, proposalID)
2018-08-17 00:40:30 -07:00
}
2018-08-22 00:10:11 -07:00
var tallyResult TallyResult
2018-08-17 00:40:30 -07:00
if proposal.GetStatus() == StatusDepositPeriod {
2018-08-22 00:10:11 -07:00
tallyResult = EmptyTallyResult()
} else if proposal.GetStatus() == StatusPassed || proposal.GetStatus() == StatusRejected {
tallyResult = proposal.GetTallyResult()
} else {
_, tallyResult = tally(ctx, keeper, proposal)
2018-08-17 00:40:30 -07:00
}
bz, err2 := codec.MarshalJSONIndent(keeper.cdc, tallyResult)
2018-08-22 00:10:11 -07:00
if err2 != nil {
return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err2.Error()))
2018-08-17 00:40:30 -07:00
}
2018-08-22 00:10:11 -07:00
return bz, nil
2018-07-31 18:48:32 -07:00
}