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

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