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

     1  package keeper
     2  
     3  import (
     4  	"context"
     5  
     6  	proto "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  	"github.com/Finschia/finschia-sdk/types/query"
    14  	"github.com/Finschia/finschia-sdk/x/evidence/types"
    15  )
    16  
    17  var _ types.QueryServer = Keeper{}
    18  
    19  // Evidence implements the Query/Evidence gRPC method
    20  func (k Keeper) Evidence(c context.Context, req *types.QueryEvidenceRequest) (*types.QueryEvidenceResponse, error) {
    21  	if req == nil {
    22  		return nil, status.Errorf(codes.InvalidArgument, "empty request")
    23  	}
    24  
    25  	if req.EvidenceHash == nil {
    26  		return nil, status.Errorf(codes.InvalidArgument, "invalid hash")
    27  	}
    28  
    29  	ctx := sdk.UnwrapSDKContext(c)
    30  
    31  	evidence, _ := k.GetEvidence(ctx, req.EvidenceHash)
    32  	if evidence == nil {
    33  		return nil, status.Errorf(codes.NotFound, "evidence %s not found", req.EvidenceHash)
    34  	}
    35  
    36  	msg, ok := evidence.(proto.Message)
    37  	if !ok {
    38  		return nil, status.Errorf(codes.Internal, "can't protomarshal %T", msg)
    39  	}
    40  
    41  	evidenceAny, err := codectypes.NewAnyWithValue(msg)
    42  	if err != nil {
    43  		return nil, status.Errorf(codes.Internal, err.Error())
    44  	}
    45  
    46  	return &types.QueryEvidenceResponse{Evidence: evidenceAny}, nil
    47  }
    48  
    49  // AllEvidence implements the Query/AllEvidence gRPC method
    50  func (k Keeper) AllEvidence(c context.Context, req *types.QueryAllEvidenceRequest) (*types.QueryAllEvidenceResponse, error) {
    51  	if req == nil {
    52  		return nil, status.Errorf(codes.InvalidArgument, "empty request")
    53  	}
    54  	ctx := sdk.UnwrapSDKContext(c)
    55  
    56  	k.GetAllEvidence(ctx)
    57  
    58  	var evidence []*codectypes.Any
    59  	store := ctx.KVStore(k.storeKey)
    60  	evidenceStore := prefix.NewStore(store, types.KeyPrefixEvidence)
    61  
    62  	pageRes, err := query.Paginate(evidenceStore, req.Pagination, func(key, value []byte) error {
    63  		result, err := k.UnmarshalEvidence(value)
    64  		if err != nil {
    65  			return err
    66  		}
    67  
    68  		msg, ok := result.(proto.Message)
    69  		if !ok {
    70  			return status.Errorf(codes.Internal, "can't protomarshal %T", msg)
    71  		}
    72  
    73  		evidenceAny, err := codectypes.NewAnyWithValue(msg)
    74  		if err != nil {
    75  			return err
    76  		}
    77  		evidence = append(evidence, evidenceAny)
    78  		return nil
    79  	})
    80  	if err != nil {
    81  		return &types.QueryAllEvidenceResponse{}, err
    82  	}
    83  
    84  	return &types.QueryAllEvidenceResponse{Evidence: evidence, Pagination: pageRes}, nil
    85  }