Show a post
In this chapter, you will implement a feature in your blogging application that enables users to retrieve individual blog posts by their unique ID. This ID is assigned to each blog post when it is created and stored on the blockchain. By adding this querying functionality, users will be able to easily retrieve specific blog posts by specifying their ID.
Show post
Let's implement the ShowPost
keeper method that will be called when a user
makes a query to the blockchain application, specifying the ID of the desired
post.
package keeper
import (
"context"
"blog/x/blog/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
func (k Keeper) ShowPost(goCtx context.Context, req *types.QueryShowPostRequest) (*types.QueryShowPostResponse, error) {
if req == nil {
return nil, status.Error(codes.InvalidArgument, "invalid request")
}
ctx := sdk.UnwrapSDKContext(goCtx)
post, found := k.GetPost(ctx, req.Id)
if !found {
return nil, sdkerrors.ErrKeyNotFound
}
return &types.QueryShowPostResponse{Post: post}, nil
}
ShowPost
is a function for retrieving a single post object from the
blockchain's state. It takes in two arguments: a context.Context
object called
goCtx
and a pointer to a types.QueryShowPostRequest
object called req
. It
returns a pointer to a types.QueryShowPostResponse
object and an error
.
The function first checks if the req
argument is nil
. If it is, it returns
an error
with the code InvalidArgument
and the message "invalid request"
using the status.Error
function from the google.golang.org/grpc/status
package.
If the req
argument is not nil
, the function unwraps the sdk.Context
object from the context.Context
object using the sdk.UnwrapSDKContext
function. It then retrieves a post object with the specified Id
from the
blockchain's state using the GetPost
function, and checks if the post was
found by checking the value of the found
boolean variable. If the post was not
found, it returns an error with the type sdkerrors.ErrKeyNotFound
.
If the post was found, the function creates a new types.QueryShowPostResponse
object with the retrieved post object as a field, and returns a pointer to this
object and a nil
error.
Modify QueryShowPostResponse
Include the option [(gogoproto.nullable) = false]
in the post
field in the
QueryShowPostResponse
message to generate the field without a pointer.
message QueryShowPostResponse {
Post post = 1 [(gogoproto.nullable) = false];
}
Run the command to generate Go files from proto:
ignite generate proto-go