Implemented first pass of character and inventory services

This commit is contained in:
Brandon Watson
2023-08-14 19:22:40 -05:00
parent a9eed6f284
commit 6799b59f9c
9 changed files with 232 additions and 57 deletions

View File

@ -3,28 +3,76 @@ package inventoryapi
import (
"context"
inventory "crossnokaye-interview-assignment/services/inventory/gen/inventory"
"errors"
"log"
)
// inventory service example implementation.
// The example methods log the requests and return zero values.
type inventorysrvc struct {
logger *log.Logger
logger *log.Logger
inventories map[int]*[]int //key = characterId, value = array of itemIds
}
// NewInventory returns the inventory service implementation.
func NewInventory(logger *log.Logger) inventory.Service {
return &inventorysrvc{logger}
inventoryMap := make(map[int]*[]int)
return &inventorysrvc{logger, inventoryMap}
}
// AddItem implements addItem.
func (s *inventorysrvc) AddItem(ctx context.Context, p int) (err error) {
func (s *inventorysrvc) AddItem(ctx context.Context, p *inventory.InventoryRecord) (err error) {
s.logger.Print("inventory.addItem")
itemList := s.inventories[*p.CharacterID]
if itemList == nil {
itemList = s.initCharacterInventory(p.CharacterID)
}
newItemList := append(*itemList, *p.ItemID)
s.inventories[*p.CharacterID] = &newItemList
return
}
// RemoveItem implements removeItem.
func (s *inventorysrvc) RemoveItem(ctx context.Context, p int) (err error) {
func (s *inventorysrvc) RemoveItem(ctx context.Context, p *inventory.InventoryRecord) (err error) {
s.logger.Print("inventory.removeItem")
itemList := s.inventories[*p.CharacterID]
if itemList == nil {
s.logger.Printf("inventory for character with id %d not found", p.CharacterID)
return errors.New("item not found")
}
idx := indexOf(*p.ItemID, *itemList)
if idx != -1 {
newItemList := remove(*itemList, idx)
s.inventories[*p.CharacterID] = &newItemList
} else {
s.logger.Printf("character with id %d does not have item %d in inventory", &p.CharacterID, &p.ItemID)
return errors.New("item not found for character")
}
return
}
func (s *inventorysrvc) initCharacterInventory(characterId *int) (itemList *[]int) {
list := make([]int, 0)
itemList = &list
s.inventories[*characterId] = &list
return
}
func indexOf(element int, data []int) int {
for k, v := range data {
if element == v {
return k
}
}
return -1 //not found.
}
func remove(s []int, i int) []int {
s[i] = s[len(s)-1]
return s[:len(s)-1]
}