Updating resources according to instructions

This commit is contained in:
Brandon Watson
2023-08-14 21:03:23 -05:00
parent bdb7a39a91
commit a290cd1420
9 changed files with 89 additions and 108 deletions

View File

@ -5,23 +5,24 @@ import (
) )
var Item = Type("item", func() { var Item = Type("item", func() {
Field(1, "id", Int) Field(1, "name", String)
Field(2, "name", String) Field(2, "description", String)
Field(3, "description", String) Field(3, "damage", Int)
Field(4, "multiplier", String) Field(4, "healing", Int)
Field(5, "type", String) Field(5, "protection", Int)
Required("name", "description", "multiplier", "type") Required("name", "description", "damage", "healing", "protection")
}) })
var Character = Type("character", func() { var Character = Type("character", func() {
Field(1, "id", Int) Field(1, "name", String)
Field(2, "name", String) Field(2, "description", String)
Field(3, "description", String) Field(3, "health", Int)
Field(4, "class", String) Field(4, "experience", Int)
Required("name", "description", "class") Required("name", "description", "health", "experience")
}) })
var InventoryRecord = Type("inventoryRecord", func() { var InventoryRecord = Type("inventoryRecord", func() {
Field(1, "characterId", Int) Field(1, "characterName", String)
Field(2, "itemId", Int) Field(2, "itemName", String)
Required("characterName", "itemName")
}) })

View File

@ -11,12 +11,12 @@ import (
// The example methods log the requests and return zero values. // The example methods log the requests and return zero values.
type charactersrvc struct { type charactersrvc struct {
logger *log.Logger logger *log.Logger
characters map[int]*character.Character characters map[string]*character.Character
} }
// NewCharacter returns the character service implementation. // NewCharacter returns the character service implementation.
func NewCharacter(logger *log.Logger) character.Service { func NewCharacter(logger *log.Logger) character.Service {
characterMap := make(map[int]*character.Character) characterMap := make(map[string]*character.Character)
return &charactersrvc{logger, characterMap} return &charactersrvc{logger, characterMap}
} }
@ -24,12 +24,12 @@ func NewCharacter(logger *log.Logger) character.Service {
func (s *charactersrvc) GetCharacter(ctx context.Context, p *character.GetCharacterPayload) (res *character.Character, err error) { func (s *charactersrvc) GetCharacter(ctx context.Context, p *character.GetCharacterPayload) (res *character.Character, err error) {
s.logger.Print("character.getCharacter") s.logger.Print("character.getCharacter")
itemToGet := s.characters[*p.ID] itemToGet := s.characters[*p.Name]
if itemToGet == nil { if itemToGet == nil {
s.logger.Printf("character with id %d not found", &p.ID) s.logger.Printf("character with id %d not found", &p.Name)
return nil, errors.New("character not found") return nil, errors.New("character not found")
} }
res = s.characters[*p.ID] res = s.characters[*p.Name]
return return
} }
@ -44,19 +44,8 @@ func (s *charactersrvc) ListCharacters(ctx context.Context) (res []*character.Ch
// CreateCharacter implements createCharacter. // CreateCharacter implements createCharacter.
func (s *charactersrvc) CreateCharacter(ctx context.Context, p *character.Character) (res *character.Character, err error) { func (s *charactersrvc) CreateCharacter(ctx context.Context, p *character.Character) (res *character.Character, err error) {
s.logger.Print("character.createCharacter") s.logger.Print("character.createCharacter")
id := -1 s.characters[p.Name] = p
res = s.characters[p.Name]
// Using this method of assigning IDs means they will
// potentially be non-sequential if ids are deleted
if p.ID != nil {
id = *p.ID
} else {
id = len(s.characters)
}
p.ID = &id
s.characters[id] = p
res = s.characters[id]
return return
} }
@ -64,13 +53,13 @@ func (s *charactersrvc) CreateCharacter(ctx context.Context, p *character.Charac
func (s *charactersrvc) UpdateCharacter(ctx context.Context, p *character.Character) (res *character.Character, err error) { func (s *charactersrvc) UpdateCharacter(ctx context.Context, p *character.Character) (res *character.Character, err error) {
s.logger.Print("character.updateCharacter") s.logger.Print("character.updateCharacter")
itemToUpdate := s.characters[*p.ID] itemToUpdate := s.characters[p.Name]
if itemToUpdate == nil { if itemToUpdate == nil {
s.logger.Printf("characters with id %d not found", &p.ID) s.logger.Printf("characters with id %d not found", &p.Name)
return nil, errors.New("characters not found") return nil, errors.New("characters not found")
} }
s.characters[*p.ID] = p s.characters[p.Name] = p
res = s.characters[*p.ID] res = s.characters[p.Name]
return return
} }
@ -79,13 +68,13 @@ func (s *charactersrvc) UpdateCharacter(ctx context.Context, p *character.Charac
func (s *charactersrvc) DeleteCharacter(ctx context.Context, p *character.DeleteCharacterPayload) (err error) { func (s *charactersrvc) DeleteCharacter(ctx context.Context, p *character.DeleteCharacterPayload) (err error) {
s.logger.Print("character.deleteCharacter") s.logger.Print("character.deleteCharacter")
itemToDelete := s.characters[*p.ID] itemToDelete := s.characters[*p.Name]
if itemToDelete == nil { if itemToDelete == nil {
s.logger.Printf("characters with id %d not found", &p.ID) s.logger.Printf("characters with id %d not found", &p.Name)
return errors.New("characters not found") return errors.New("characters not found")
} }
delete(s.characters, *p.ID) delete(s.characters, *p.Name)
return return
} }

View File

@ -20,7 +20,7 @@ var _ = Service("character", func() {
Method("getCharacter", func() { Method("getCharacter", func() {
Payload(func() { Payload(func() {
Field(1, "id", Int) Field(1, "name", String)
}) })
Result(Character) Result(Character)
Error("NotFound") Error("NotFound")
@ -70,7 +70,7 @@ var _ = Service("character", func() {
Method("deleteCharacter", func() { Method("deleteCharacter", func() {
Payload(func() { Payload(func() {
Field(1, "id", Int) Field(1, "name", String)
}) })
Result(Empty) Result(Empty)
Error("NotFound") Error("NotFound")

View File

@ -20,12 +20,12 @@ var _ = Service("front", func() {
Description("A GRPC back service that handles CRUD operations for the Items that exist and their attributes") Description("A GRPC back service that handles CRUD operations for the Items that exist and their attributes")
Method("getItem", func() { Method("getItem", func() {
Payload(Int) Payload(String)
Result(Item) Result(Item)
Error("NotFound") Error("NotFound")
HTTP(func() { HTTP(func() {
GET("/item/{id}") GET("/item/{name}")
Response(StatusOK) Response(StatusOK)
Response(StatusBadRequest) Response(StatusBadRequest)
Response(StatusNotFound) Response(StatusNotFound)
@ -63,7 +63,7 @@ var _ = Service("front", func() {
Error("BadRequest") Error("BadRequest")
HTTP(func() { HTTP(func() {
PUT("/item/{id}") PUT("/item/{name}")
Response(StatusOK) Response(StatusOK)
Response(StatusBadRequest) Response(StatusBadRequest)
Response(StatusNotFound) Response(StatusNotFound)
@ -71,13 +71,13 @@ var _ = Service("front", func() {
}) })
Method("deleteItem", func() { Method("deleteItem", func() {
Payload(Int) Payload(String)
Result(Empty) Result(Empty)
Error("NotFound") Error("NotFound")
Error("BadRequest") Error("BadRequest")
HTTP(func() { HTTP(func() {
DELETE("/item/{id}") DELETE("/item/{name}")
Response(StatusOK) Response(StatusOK)
Response(StatusBadRequest) Response(StatusBadRequest)
Response(StatusNotFound) Response(StatusNotFound)
@ -85,13 +85,13 @@ var _ = Service("front", func() {
}) })
Method("getCharacter", func() { Method("getCharacter", func() {
Payload(Int) Payload(String)
Result(Character) Result(Character)
Error("NotFound") Error("NotFound")
Error("BadRequest") Error("BadRequest")
HTTP(func() { HTTP(func() {
GET("/character/{id}") GET("/character/{name}")
Response(StatusOK) Response(StatusOK)
Response(StatusBadRequest) Response(StatusBadRequest)
Response(StatusNotFound) Response(StatusNotFound)
@ -131,7 +131,7 @@ var _ = Service("front", func() {
Error("BadRequest") Error("BadRequest")
HTTP(func() { HTTP(func() {
PUT("/character/{id}") PUT("/character/{name}")
Response(StatusOK) Response(StatusOK)
Response(StatusBadRequest) Response(StatusBadRequest)
Response(StatusNotFound) Response(StatusNotFound)
@ -139,13 +139,13 @@ var _ = Service("front", func() {
}) })
Method("deleteCharacter", func() { Method("deleteCharacter", func() {
Payload(Int) Payload(String)
Result(Empty) Result(Empty)
Error("NotFound") Error("NotFound")
Error("BadRequest") Error("BadRequest")
HTTP(func() { HTTP(func() {
DELETE("/character/{id}") DELETE("/character/{name}")
Response(StatusOK) Response(StatusOK)
Response(StatusBadRequest) Response(StatusBadRequest)
Response(StatusNotFound) Response(StatusNotFound)
@ -159,7 +159,7 @@ var _ = Service("front", func() {
Error("BadRequest") Error("BadRequest")
HTTP(func() { HTTP(func() {
POST("/character/{characterId}/item") POST("/character/{characterName}/item")
Response(StatusOK) Response(StatusOK)
Response(StatusBadRequest) Response(StatusBadRequest)
}) })
@ -172,7 +172,7 @@ var _ = Service("front", func() {
Error("BadRequest") Error("BadRequest")
HTTP(func() { HTTP(func() {
DELETE("/character/{characterId}/item/{itemId}") DELETE("/character/{characterName}/item/{itemName}")
Response(StatusOK) Response(StatusOK)
Response(StatusBadRequest) Response(StatusBadRequest)
}) })
@ -180,12 +180,12 @@ var _ = Service("front", func() {
Method("listInventoryItems", func() { Method("listInventoryItems", func() {
Payload(func() { Payload(func() {
Field(1, "characterId", Int) Field(1, "characterName", String)
}) })
Result(ArrayOf(Item)) Result(ArrayOf(Item))
HTTP(func() { HTTP(func() {
GET("/character/{characterId}/item") GET("/character/{characterName}/item")
Response(StatusOK) Response(StatusOK)
Response(StatusBadRequest) Response(StatusBadRequest)
Response(StatusNotFound) Response(StatusNotFound)

View File

@ -75,9 +75,9 @@ func NewFront(logger *log.Logger, itemClientConnection *grpc.ClientConn, charact
} }
// GetItem implements getItem. // GetItem implements getItem.
func (s *frontsrvc) GetItem(ctx context.Context, id int) (res *front.Item, err error) { func (s *frontsrvc) GetItem(ctx context.Context, name string) (res *front.Item, err error) {
s.logger.Print("front.getItem") s.logger.Print("front.getItem")
getItemResponse, err := s.itemClient.getItem(ctx, &genItem.GetItemPayload{ID: &id}) getItemResponse, err := s.itemClient.getItem(ctx, &genItem.GetItemPayload{Name: &name})
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -127,9 +127,9 @@ func (s *frontsrvc) UpdateItem(ctx context.Context, p *front.Item) (res *front.I
} }
// DeleteItem implements deleteItem. // DeleteItem implements deleteItem.
func (s *frontsrvc) DeleteItem(ctx context.Context, p int) (err error) { func (s *frontsrvc) DeleteItem(ctx context.Context, p string) (err error) {
s.logger.Print("front.deleteItem") s.logger.Print("front.deleteItem")
_, err = s.itemClient.deleteItem(ctx, &genItem.DeleteItemPayload{ID: &p}) _, err = s.itemClient.deleteItem(ctx, &genItem.DeleteItemPayload{Name: &p})
if err != nil { if err != nil {
return err return err
} }
@ -138,9 +138,9 @@ func (s *frontsrvc) DeleteItem(ctx context.Context, p int) (err error) {
} }
// GetCharacter implements getCharacter. // GetCharacter implements getCharacter.
func (s *frontsrvc) GetCharacter(ctx context.Context, id int) (res *front.Character, err error) { func (s *frontsrvc) GetCharacter(ctx context.Context, name string) (res *front.Character, err error) {
s.logger.Print("front.getCharacter") s.logger.Print("front.getCharacter")
getCharacterResponse, err := s.characterClient.getCharacter(ctx, &genCharacter.GetCharacterPayload{ID: &id}) getCharacterResponse, err := s.characterClient.getCharacter(ctx, &genCharacter.GetCharacterPayload{Name: &name})
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -191,10 +191,10 @@ func (s *frontsrvc) UpdateCharacter(ctx context.Context, p *front.Character) (re
} }
// DeleteCharacter implements deleteCharacter. // DeleteCharacter implements deleteCharacter.
func (s *frontsrvc) DeleteCharacter(ctx context.Context, p int) (err error) { func (s *frontsrvc) DeleteCharacter(ctx context.Context, name string) (err error) {
s.logger.Print("front.deleteCharacter") s.logger.Print("front.deleteCharacter")
_, err = s.characterClient.deleteCharacter(ctx, &genCharacter.DeleteCharacterPayload{ID: &p}) _, err = s.characterClient.deleteCharacter(ctx, &genCharacter.DeleteCharacterPayload{Name: &name})
if err != nil { if err != nil {
return err return err
} }

View File

@ -18,9 +18,9 @@ var _ = Service("inventory", func() {
Description("A GRPC back service that handles CRUD operations for the characters inventories") Description("A GRPC back service that handles CRUD operations for the characters inventories")
Method("listInventory", func() { Method("listInventory", func() {
Payload(func() { Payload(func() {
Field(1, "characterId", Int) Field(1, "characterName", String)
}) })
Result(ArrayOf(Int)) Result(ArrayOf(String))
GRPC(func() { GRPC(func() {
Response(CodeOK) Response(CodeOK)

View File

@ -11,12 +11,12 @@ import (
// The example methods log the requests and return zero values. // The example methods log the requests and return zero values.
type inventorysrvc struct { type inventorysrvc struct {
logger *log.Logger logger *log.Logger
inventories map[int]*[]int //key = characterId, value = array of itemIds inventories map[string]*[]string //key = characterId, value = array of itemIds
} }
// NewInventory returns the inventory service implementation. // NewInventory returns the inventory service implementation.
func NewInventory(logger *log.Logger) inventory.Service { func NewInventory(logger *log.Logger) inventory.Service {
inventoryMap := make(map[int]*[]int) inventoryMap := make(map[string]*[]string)
return &inventorysrvc{logger, inventoryMap} return &inventorysrvc{logger, inventoryMap}
} }
@ -24,12 +24,12 @@ func NewInventory(logger *log.Logger) inventory.Service {
func (s *inventorysrvc) AddItem(ctx context.Context, p *inventory.InventoryRecord) (err error) { func (s *inventorysrvc) AddItem(ctx context.Context, p *inventory.InventoryRecord) (err error) {
s.logger.Print("inventory.addItem") s.logger.Print("inventory.addItem")
itemList := s.inventories[*p.CharacterID] itemList := s.inventories[p.CharacterName]
if itemList == nil { if itemList == nil {
itemList = s.initCharacterInventory(p.CharacterID) itemList = s.initCharacterInventory(p.CharacterName)
} }
newItemList := append(*itemList, *p.ItemID) newItemList := append(*itemList, p.ItemName)
s.inventories[*p.CharacterID] = &newItemList s.inventories[p.CharacterName] = &newItemList
return return
} }
@ -38,38 +38,38 @@ func (s *inventorysrvc) AddItem(ctx context.Context, p *inventory.InventoryRecor
func (s *inventorysrvc) RemoveItem(ctx context.Context, p *inventory.InventoryRecord) (err error) { func (s *inventorysrvc) RemoveItem(ctx context.Context, p *inventory.InventoryRecord) (err error) {
s.logger.Print("inventory.removeItem") s.logger.Print("inventory.removeItem")
itemList := s.inventories[*p.CharacterID] itemList := s.inventories[p.CharacterName]
if itemList == nil { if itemList == nil {
s.logger.Printf("inventory for character with id %d not found", p.CharacterID) s.logger.Printf("inventory for character with id %d not found", p.CharacterName)
return errors.New("item not found") return errors.New("item not found")
} }
idx := indexOf(*p.ItemID, *itemList) idx := indexOf(p.ItemName, *itemList)
if idx != -1 { if idx != -1 {
newItemList := remove(*itemList, idx) newItemList := remove(*itemList, idx)
s.inventories[*p.CharacterID] = &newItemList s.inventories[p.CharacterName] = &newItemList
} else { } else {
s.logger.Printf("character with id %d does not have item %d in inventory", &p.CharacterID, &p.ItemID) s.logger.Printf("character with id %d does not have item %d in inventory", p.CharacterName, p.ItemName)
return errors.New("item not found for character") return errors.New("item not found for character")
} }
return return
} }
func (s *inventorysrvc) ListInventory(ctx context.Context, payload *inventory.ListInventoryPayload) (res []int, err error) { func (s *inventorysrvc) ListInventory(ctx context.Context, payload *inventory.ListInventoryPayload) (res []string, err error) {
res = *s.inventories[*payload.CharacterID] res = *s.inventories[*payload.CharacterName]
return return
} }
func (s *inventorysrvc) initCharacterInventory(characterId *int) (itemList *[]int) { func (s *inventorysrvc) initCharacterInventory(characterName string) (itemList *[]string) {
list := make([]int, 0) list := make([]string, 0)
itemList = &list itemList = &list
s.inventories[*characterId] = &list s.inventories[characterName] = itemList
return return
} }
func indexOf(element int, data []int) int { func indexOf(element string, data []string) int {
for k, v := range data { for k, v := range data {
if element == v { if element == v {
return k return k
@ -78,7 +78,7 @@ func indexOf(element int, data []int) int {
return -1 //not found. return -1 //not found.
} }
func remove(s []int, i int) []int { func remove(s []string, i int) []string {
s[i] = s[len(s)-1] s[i] = s[len(s)-1]
return s[:len(s)-1] return s[:len(s)-1]
} }

View File

@ -20,7 +20,7 @@ var _ = Service("item", func() {
Method("getItem", func() { Method("getItem", func() {
Payload(func() { Payload(func() {
Field(1, "id", Int) Field(1, "name", String)
}) })
Result(Item) Result(Item)
Error("NotFound") Error("NotFound")
@ -62,7 +62,7 @@ var _ = Service("item", func() {
Method("deleteItem", func() { Method("deleteItem", func() {
Payload(func() { Payload(func() {
Field(1, "id", Int) Field(1, "name", String)
}) })
Result(Empty) Result(Empty)
Error("NotFound") Error("NotFound")

View File

@ -11,12 +11,12 @@ import (
// The example methods log the requests and return zero values. // The example methods log the requests and return zero values.
type itemsrvc struct { type itemsrvc struct {
logger *log.Logger logger *log.Logger
items map[int]*item.Item items map[string]*item.Item
} }
// NewItem returns the item service implementation. // NewItem returns the item service implementation.
func NewItem(logger *log.Logger) item.Service { func NewItem(logger *log.Logger) item.Service {
itemsMap := make(map[int]*item.Item) itemsMap := make(map[string]*item.Item)
return &itemsrvc{logger, itemsMap} return &itemsrvc{logger, itemsMap}
} }
@ -24,12 +24,12 @@ func NewItem(logger *log.Logger) item.Service {
func (s *itemsrvc) GetItem(ctx context.Context, p *item.GetItemPayload) (res *item.Item, err error) { func (s *itemsrvc) GetItem(ctx context.Context, p *item.GetItemPayload) (res *item.Item, err error) {
s.logger.Print("itemToGet.getItem") s.logger.Print("itemToGet.getItem")
itemToGet := s.items[*p.ID] itemToGet := s.items[*p.Name]
if itemToGet == nil { if itemToGet == nil {
s.logger.Printf("item with id %d not found", &p.ID) s.logger.Printf("item with id %d not found", &p.Name)
return nil, errors.New("item not found") return nil, errors.New("item not found")
} }
res = s.items[*p.ID] res = s.items[*p.Name]
return return
} }
@ -44,19 +44,10 @@ func (s *itemsrvc) ListItems(ctx context.Context) (res []*item.Item, err error)
// CreateItem implements createItem. // CreateItem implements createItem.
func (s *itemsrvc) CreateItem(ctx context.Context, p *item.Item) (res *item.Item, err error) { func (s *itemsrvc) CreateItem(ctx context.Context, p *item.Item) (res *item.Item, err error) {
s.logger.Print("item.createItem") s.logger.Print("item.createItem")
id := -1 name := p.Name
// Using this method of assigning IDs means they will s.items[name] = p
// potentially be non-sequential if ids are deleted res = s.items[name]
if p.ID != nil {
id = *p.ID
} else {
id = len(s.items)
}
p.ID = &id
s.items[id] = p
res = s.items[id]
return return
} }
@ -64,13 +55,13 @@ func (s *itemsrvc) CreateItem(ctx context.Context, p *item.Item) (res *item.Item
// UpdateItem implements updateItem. // UpdateItem implements updateItem.
func (s *itemsrvc) UpdateItem(ctx context.Context, p *item.Item) (res *item.Item, err error) { func (s *itemsrvc) UpdateItem(ctx context.Context, p *item.Item) (res *item.Item, err error) {
s.logger.Print("itemToGet.updateItem") s.logger.Print("itemToGet.updateItem")
itemToUpdate := s.items[*p.ID] itemToUpdate := s.items[p.Name]
if itemToUpdate == nil { if itemToUpdate == nil {
s.logger.Printf("item with id %d not found", &p.ID) s.logger.Printf("item with id %d not found", &p.Name)
return nil, errors.New("item not found") return nil, errors.New("item not found")
} }
s.items[*p.ID] = p s.items[p.Name] = p
res = s.items[*p.ID] res = s.items[p.Name]
return return
} }
@ -78,13 +69,13 @@ func (s *itemsrvc) UpdateItem(ctx context.Context, p *item.Item) (res *item.Item
// DeleteItem implements deleteItem. // DeleteItem implements deleteItem.
func (s *itemsrvc) DeleteItem(ctx context.Context, p *item.DeleteItemPayload) (err error) { func (s *itemsrvc) DeleteItem(ctx context.Context, p *item.DeleteItemPayload) (err error) {
s.logger.Print("item.deleteItem") s.logger.Print("item.deleteItem")
itemToDelete := s.items[*p.ID] itemToDelete := s.items[*p.Name]
if itemToDelete == nil { if itemToDelete == nil {
s.logger.Printf("item with id %d not found", &p.ID) s.logger.Printf("item with id %d not found", &p.Name)
return errors.New("item not found") return errors.New("item not found")
} }
delete(s.items, *p.ID) delete(s.items, *p.Name)
return return
} }