Fixing bug where items were allowed to be deleted when referenced by a character
This commit is contained in:
@ -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)
|
||||
})
|
||||
})
|
||||
|
||||
|
@ -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})
|
||||
|
Reference in New Issue
Block a user