In the last video, we made a start at implementing the first of our gRPC handler functions as well as implementing the database functions that back these handlers.
In this video, we are going to take this a step further and implement the AddRocket
gRPC handler so that we can test adding a Rocket to the database as well as test our previous GetRocket handler.
Our AddRocket Handler
// AddRocket - adds a rocket to the database
func (h Handler) AddRocket(ctx context.Context, req *rkt.AddRocketRequest) (*rkt.AddRocketResponse, error) {
log.Print("Add Rocket gRPC endpoint hit")
newRkt, err := h.RocketService.InsertRocket(ctx, rocket.Rocket{
ID: req.Rocket.Id,
Type: req.Rocket.Type,
Name: req.Rocket.Name,
})
if err != nil {
log.Print("failed to insert rocket into database")
return &rkt.AddRocketResponse{}, err
}
return &rkt.AddRocketResponse{
Rocket: &rkt.Rocket{
Id: newRkt.ID,
Type: newRkt.Type,
Name: newRkt.Name,
},
}, nil
}
Our DB Package Updates:
// InsertRocket - inserts a rocket into the rockets table
func (s Store) InsertRocket(rkt rocket.Rocket) (rocket.Rocket, error) {
_, err := s.db.NamedQuery(
`INSERT INTO rockets
(id, name, type)
VALUES (:id, :name, :type)`,
rkt,
)
if err != nil {
return rocket.Rocket{}, errors.New("failed to insert into database")
}
return rocket.Rocket{
ID: rkt.ID,
Type: rkt.Type,
Name: rkt.Name,
}, nil
}
Testing with BloomRPC
Let’s navigate into BloomRPC and import our rocket.proto
file from the Protobuf monorepo and then attempt both an AddRocket
gRPC requests and then, using the ID from the AddRocket
request, let’s attempt a GetRocket
gRPC request.
Updating our GetRocket DB Method
// GetRocketByID - retrieves a rocket from the database by id
func (s Store) GetRocketByID(id string) (rocket.Rocket, error) {
var rkt rocket.Rocket
row := s.db.QueryRow(
`SELECT id, type, name FROM rockets where id=$1;`,
id,
)
err := row.Scan(&rkt.ID, &rkt.Type, &rkt.Name)
if err != nil {
log.Print(err.Error())
return rocket.Rocket{}, err
}
return rkt, nil
}
Conclusion
Awesome, we have now fully implemented the AddRocket
gRPC handler function and we have validated that we can both insert rockets into the database and retrieve the rockets based on their UUID.