diff --git a/services/front/front.go b/services/front/front.go index d2df7b9..2c1cdff 100644 --- a/services/front/front.go +++ b/services/front/front.go @@ -9,6 +9,7 @@ import ( genInventory "crossnokaye-interview-assignment/services/inventory/gen/inventory" genItemClient "crossnokaye-interview-assignment/services/item/gen/grpc/item/client" genItem "crossnokaye-interview-assignment/services/item/gen/item" + "errors" "github.com/golang/protobuf/ptypes/empty" goa "goa.design/goa/v3/pkg" "google.golang.org/grpc" @@ -88,7 +89,7 @@ func (s *frontsrvc) GetItem(ctx context.Context, name string) (res *front.Item, func (s *frontsrvc) ListItems(ctx context.Context) (res []*front.Item, err error) { s.logger.Print("front.listItems") - listItemsResponse, err := s.itemClient.listItems(ctx, empty.Empty{}) + listItemsResponse, err := s.itemClient.listItems(ctx, &genItem.ListItemsPayload{}) if err != nil { return nil, err } @@ -205,6 +206,12 @@ func (s *frontsrvc) DeleteCharacter(ctx context.Context, name string) (err error // AddItemToInventory implements addItemToInventory. func (s *frontsrvc) AddItemToInventory(ctx context.Context, p *front.InventoryRecord) (err error) { s.logger.Print("front.addItemToInventory") + + err = s.checkItemAndCharacter(ctx, p) + if err != nil { + return err + } + _, err = s.inventoryClient.addItem(ctx, (*genInventory.InventoryRecord)(p)) if err != nil { return err @@ -216,6 +223,12 @@ func (s *frontsrvc) AddItemToInventory(ctx context.Context, p *front.InventoryRe // RemoveItemFromInventory implements removeItemFromInventory. func (s *frontsrvc) RemoveItemFromInventory(ctx context.Context, p *front.InventoryRecord) (err error) { s.logger.Print("front.removeItemFromInventory") + + err = s.checkItemAndCharacter(ctx, p) + if err != nil { + return err + } + _, err = s.inventoryClient.removeItem(ctx, (*genInventory.InventoryRecord)(p)) if err != nil { return err @@ -225,15 +238,47 @@ func (s *frontsrvc) RemoveItemFromInventory(ctx context.Context, p *front.Invent } func (s *frontsrvc) ListInventoryItems(ctx context.Context, payload *front.ListInventoryItemsPayload) (res []*front.Item, err error) { - //listInventoryResponse, err := s.inventoryClient.listInventoryItems(ctx, - // &genInventory.ListInventoryPayload{CharacterID: payload.CharacterID}) - //if err != nil { - // return nil, err - //} - // - //itemIds := listInventoryResponse.([]*int) - //for _, itemToReturn := range itemIds { - // res = append(frontCharacters, (*front.Character)(itemToReturn)) - //} + listInventoryResponse, err := s.inventoryClient.listInventoryItems(ctx, + &genInventory.ListInventoryPayload{CharacterName: payload.CharacterName}) + if err != nil { + return nil, err + } + + itemNames := listInventoryResponse.([]string) + if itemNames == nil { + return + } + itemResponse, err := s.itemClient.listItems(ctx, &genItem.ListItemsPayload{NameFilter: itemNames}) + if err != nil { + return nil, err + } + + items := itemResponse.([]*genItem.Item) + for _, value := range items { + res = append(res, (*front.Item)(value)) + } + + return +} + +func (s *frontsrvc) checkItemAndCharacter(ctx context.Context, payload *front.InventoryRecord) (err error) { + getItemResponse, err := s.itemClient.getItem(ctx, &genItem.GetItemPayload{Name: &payload.ItemName}) + if err != nil { + return err + } + + if getItemResponse.(*genItem.Item) == nil { + return errors.New("item not found") + } + + getCharacterResponse, err := s.characterClient.getCharacter(ctx, + &genCharacter.GetCharacterPayload{Name: &payload.CharacterName}) + if err != nil { + return err + } + + if getCharacterResponse.(*genCharacter.Character) == nil { + return errors.New("character not found") + } return } diff --git a/services/inventory/inventory.go b/services/inventory/inventory.go index e28ffc4..bb6d67c 100644 --- a/services/inventory/inventory.go +++ b/services/inventory/inventory.go @@ -57,6 +57,9 @@ func (s *inventorysrvc) RemoveItem(ctx context.Context, p *inventory.InventoryRe } func (s *inventorysrvc) ListInventory(ctx context.Context, payload *inventory.ListInventoryPayload) (res []string, err error) { + if s.inventories[*payload.CharacterName] == nil { + return nil, nil + } res = *s.inventories[*payload.CharacterName] return diff --git a/services/item/design/design.go b/services/item/design/design.go index b17669c..0f73237 100644 --- a/services/item/design/design.go +++ b/services/item/design/design.go @@ -31,7 +31,9 @@ var _ = Service("item", func() { }) Method("listItems", func() { - Payload(Empty) + Payload(func() { + Field(1, "nameFilter", ArrayOf(String)) + }) Result(ArrayOf(Item)) GRPC(func() { diff --git a/services/item/item.go b/services/item/item.go index 165b700..bf0d040 100644 --- a/services/item/item.go +++ b/services/item/item.go @@ -34,10 +34,17 @@ func (s *itemsrvc) GetItem(ctx context.Context, p *item.GetItemPayload) (res *it return } -func (s *itemsrvc) ListItems(ctx context.Context) (res []*item.Item, err error) { - for _, value := range s.items { - res = append(res, value) +func (s *itemsrvc) ListItems(ctx context.Context, payload *item.ListItemsPayload) (res []*item.Item, err error) { + if payload.NameFilter != nil { + for _, value := range payload.NameFilter { + res = append(res, s.items[value]) + } + } else { + for _, value := range s.items { + res = append(res, value) + } } + return }