95 lines
2.5 KiB
Go
95 lines
2.5 KiB
Go
package itemapi
|
|
|
|
import (
|
|
"context"
|
|
item "crossnokaye-interview-assignment/services/item/gen/item"
|
|
"fmt"
|
|
"log"
|
|
)
|
|
|
|
// item service example implementation.
|
|
// The example methods log the requests and return zero values.
|
|
type itemsrvc struct {
|
|
logger *log.Logger
|
|
items *map[string]*item.Item
|
|
}
|
|
|
|
// NewItem returns the item service implementation.
|
|
func NewItem(logger *log.Logger) item.Service {
|
|
itemsMap := make(map[string]*item.Item)
|
|
return &itemsrvc{logger, &itemsMap}
|
|
}
|
|
|
|
// GetItem implements getItem.
|
|
func (s *itemsrvc) GetItem(ctx context.Context, p *item.GetItemPayload) (res *item.Item, err error) {
|
|
s.logger.Print("itemToGet.getItem")
|
|
|
|
itemToGet := (*s.items)[*p.Name]
|
|
if itemToGet == nil {
|
|
s.logger.Printf("item with name '%s' not found", *p.Name)
|
|
return nil, item.MakeNotFound(fmt.Errorf("item with name '%s' not found", *p.Name))
|
|
}
|
|
res = (*s.items)[*p.Name]
|
|
|
|
return
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
// CreateItem implements createItem.
|
|
func (s *itemsrvc) CreateItem(ctx context.Context, p *item.Item) (res *item.Item, err error) {
|
|
s.logger.Print("item.createItem")
|
|
name := p.Name
|
|
|
|
existingItem := (*s.items)[name]
|
|
if existingItem != nil {
|
|
s.logger.Printf("item with name '%s' already exists", p.Name)
|
|
return nil, item.MakeAlreadyExists(fmt.Errorf("item with name '%s' already exists", p.Name))
|
|
}
|
|
|
|
(*s.items)[name] = p
|
|
res = (*s.items)[name]
|
|
|
|
return
|
|
}
|
|
|
|
// UpdateItem implements updateItem.
|
|
func (s *itemsrvc) UpdateItem(ctx context.Context, p *item.Item) (res *item.Item, err error) {
|
|
s.logger.Print("itemToGet.updateItem")
|
|
itemToUpdate := (*s.items)[p.Name]
|
|
if itemToUpdate == nil {
|
|
s.logger.Printf("item with name '%s' not found", p.Name)
|
|
return nil, item.MakeNotFound(fmt.Errorf("item with name '%s' not found", p.Name))
|
|
}
|
|
(*s.items)[p.Name] = p
|
|
res = (*s.items)[p.Name]
|
|
|
|
return
|
|
}
|
|
|
|
// DeleteItem implements deleteItem.
|
|
func (s *itemsrvc) DeleteItem(ctx context.Context, p *item.DeleteItemPayload) (err error) {
|
|
s.logger.Print("item.deleteItem")
|
|
itemToDelete := (*s.items)[*p.Name]
|
|
if itemToDelete == nil {
|
|
s.logger.Printf("item with name '%s' not found", *p.Name)
|
|
return item.MakeNotFound(fmt.Errorf("item with name '%s' not found", *p.Name))
|
|
}
|
|
|
|
delete(*s.items, *p.Name)
|
|
|
|
return
|
|
}
|