Fixing bug where items were allowed to be deleted when referenced by a character

This commit is contained in:
2023-08-15 19:22:07 -05:00
parent abce265ba5
commit 5b9e100028
4 changed files with 85 additions and 5 deletions

View File

@ -69,11 +69,13 @@ var _ = Service("front", func() {
Payload(String)
Result(Empty)
Error("NotFound")
Error("BadRequest")
HTTP(func() {
DELETE("/item/{name}")
Response(StatusOK)
Response("NotFound", StatusNotFound)
Response("BadRequest", StatusBadRequest)
})
})

View File

@ -10,6 +10,7 @@ import (
genItemClient "crossnokaye-interview-assignment/services/item/gen/grpc/item/client"
genItem "crossnokaye-interview-assignment/services/item/gen/item"
"errors"
"fmt"
"github.com/golang/protobuf/ptypes/empty"
goa "goa.design/goa/v3/pkg"
"google.golang.org/grpc"
@ -33,9 +34,11 @@ type characterClient struct {
}
type inventoryClient struct {
addItem goa.Endpoint
removeItem goa.Endpoint
listInventoryItems goa.Endpoint
addItem goa.Endpoint
removeItem goa.Endpoint
removeAll goa.Endpoint
listInventoryItems goa.Endpoint
listCharactersWithItem goa.Endpoint
}
// front service example implementation.
@ -71,7 +74,9 @@ func NewFront(logger *log.Logger, itemClientConnection *grpc.ClientConn, charact
inventoryClient: &inventoryClient{
icc.AddItem(),
icc.RemoveItem(),
icc.RemoveAll(),
icc.ListInventory(),
icc.ListCharactersWithItem(),
}}
}
@ -130,6 +135,18 @@ func (s *frontsrvc) UpdateItem(ctx context.Context, p *front.Item) (res *front.I
// DeleteItem implements deleteItem.
func (s *frontsrvc) DeleteItem(ctx context.Context, p string) (err error) {
s.logger.Print("front.deleteItem")
characterResponse, err := s.inventoryClient.listCharactersWithItem(ctx, &genInventory.ListCharactersWithItemPayload{ItemName: &p})
if err != nil {
return err
}
characters := characterResponse.([]string)
if len(characters) > 0 {
return front.MakeBadRequest(fmt.Errorf("item '%s' is referenced by character(s) %v", p, characters))
}
_, err = s.itemClient.deleteItem(ctx, &genItem.DeleteItemPayload{Name: &p})
if err != nil {
return err
@ -200,6 +217,11 @@ func (s *frontsrvc) DeleteCharacter(ctx context.Context, name string) (err error
return err
}
_, err = s.inventoryClient.removeAll(ctx, &genInventory.RemoveAllPayload{CharacterName: &name})
if err != nil {
return err
}
return
}
@ -245,7 +267,7 @@ func (s *frontsrvc) ListInventoryItems(ctx context.Context, payload *front.ListI
}
itemNames := listInventoryResponse.([]string)
if itemNames == nil {
if len(itemNames) == 0 {
return
}
itemResponse, err := s.itemClient.listItems(ctx, &genItem.ListItemsPayload{NameFilter: itemNames})